@stateforge-labs/herdr 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +18 -0
  2. package/NOTICE.md +51 -0
  3. package/README.md +211 -2
  4. package/bin/herdr-drift.js +14 -0
  5. package/bin/herdr-skill.js +38 -0
  6. package/dist/admin.d.ts +2 -0
  7. package/dist/admin.js +3 -0
  8. package/dist/constants.d.ts +236 -0
  9. package/dist/constants.js +294 -0
  10. package/dist/core/backoff.d.ts +20 -0
  11. package/dist/core/backoff.js +53 -0
  12. package/dist/core/constants.d.ts +143 -0
  13. package/dist/core/constants.js +98 -0
  14. package/dist/core/errors.d.ts +35 -0
  15. package/dist/core/errors.js +16 -0
  16. package/dist/core/events.d.ts +42 -0
  17. package/dist/core/events.js +128 -0
  18. package/dist/core/kernel.d.ts +65 -0
  19. package/dist/core/kernel.js +138 -0
  20. package/dist/core/link.d.ts +47 -0
  21. package/dist/core/link.js +187 -0
  22. package/dist/core/test-kit/constants.d.ts +51 -0
  23. package/dist/core/test-kit/constants.js +43 -0
  24. package/dist/core/test-kit/fake-core.d.ts +61 -0
  25. package/dist/core/test-kit/fake-core.js +228 -0
  26. package/dist/core/test-kit/frames.d.ts +1 -0
  27. package/dist/core/test-kit/frames.js +480 -0
  28. package/dist/core/test-kit/setup-test.d.ts +18 -0
  29. package/dist/core/test-kit/setup-test.js +35 -0
  30. package/dist/core/wire.d.ts +85 -0
  31. package/dist/core/wire.js +199 -0
  32. package/dist/core-test-kit.d.ts +5 -0
  33. package/dist/core-test-kit.js +5 -0
  34. package/dist/core.d.ts +15 -0
  35. package/dist/core.js +12 -0
  36. package/dist/drift/cli.d.ts +22 -0
  37. package/dist/drift/cli.js +146 -0
  38. package/dist/drift/constants.d.ts +83 -0
  39. package/dist/drift/constants.js +73 -0
  40. package/dist/drift/diff.d.ts +7 -0
  41. package/dist/drift/diff.js +91 -0
  42. package/dist/drift/schema.d.ts +19 -0
  43. package/dist/drift/schema.js +190 -0
  44. package/dist/drift/types.d.ts +76 -0
  45. package/dist/drift/types.js +1 -0
  46. package/dist/drift.d.ts +5 -0
  47. package/dist/drift.js +6 -0
  48. package/dist/effect.d.ts +3 -0
  49. package/dist/effect.js +4 -0
  50. package/dist/herdr/client/connect.d.ts +5 -0
  51. package/dist/herdr/client/connect.js +81 -0
  52. package/dist/herdr/client/held.d.ts +54 -0
  53. package/dist/herdr/client/held.js +100 -0
  54. package/dist/herdr/client/long-poll.d.ts +33 -0
  55. package/dist/herdr/client/long-poll.js +66 -0
  56. package/dist/herdr/client/scoped.d.ts +45 -0
  57. package/dist/herdr/client/scoped.js +241 -0
  58. package/dist/herdr/client/streams.d.ts +9 -0
  59. package/dist/herdr/client/streams.js +40 -0
  60. package/dist/herdr/client/subscribe.d.ts +75 -0
  61. package/dist/herdr/client/subscribe.js +208 -0
  62. package/dist/herdr/client/types.d.ts +150 -0
  63. package/dist/herdr/client/types.js +1 -0
  64. package/dist/herdr/client/watch-pane-set.d.ts +34 -0
  65. package/dist/herdr/client/watch-pane-set.js +271 -0
  66. package/dist/herdr/client/watch.d.ts +117 -0
  67. package/dist/herdr/client/watch.js +138 -0
  68. package/dist/herdr/effect/to-tagged-error.d.ts +2 -0
  69. package/dist/herdr/effect/to-tagged-error.js +54 -0
  70. package/dist/herdr/effect/types.d.ts +51 -0
  71. package/dist/herdr/effect/types.js +26 -0
  72. package/dist/herdr/errors.d.ts +53 -0
  73. package/dist/herdr/errors.js +87 -0
  74. package/dist/herdr/generated/entries/admin.d.ts +2 -0
  75. package/dist/herdr/generated/entries/admin.js +5 -0
  76. package/dist/herdr/generated/entries/client.d.ts +2 -0
  77. package/dist/herdr/generated/entries/client.js +5 -0
  78. package/dist/herdr/generated/entries/held.d.ts +2 -0
  79. package/dist/herdr/generated/entries/held.js +5 -0
  80. package/dist/herdr/generated/entries/prompt.d.ts +2 -0
  81. package/dist/herdr/generated/entries/prompt.js +5 -0
  82. package/dist/herdr/generated/entries/read-only-content.d.ts +2 -0
  83. package/dist/herdr/generated/entries/read-only-content.js +5 -0
  84. package/dist/herdr/generated/entries/read-only.d.ts +2 -0
  85. package/dist/herdr/generated/entries/read-only.js +5 -0
  86. package/dist/herdr/generated/entry-methods.d.ts +9 -0
  87. package/dist/herdr/generated/entry-methods.js +17 -0
  88. package/dist/herdr/generated/errors.d.ts +4 -0
  89. package/dist/herdr/generated/errors.js +3 -0
  90. package/dist/herdr/generated/events.d.ts +274 -0
  91. package/dist/herdr/generated/events.js +3 -0
  92. package/dist/herdr/generated/index.d.ts +20 -0
  93. package/dist/herdr/generated/index.js +19 -0
  94. package/dist/herdr/generated/method-table.d.ts +615 -0
  95. package/dist/herdr/generated/method-table.js +106 -0
  96. package/dist/herdr/generated/names/agent-status.d.ts +10 -0
  97. package/dist/herdr/generated/names/agent-status.js +10 -0
  98. package/dist/herdr/generated/names/capability-class.d.ts +14 -0
  99. package/dist/herdr/generated/names/capability-class.js +15 -0
  100. package/dist/herdr/generated/names/event-kind.d.ts +31 -0
  101. package/dist/herdr/generated/names/event-kind.js +31 -0
  102. package/dist/herdr/generated/names/event-match-kind.d.ts +23 -0
  103. package/dist/herdr/generated/names/event-match-kind.js +24 -0
  104. package/dist/herdr/generated/names/index.d.ts +10 -0
  105. package/dist/herdr/generated/names/index.js +12 -0
  106. package/dist/herdr/generated/names/method.d.ts +209 -0
  107. package/dist/herdr/generated/names/method.js +209 -0
  108. package/dist/herdr/generated/names/result-tag.d.ts +68 -0
  109. package/dist/herdr/generated/names/result-tag.js +68 -0
  110. package/dist/herdr/generated/names/server-capability.d.ts +10 -0
  111. package/dist/herdr/generated/names/server-capability.js +11 -0
  112. package/dist/herdr/generated/names/subscription-event-kind.d.ts +8 -0
  113. package/dist/herdr/generated/names/subscription-event-kind.js +8 -0
  114. package/dist/herdr/generated/names/subscription-type.d.ts +31 -0
  115. package/dist/herdr/generated/names/subscription-type.js +32 -0
  116. package/dist/herdr/generated/names/token-name-pattern.d.ts +2 -0
  117. package/dist/herdr/generated/names/token-name-pattern.js +4 -0
  118. package/dist/herdr/generated/namespaces.d.ts +785 -0
  119. package/dist/herdr/generated/namespaces.js +3 -0
  120. package/dist/herdr/generated/overrides.d.ts +33 -0
  121. package/dist/herdr/generated/overrides.js +20 -0
  122. package/dist/herdr/generated/params.d.ts +799 -0
  123. package/dist/herdr/generated/params.js +3 -0
  124. package/dist/herdr/generated/preset-methods.d.ts +4 -0
  125. package/dist/herdr/generated/preset-methods.js +7 -0
  126. package/dist/herdr/generated/presets/sessions-reader.d.ts +2 -0
  127. package/dist/herdr/generated/presets/sessions-reader.js +5 -0
  128. package/dist/herdr/generated/results.d.ts +978 -0
  129. package/dist/herdr/generated/results.js +52 -0
  130. package/dist/herdr/generated/test-data/defaults.d.ts +739 -0
  131. package/dist/herdr/generated/test-data/defaults.js +741 -0
  132. package/dist/herdr/generated/test-data/shapes.d.ts +1325 -0
  133. package/dist/herdr/generated/test-data/shapes.js +2245 -0
  134. package/dist/herdr/test-kit/fake-herdr.d.ts +13 -0
  135. package/dist/herdr/test-kit/fake-herdr.js +216 -0
  136. package/dist/herdr/test-kit/fake-protocol.d.ts +107 -0
  137. package/dist/herdr/test-kit/fake-protocol.js +436 -0
  138. package/dist/herdr/test-kit/types.d.ts +88 -0
  139. package/dist/herdr/test-kit/types.js +1 -0
  140. package/dist/herdr/wire/codec.d.ts +36 -0
  141. package/dist/herdr/wire/codec.js +62 -0
  142. package/dist/herdr/wire/connection.d.ts +13 -0
  143. package/dist/herdr/wire/connection.js +65 -0
  144. package/dist/herdr/wire/dedicated.d.ts +2 -0
  145. package/dist/herdr/wire/dedicated.js +238 -0
  146. package/dist/herdr/wire/push-decoder.d.ts +2 -0
  147. package/dist/herdr/wire/push-decoder.js +40 -0
  148. package/dist/herdr/wire/rpc.d.ts +3 -0
  149. package/dist/herdr/wire/rpc.js +141 -0
  150. package/dist/herdr/wire/socket-path.d.ts +8 -0
  151. package/dist/herdr/wire/socket-path.js +23 -0
  152. package/dist/herdr/wire/types.d.ts +78 -0
  153. package/dist/herdr/wire/types.js +1 -0
  154. package/dist/index.d.ts +11 -0
  155. package/dist/index.js +7 -0
  156. package/dist/read-only.d.ts +5 -0
  157. package/dist/read-only.js +6 -0
  158. package/dist/schema.d.ts +5 -0
  159. package/dist/schema.js +6 -0
  160. package/dist/test-kit.d.ts +2 -0
  161. package/dist/test-kit.js +3 -0
  162. package/docs/api/events.md +43 -0
  163. package/docs/api/methods.md +232 -0
  164. package/package.json +112 -4
  165. package/schema/herdr-api.schema.json +10759 -0
  166. package/schema/herdr-version.json +5 -0
  167. package/skills/herdr-sdk/SKILL.md +75 -0
  168. package/skills/herdr-sdk/references/api-map.md +28 -0
  169. package/skills/herdr-sdk/references/errors.md +19 -0
  170. package/skills/herdr-sdk/references/recipes.md +171 -0
  171. package/skills/herdr-sdk/references/versions.md +7 -0
@@ -0,0 +1,43 @@
1
+ // Role: every string and number of the fake herdr-core: its file names, recorded-frame names, fault kinds and codes, messages and demo terminals.
2
+ // Informs HERDR-ADR-0020 (the fake core) and HERDR-ADR-0021 (strings centralized). Shipped only in ./core/test-kit.
3
+ export const FakeName = { DirPrefix: 'herdr-core-fake-', Socket: 'default.sock' };
4
+ // The JSON-RPC fault kinds and codes the fake answers with.
5
+ export const FakeFaultKind = { MethodNotFound: 'method_not_found', NotFound: 'not_found' };
6
+ export const FakeRpcCode = { MethodNotFound: -32601, NotFound: -32000 };
7
+ // The names of the recorded frames in frames.ts.
8
+ export const FrameName = {
9
+ Hello: 'hello',
10
+ Subscribed: 'subscribed',
11
+ Created: 'event:created',
12
+ eventOf: (type) => `event:${type}`,
13
+ };
14
+ // Fields of a terminal and of the fake's replies that the core client does not read itself.
15
+ export const FakeField = {
16
+ Address: 'address',
17
+ HiddenFinished: 'hidden_finished',
18
+ Channel: 'channel',
19
+ };
20
+ export const FakeText = {
21
+ NoFrame: (name) => `no scripted frame ${name}`,
22
+ NoMethod: (method) => `no method ${method}`,
23
+ NoTerminal: (address) => `no terminal "${String(address)}"`,
24
+ Screen: (terminal) => `screen of ${String(terminal)}`,
25
+ };
26
+ export const FakeScreen = { How: 'screen' };
27
+ // Replies split in two halves: the first SPLIT_AT characters, then the rest after SPLIT_DELAY ms.
28
+ export const SPLIT_AT = 7;
29
+ export const SPLIT_DELAY = 15;
30
+ // The two demo terminals every fake starts with.
31
+ export const DemoTerminal = {
32
+ First: 't1',
33
+ Second: 't2',
34
+ Working: 'working',
35
+ Idle: 'idle',
36
+ Live: 'live',
37
+ App: 'claude-code',
38
+ Argv: ['claude'],
39
+ Cwd: '~/work/probe',
40
+ Name: 'claude',
41
+ Pid: 4242,
42
+ Labels: { 'herdr.tab': 'tb1', 'herdr.space': 'sp1', where: 'S / 1' },
43
+ };
@@ -0,0 +1,61 @@
1
+ import type { SocketPath } from '../wire.js';
2
+ type Fields = Record<string, unknown>;
3
+ export type Handler = (params: Fields) => unknown;
4
+ export declare class FakeFault {
5
+ readonly code: number;
6
+ readonly kind: string;
7
+ readonly message: string;
8
+ constructor(code: number, kind: string, message: string);
9
+ }
10
+ export interface Seen {
11
+ readonly method: string;
12
+ readonly params: Fields;
13
+ readonly connection: number;
14
+ }
15
+ export declare function frame(name: string): Fields;
16
+ export declare const agentTerminal: (address: string, state: string, labels?: Fields) => Fields;
17
+ export declare const shellTerminal: (address: string) => Fields;
18
+ export declare class FakeHcCore {
19
+ connections: number;
20
+ silent: boolean;
21
+ splitReplies: boolean;
22
+ seq: number;
23
+ terminals: Fields[];
24
+ readonly seen: Seen[];
25
+ private readonly handlers;
26
+ private readonly delays;
27
+ private readonly sockets;
28
+ private readonly subscribers;
29
+ private readonly timers;
30
+ private server;
31
+ private helloResult;
32
+ private readonly dir;
33
+ readonly path: SocketPath;
34
+ private constructor();
35
+ static start(): Promise<FakeHcCore>;
36
+ static unlistened(): FakeHcCore;
37
+ get open(): number;
38
+ get subscribed(): number;
39
+ on(method: string, handler: Handler): void;
40
+ delay(method: string, ms: number): void;
41
+ hello(patch: Fields): void;
42
+ up(): Promise<void>;
43
+ down(): Promise<void>;
44
+ dropAll(): void;
45
+ event(type: string, terminal: string | null, data?: Fields): number;
46
+ heartbeat(): void;
47
+ missed(terminals: Fields[]): void;
48
+ raw(text: string): void;
49
+ stop(): Promise<void>;
50
+ private send;
51
+ private accept;
52
+ private handle;
53
+ private reply;
54
+ private outcome;
55
+ private resultOf;
56
+ private readonly served;
57
+ private getOf;
58
+ }
59
+ export declare function nextWithin<T>(iterator: AsyncIterator<T>, ms: number): Promise<T | null>;
60
+ export declare const later: (ms: number) => Promise<void>;
61
+ export {};
@@ -0,0 +1,228 @@
1
+ // Role: FakeHcCore, a scripted herdr-core on a temporary unix socket: hello, terminal.list/get/read, events with heartbeats, missed, drops and slow or silent replies.
2
+ // Informs HERDR-ADR-0020 (the herdr-core client); ported from the desktop work in herdr-plugins.
3
+ import { createServer } from 'node:net';
4
+ import { mkdtempSync, rmSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { RECORDED_FRAMES } from './frames.js';
8
+ import { brand, isString } from '../kernel.js';
9
+ import { EMPTY_TEXT, HC_GET_METHOD, HC_HELLO_METHOD, HC_JSONRPC_VERSION, HC_LINE_SEPARATOR, HC_LIST_METHOD, HC_READ_METHOD, HC_SUBSCRIBE_METHOD, HcField, HcNotificationMethod, JsType, SocketEvent, UTF8 } from '../constants.js';
10
+ import { DemoTerminal, FakeFaultKind, FakeField, FakeName, FakeRpcCode, FakeScreen, FakeText, FrameName, SPLIT_AT, SPLIT_DELAY } from './constants.js';
11
+ export class FakeFault {
12
+ code;
13
+ kind;
14
+ message;
15
+ constructor(code, kind, message) {
16
+ this.code = code;
17
+ this.kind = kind;
18
+ this.message = message;
19
+ }
20
+ }
21
+ const isFields = (input) => typeof input === JsType.Object && input !== null && !Array.isArray(input);
22
+ const loaded = RECORDED_FRAMES;
23
+ export function frame(name) {
24
+ const found = isFields(loaded) ? loaded[name] : undefined;
25
+ if (!isFields(found)) {
26
+ throw new FakeFault(FakeRpcCode.NotFound, FakeFaultKind.NotFound, FakeText.NoFrame(name));
27
+ }
28
+ return found;
29
+ }
30
+ const section = (source, key) => {
31
+ const found = source[key];
32
+ return isFields(found) ? found : {};
33
+ };
34
+ const listOf = (source, key) => {
35
+ const found = source[key];
36
+ return Array.isArray(found) ? found : [];
37
+ };
38
+ const dataOf = (name) => section(section(frame(name), HcField.Params), HcField.Data);
39
+ export const agentTerminal = (address, state, labels = DemoTerminal.Labels) => ({
40
+ ...dataOf(FrameName.Created), address, labels, state: DemoTerminal.Live, status: { app: DemoTerminal.App, state }, foreground: { argv: [...DemoTerminal.Argv], cwd: DemoTerminal.Cwd, name: DemoTerminal.Name, pid: DemoTerminal.Pid },
41
+ });
42
+ export const shellTerminal = (address) => {
43
+ const first = listOf(section(frame(FrameName.Subscribed), HcField.Result), HcField.Terminals)[0];
44
+ return { ...(isFields(first) ? first : {}), address };
45
+ };
46
+ export class FakeHcCore {
47
+ connections = 0;
48
+ silent = false;
49
+ splitReplies = false;
50
+ seq = 100;
51
+ terminals = [];
52
+ seen = [];
53
+ handlers = new Map();
54
+ delays = new Map();
55
+ sockets = new Set();
56
+ subscribers = new Set();
57
+ timers = new Set();
58
+ server = null;
59
+ helloResult = section(frame(FrameName.Hello), HcField.Result);
60
+ dir;
61
+ path;
62
+ constructor(dir, path) {
63
+ this.dir = dir;
64
+ this.path = path;
65
+ this.terminals = [agentTerminal(DemoTerminal.First, DemoTerminal.Working), agentTerminal(DemoTerminal.Second, DemoTerminal.Idle)];
66
+ }
67
+ static async start() {
68
+ const dir = mkdtempSync(join(tmpdir(), FakeName.DirPrefix));
69
+ const core = new FakeHcCore(dir, brand(join(dir, FakeName.Socket)));
70
+ await core.up();
71
+ return core;
72
+ }
73
+ static unlistened() {
74
+ const dir = mkdtempSync(join(tmpdir(), FakeName.DirPrefix));
75
+ return new FakeHcCore(dir, brand(join(dir, FakeName.Socket)));
76
+ }
77
+ get open() {
78
+ return this.sockets.size;
79
+ }
80
+ get subscribed() {
81
+ return this.subscribers.size;
82
+ }
83
+ on(method, handler) {
84
+ this.handlers.set(method, handler);
85
+ }
86
+ delay(method, ms) {
87
+ this.delays.set(method, ms);
88
+ }
89
+ hello(patch) {
90
+ this.helloResult = { ...this.helloResult, ...patch };
91
+ }
92
+ async up() {
93
+ const server = createServer((socket) => { this.accept(socket); });
94
+ this.server = server;
95
+ await new Promise((resolve) => { server.listen(this.path, resolve); });
96
+ }
97
+ async down() {
98
+ const server = this.server;
99
+ this.server = null;
100
+ this.dropAll();
101
+ if (server !== null) {
102
+ await new Promise((resolve) => { server.close(() => { resolve(); }); });
103
+ }
104
+ }
105
+ dropAll() {
106
+ for (const socket of this.sockets) {
107
+ socket.destroy();
108
+ }
109
+ }
110
+ event(type, terminal, data) {
111
+ this.seq += 1;
112
+ const base = section(frame(FrameName.eventOf(type)), HcField.Params);
113
+ this.send(HcNotificationMethod.Event, { [HcField.Seq]: this.seq, [HcField.Terminal]: terminal, [HcField.Type]: type, [HcField.Data]: data ?? section(base, HcField.Data) });
114
+ return this.seq;
115
+ }
116
+ heartbeat() {
117
+ this.send(HcNotificationMethod.Heartbeat, { [HcField.Seq]: this.seq });
118
+ }
119
+ missed(terminals) {
120
+ this.seq += 1;
121
+ this.send(HcNotificationMethod.Missed, { [HcField.Seq]: this.seq, [HcField.Terminals]: terminals });
122
+ }
123
+ raw(text) {
124
+ for (const socket of this.subscribers) {
125
+ socket.write(text);
126
+ }
127
+ }
128
+ async stop() {
129
+ for (const timer of this.timers) {
130
+ clearTimeout(timer);
131
+ }
132
+ await this.down();
133
+ rmSync(this.dir, { recursive: true, force: true });
134
+ }
135
+ send(method, params) {
136
+ const line = JSON.stringify({ [HcField.JsonRpc]: HC_JSONRPC_VERSION, [HcField.Method]: method, [HcField.Params]: params }) + HC_LINE_SEPARATOR;
137
+ for (const socket of this.subscribers) {
138
+ socket.write(line);
139
+ }
140
+ }
141
+ accept(socket) {
142
+ this.connections += 1;
143
+ const connection = this.connections;
144
+ this.sockets.add(socket);
145
+ let rest = EMPTY_TEXT;
146
+ socket.on(SocketEvent.Data, (chunk) => {
147
+ const lines = (rest + chunk.toString(UTF8)).split(HC_LINE_SEPARATOR);
148
+ rest = lines.pop() ?? EMPTY_TEXT;
149
+ for (const line of lines) {
150
+ this.handle(socket, line, connection);
151
+ }
152
+ });
153
+ socket.on(SocketEvent.Error, () => undefined);
154
+ socket.on(SocketEvent.Close, () => { this.sockets.delete(socket); this.subscribers.delete(socket); });
155
+ }
156
+ handle(socket, line, connection) {
157
+ const request = JSON.parse(line);
158
+ if (!isFields(request) || !isString(request[HcField.Method])) {
159
+ return;
160
+ }
161
+ const method = String(request[HcField.Method]);
162
+ const params = section(request, HcField.Params);
163
+ this.seen.push({ method, params, connection });
164
+ if (this.silent) {
165
+ return;
166
+ }
167
+ const wait = this.delays.get(method) ?? 0;
168
+ const timer = setTimeout(() => { this.timers.delete(timer); this.reply(socket, request[HcField.Id], method, params); }, wait);
169
+ this.timers.add(timer);
170
+ }
171
+ reply(socket, id, method, params) {
172
+ if (socket.destroyed) {
173
+ return;
174
+ }
175
+ const body = this.outcome(socket, method, params);
176
+ const line = JSON.stringify({ [HcField.Id]: id, [HcField.JsonRpc]: HC_JSONRPC_VERSION, ...body }) + HC_LINE_SEPARATOR;
177
+ if (!this.splitReplies) {
178
+ socket.write(line);
179
+ return;
180
+ }
181
+ socket.write(line.slice(0, SPLIT_AT));
182
+ const timer = setTimeout(() => { this.timers.delete(timer); socket.write(line.slice(SPLIT_AT)); }, SPLIT_DELAY);
183
+ this.timers.add(timer);
184
+ }
185
+ outcome(socket, method, params) {
186
+ try {
187
+ return { [HcField.Result]: this.resultOf(socket, method, params) };
188
+ }
189
+ catch (cause) {
190
+ if (cause instanceof FakeFault) {
191
+ return { [HcField.Error]: { [HcField.Code]: cause.code, [HcField.Message]: cause.message, [HcField.Data]: { [HcField.Kind]: cause.kind } } };
192
+ }
193
+ throw cause;
194
+ }
195
+ }
196
+ resultOf(socket, method, params) {
197
+ const custom = this.handlers.get(method);
198
+ if (custom !== undefined) {
199
+ return custom(params);
200
+ }
201
+ const serve = this.served.get(method);
202
+ if (serve === undefined) {
203
+ throw new FakeFault(FakeRpcCode.MethodNotFound, FakeFaultKind.MethodNotFound, FakeText.NoMethod(method));
204
+ }
205
+ return serve(socket, params);
206
+ }
207
+ served = new Map([
208
+ [HC_HELLO_METHOD, () => this.helloResult],
209
+ [HC_LIST_METHOD, () => ({ [FakeField.HiddenFinished]: 0, [HcField.Terminals]: this.terminals })],
210
+ [HC_GET_METHOD, (_socket, params) => this.getOf(params[HcField.Terminal])],
211
+ [HC_READ_METHOD, (_socket, params) => ({ text: FakeText.Screen(params[HcField.Terminal]), complete: true, how: FakeScreen.How, why: null })],
212
+ [HC_SUBSCRIBE_METHOD, (socket) => { this.subscribers.add(socket); return { [FakeField.Channel]: null, [HcField.Seq]: this.seq, [HcField.Terminals]: this.terminals }; }],
213
+ ]);
214
+ getOf(address) {
215
+ const found = this.terminals.find((terminal) => terminal[FakeField.Address] === address);
216
+ if (found === undefined) {
217
+ throw new FakeFault(FakeRpcCode.NotFound, FakeFaultKind.NotFound, FakeText.NoTerminal(address));
218
+ }
219
+ return found;
220
+ }
221
+ }
222
+ export function nextWithin(iterator, ms) {
223
+ return new Promise((resolve, reject) => {
224
+ const timer = setTimeout(() => { resolve(null); }, ms);
225
+ iterator.next().then((step) => { clearTimeout(timer); resolve(step.done === true ? null : step.value); return step; }, reject);
226
+ });
227
+ }
228
+ export const later = (ms) => new Promise((resolve) => { setTimeout(resolve, ms); });
@@ -0,0 +1 @@
1
+ export declare const RECORDED_FRAMES: unknown;