The tests G added fold into existing ones as subtests (design 47 G §626, A-306: 171 tests down to 154, integration 9 down to 7). TestMeshWaitRefusesLoudlyAndNeverLoops runs its groups of one-second rows as parallel subtests, each on a runtime of its own, 15 s down to 5 s (A-311: the one-second floor of a wait's timeout stands, no clock is injected). The go.mod no longer requires meshconditionsclient, which no package loads (T4). Node names in the lines G adds are role names (T5). Builds: design 47 G §626, design 34 every-event §19, A-306, A-311; review round 2 findings T2, T3, T4, T5 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
79 lines
3.0 KiB
Go
79 lines
3.0 KiB
Go
package launch
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// puttingBundle asks the capability words, and once they are answered with put-sessions sends the one chunk of a put
|
|
// session, as mesh-sdk's bundle does; it then ends, which closes its channel.
|
|
const puttingBundle = `#!/bin/sh
|
|
while IFS= read -r line; do
|
|
id=$(printf '%s' "$line" | sed -n 's/.*"id":\([0-9]*\)[,}].*/\1/p')
|
|
case "$line" in
|
|
*'"method":"initialize"'*) printf '{"jsonrpc":"2.0","id":%s,"result":{}}\n' "$id" ;;
|
|
*'"method":"tools/list"'*) printf '{"jsonrpc":"2.0","id":%s,"result":{"tools":[]}}\n' "$id"
|
|
printf '{"jsonrpc":"2.0","id":"w1","method":"mesh/capabilities","params":{}}\n' ;;
|
|
*'"id":"w1"'**put-sessions*) printf '{"jsonrpc":"2.0","id":"p1","method":"mesh/objects.put-chunk","params":{"objects":"o","name":"n","call":"c","seq":1,"last":true,"data":"aGk="}}\n' ;;
|
|
*'"id":"p1"'*) exit 0 ;;
|
|
esac
|
|
done
|
|
`
|
|
|
|
type sessionBus struct {
|
|
subscribing
|
|
mu sync.Mutex
|
|
chunks []string
|
|
dropped chan struct{}
|
|
}
|
|
|
|
func (b *sessionBus) CapabilityWords() []string { return []string{"put-sessions"} }
|
|
func (b *sessionBus) BusState(method string, params json.RawMessage) (json.RawMessage, error) {
|
|
b.mu.Lock()
|
|
b.chunks = append(b.chunks, method+" "+string(params))
|
|
b.mu.Unlock()
|
|
return json.RawMessage(`{"name":"n"}`), nil
|
|
}
|
|
func (b *sessionBus) DropSessions() { close(b.dropped) }
|
|
|
|
// findingBundle asks, as mesh-sdk's finding writer does, a publish with ack that the bus takes, one it refuses, and a
|
|
// subscription for new messages; each answer it gets is written to $FINDING_OUT, and it ends after the subscription's.
|
|
const findingBundle = `#!/bin/sh
|
|
while IFS= read -r line; do
|
|
id=$(printf '%s' "$line" | sed -n 's/.*"id":\([0-9]*\)[,}].*/\1/p')
|
|
case "$line" in
|
|
*'"method":"initialize"'*) printf '{"jsonrpc":"2.0","id":%s,"result":{}}\n' "$id" ;;
|
|
*'"method":"tools/list"'*) printf '{"jsonrpc":"2.0","id":%s,"result":{"tools":[]}}\n' "$id"
|
|
printf '{"jsonrpc":"2.0","id":"a1","method":"mesh/publish","params":{"key":"taken","ack":true,"body":{}}}\n' ;;
|
|
*'"id":"a1"'*) printf '%s\n' "$line" >>"$FINDING_OUT"
|
|
printf '{"jsonrpc":"2.0","id":"a2","method":"mesh/publish","params":{"key":"refused","ack":true,"body":{}}}\n' ;;
|
|
*'"id":"a2"'*) printf '%s\n' "$line" >>"$FINDING_OUT"
|
|
printf '{"jsonrpc":"2.0","id":"s1","method":"mesh/subscribe","params":{"pattern":"mesh-conditions.findings-asked","deliver":"new"}}\n' ;;
|
|
*'"id":"s1"'*) printf '%s\n' "$line" >>"$FINDING_OUT"; exit 0 ;;
|
|
esac
|
|
done
|
|
`
|
|
|
|
type findingBus struct {
|
|
subscribing
|
|
mu sync.Mutex
|
|
pattern string
|
|
stopped chan struct{}
|
|
}
|
|
|
|
func (b *findingBus) PublishAcked(params json.RawMessage) (uint64, error) {
|
|
if strings.Contains(string(params), `"refused"`) {
|
|
return 0, errors.New("the bus refused it")
|
|
}
|
|
return 42, nil
|
|
}
|
|
|
|
func (b *findingBus) SubscribeNew(pattern string, _ func(json.RawMessage) error) (func(), error) {
|
|
b.mu.Lock()
|
|
b.pattern = pattern
|
|
b.mu.Unlock()
|
|
return func() { close(b.stopped) }, nil
|
|
}
|