@did-btcr2/aggregation 0.1.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 (233) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +19 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/browser.js +24017 -0
  5. package/dist/browser.mjs +24011 -0
  6. package/dist/cjs/index.js +5690 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/esm/beacon-strategy.js +76 -0
  9. package/dist/esm/beacon-strategy.js.map +1 -0
  10. package/dist/esm/cohort.js +316 -0
  11. package/dist/esm/cohort.js.map +1 -0
  12. package/dist/esm/conditions.js +102 -0
  13. package/dist/esm/conditions.js.map +1 -0
  14. package/dist/esm/errors.js +22 -0
  15. package/dist/esm/errors.js.map +1 -0
  16. package/dist/esm/fallback-spend.js +132 -0
  17. package/dist/esm/fallback-spend.js.map +1 -0
  18. package/dist/esm/index.js +21 -0
  19. package/dist/esm/index.js.map +1 -0
  20. package/dist/esm/logger.js +15 -0
  21. package/dist/esm/logger.js.map +1 -0
  22. package/dist/esm/messages/base.js +36 -0
  23. package/dist/esm/messages/base.js.map +1 -0
  24. package/dist/esm/messages/bodies.js +149 -0
  25. package/dist/esm/messages/bodies.js.map +1 -0
  26. package/dist/esm/messages/constants.js +37 -0
  27. package/dist/esm/messages/constants.js.map +1 -0
  28. package/dist/esm/messages/factories.js +139 -0
  29. package/dist/esm/messages/factories.js.map +1 -0
  30. package/dist/esm/messages/guards.js +40 -0
  31. package/dist/esm/messages/guards.js.map +1 -0
  32. package/dist/esm/messages/index.js +6 -0
  33. package/dist/esm/messages/index.js.map +1 -0
  34. package/dist/esm/participant.js +588 -0
  35. package/dist/esm/participant.js.map +1 -0
  36. package/dist/esm/phases.js +45 -0
  37. package/dist/esm/phases.js.map +1 -0
  38. package/dist/esm/recovery-policy.js +156 -0
  39. package/dist/esm/recovery-policy.js.map +1 -0
  40. package/dist/esm/recovery-spend.js +106 -0
  41. package/dist/esm/recovery-spend.js.map +1 -0
  42. package/dist/esm/runner/aggregation-runner.js +75 -0
  43. package/dist/esm/runner/aggregation-runner.js.map +1 -0
  44. package/dist/esm/runner/events.js +2 -0
  45. package/dist/esm/runner/events.js.map +1 -0
  46. package/dist/esm/runner/index.js +6 -0
  47. package/dist/esm/runner/index.js.map +1 -0
  48. package/dist/esm/runner/participant-runner.js +407 -0
  49. package/dist/esm/runner/participant-runner.js.map +1 -0
  50. package/dist/esm/runner/service-runner.js +701 -0
  51. package/dist/esm/runner/service-runner.js.map +1 -0
  52. package/dist/esm/runner/typed-emitter.js +80 -0
  53. package/dist/esm/runner/typed-emitter.js.map +1 -0
  54. package/dist/esm/service.js +774 -0
  55. package/dist/esm/service.js.map +1 -0
  56. package/dist/esm/signer.js +33 -0
  57. package/dist/esm/signer.js.map +1 -0
  58. package/dist/esm/signing-session.js +195 -0
  59. package/dist/esm/signing-session.js.map +1 -0
  60. package/dist/esm/transport/didcomm.js +41 -0
  61. package/dist/esm/transport/didcomm.js.map +1 -0
  62. package/dist/esm/transport/error.js +12 -0
  63. package/dist/esm/transport/error.js.map +1 -0
  64. package/dist/esm/transport/factory.js +29 -0
  65. package/dist/esm/transport/factory.js.map +1 -0
  66. package/dist/esm/transport/http/client.js +342 -0
  67. package/dist/esm/transport/http/client.js.map +1 -0
  68. package/dist/esm/transport/http/envelope.js +126 -0
  69. package/dist/esm/transport/http/envelope.js.map +1 -0
  70. package/dist/esm/transport/http/errors.js +11 -0
  71. package/dist/esm/transport/http/errors.js.map +1 -0
  72. package/dist/esm/transport/http/inbox-buffer.js +45 -0
  73. package/dist/esm/transport/http/inbox-buffer.js.map +1 -0
  74. package/dist/esm/transport/http/index.js +12 -0
  75. package/dist/esm/transport/http/index.js.map +1 -0
  76. package/dist/esm/transport/http/nonce-cache.js +38 -0
  77. package/dist/esm/transport/http/nonce-cache.js.map +1 -0
  78. package/dist/esm/transport/http/protocol.js +28 -0
  79. package/dist/esm/transport/http/protocol.js.map +1 -0
  80. package/dist/esm/transport/http/rate-limiter.js +45 -0
  81. package/dist/esm/transport/http/rate-limiter.js.map +1 -0
  82. package/dist/esm/transport/http/request-auth.js +100 -0
  83. package/dist/esm/transport/http/request-auth.js.map +1 -0
  84. package/dist/esm/transport/http/server.js +475 -0
  85. package/dist/esm/transport/http/server.js.map +1 -0
  86. package/dist/esm/transport/http/sse-stream.js +110 -0
  87. package/dist/esm/transport/http/sse-stream.js.map +1 -0
  88. package/dist/esm/transport/http/sse-writer.js +25 -0
  89. package/dist/esm/transport/http/sse-writer.js.map +1 -0
  90. package/dist/esm/transport/in-memory.js +149 -0
  91. package/dist/esm/transport/in-memory.js.map +1 -0
  92. package/dist/esm/transport/index.js +8 -0
  93. package/dist/esm/transport/index.js.map +1 -0
  94. package/dist/esm/transport/nostr.js +491 -0
  95. package/dist/esm/transport/nostr.js.map +1 -0
  96. package/dist/esm/transport/transport.js +2 -0
  97. package/dist/esm/transport/transport.js.map +1 -0
  98. package/dist/types/beacon-strategy.d.ts +56 -0
  99. package/dist/types/beacon-strategy.d.ts.map +1 -0
  100. package/dist/types/cohort.d.ts +188 -0
  101. package/dist/types/cohort.d.ts.map +1 -0
  102. package/dist/types/conditions.d.ts +86 -0
  103. package/dist/types/conditions.d.ts.map +1 -0
  104. package/dist/types/errors.d.ts +14 -0
  105. package/dist/types/errors.d.ts.map +1 -0
  106. package/dist/types/fallback-spend.d.ts +94 -0
  107. package/dist/types/fallback-spend.d.ts.map +1 -0
  108. package/dist/types/index.d.ts +17 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/logger.d.ts +22 -0
  111. package/dist/types/logger.d.ts.map +1 -0
  112. package/dist/types/messages/base.d.ts +58 -0
  113. package/dist/types/messages/base.d.ts.map +1 -0
  114. package/dist/types/messages/bodies.d.ts +177 -0
  115. package/dist/types/messages/bodies.d.ts.map +1 -0
  116. package/dist/types/messages/constants.d.ts +31 -0
  117. package/dist/types/messages/constants.d.ts.map +1 -0
  118. package/dist/types/messages/factories.d.ts +217 -0
  119. package/dist/types/messages/factories.d.ts.map +1 -0
  120. package/dist/types/messages/guards.d.ts +11 -0
  121. package/dist/types/messages/guards.d.ts.map +1 -0
  122. package/dist/types/messages/index.d.ts +6 -0
  123. package/dist/types/messages/index.d.ts.map +1 -0
  124. package/dist/types/participant.d.ts +162 -0
  125. package/dist/types/participant.d.ts.map +1 -0
  126. package/dist/types/phases.d.ts +55 -0
  127. package/dist/types/phases.d.ts.map +1 -0
  128. package/dist/types/recovery-policy.d.ts +132 -0
  129. package/dist/types/recovery-policy.d.ts.map +1 -0
  130. package/dist/types/recovery-spend.d.ts +94 -0
  131. package/dist/types/recovery-spend.d.ts.map +1 -0
  132. package/dist/types/runner/aggregation-runner.d.ts +72 -0
  133. package/dist/types/runner/aggregation-runner.d.ts.map +1 -0
  134. package/dist/types/runner/events.d.ts +147 -0
  135. package/dist/types/runner/events.d.ts.map +1 -0
  136. package/dist/types/runner/index.d.ts +6 -0
  137. package/dist/types/runner/index.d.ts.map +1 -0
  138. package/dist/types/runner/participant-runner.d.ts +122 -0
  139. package/dist/types/runner/participant-runner.d.ts.map +1 -0
  140. package/dist/types/runner/service-runner.d.ts +228 -0
  141. package/dist/types/runner/service-runner.d.ts.map +1 -0
  142. package/dist/types/runner/typed-emitter.d.ts +41 -0
  143. package/dist/types/runner/typed-emitter.d.ts.map +1 -0
  144. package/dist/types/service.d.ts +177 -0
  145. package/dist/types/service.d.ts.map +1 -0
  146. package/dist/types/signer.d.ts +50 -0
  147. package/dist/types/signer.d.ts.map +1 -0
  148. package/dist/types/signing-session.d.ts +81 -0
  149. package/dist/types/signing-session.d.ts.map +1 -0
  150. package/dist/types/transport/didcomm.d.ts +23 -0
  151. package/dist/types/transport/didcomm.d.ts.map +1 -0
  152. package/dist/types/transport/error.d.ts +8 -0
  153. package/dist/types/transport/error.d.ts.map +1 -0
  154. package/dist/types/transport/factory.d.ts +28 -0
  155. package/dist/types/transport/factory.d.ts.map +1 -0
  156. package/dist/types/transport/http/client.d.ts +56 -0
  157. package/dist/types/transport/http/client.d.ts.map +1 -0
  158. package/dist/types/transport/http/envelope.d.ts +64 -0
  159. package/dist/types/transport/http/envelope.d.ts.map +1 -0
  160. package/dist/types/transport/http/errors.d.ts +9 -0
  161. package/dist/types/transport/http/errors.d.ts.map +1 -0
  162. package/dist/types/transport/http/inbox-buffer.d.ts +32 -0
  163. package/dist/types/transport/http/inbox-buffer.d.ts.map +1 -0
  164. package/dist/types/transport/http/index.d.ts +12 -0
  165. package/dist/types/transport/http/index.d.ts.map +1 -0
  166. package/dist/types/transport/http/nonce-cache.d.ts +26 -0
  167. package/dist/types/transport/http/nonce-cache.d.ts.map +1 -0
  168. package/dist/types/transport/http/protocol.d.ts +53 -0
  169. package/dist/types/transport/http/protocol.d.ts.map +1 -0
  170. package/dist/types/transport/http/rate-limiter.d.ts +41 -0
  171. package/dist/types/transport/http/rate-limiter.d.ts.map +1 -0
  172. package/dist/types/transport/http/request-auth.d.ts +50 -0
  173. package/dist/types/transport/http/request-auth.d.ts.map +1 -0
  174. package/dist/types/transport/http/server.d.ts +118 -0
  175. package/dist/types/transport/http/server.d.ts.map +1 -0
  176. package/dist/types/transport/http/sse-stream.d.ts +34 -0
  177. package/dist/types/transport/http/sse-stream.d.ts.map +1 -0
  178. package/dist/types/transport/http/sse-writer.d.ts +12 -0
  179. package/dist/types/transport/http/sse-writer.d.ts.map +1 -0
  180. package/dist/types/transport/in-memory.d.ts +64 -0
  181. package/dist/types/transport/in-memory.d.ts.map +1 -0
  182. package/dist/types/transport/index.d.ts +8 -0
  183. package/dist/types/transport/index.d.ts.map +1 -0
  184. package/dist/types/transport/nostr.d.ts +153 -0
  185. package/dist/types/transport/nostr.d.ts.map +1 -0
  186. package/dist/types/transport/transport.d.ts +62 -0
  187. package/dist/types/transport/transport.d.ts.map +1 -0
  188. package/package.json +128 -0
  189. package/src/beacon-strategy.ts +142 -0
  190. package/src/cohort.ts +422 -0
  191. package/src/conditions.ts +172 -0
  192. package/src/errors.ts +25 -0
  193. package/src/fallback-spend.ts +223 -0
  194. package/src/index.ts +23 -0
  195. package/src/logger.ts +33 -0
  196. package/src/messages/base.ts +80 -0
  197. package/src/messages/bodies.ts +328 -0
  198. package/src/messages/constants.ts +40 -0
  199. package/src/messages/factories.ts +297 -0
  200. package/src/messages/guards.ts +61 -0
  201. package/src/messages/index.ts +5 -0
  202. package/src/participant.ts +779 -0
  203. package/src/phases.ts +91 -0
  204. package/src/recovery-policy.ts +237 -0
  205. package/src/recovery-spend.ts +192 -0
  206. package/src/runner/aggregation-runner.ts +125 -0
  207. package/src/runner/events.ts +129 -0
  208. package/src/runner/index.ts +5 -0
  209. package/src/runner/participant-runner.ts +488 -0
  210. package/src/runner/service-runner.ts +891 -0
  211. package/src/runner/typed-emitter.ts +87 -0
  212. package/src/service.ts +1000 -0
  213. package/src/signer.ts +67 -0
  214. package/src/signing-session.ts +290 -0
  215. package/src/transport/didcomm.ts +59 -0
  216. package/src/transport/error.ts +13 -0
  217. package/src/transport/factory.ts +65 -0
  218. package/src/transport/http/client.ts +409 -0
  219. package/src/transport/http/envelope.ts +204 -0
  220. package/src/transport/http/errors.ts +11 -0
  221. package/src/transport/http/inbox-buffer.ts +53 -0
  222. package/src/transport/http/index.ts +11 -0
  223. package/src/transport/http/nonce-cache.ts +43 -0
  224. package/src/transport/http/protocol.ts +57 -0
  225. package/src/transport/http/rate-limiter.ts +75 -0
  226. package/src/transport/http/request-auth.ts +164 -0
  227. package/src/transport/http/server.ts +617 -0
  228. package/src/transport/http/sse-stream.ts +121 -0
  229. package/src/transport/http/sse-writer.ts +23 -0
  230. package/src/transport/in-memory.ts +178 -0
  231. package/src/transport/index.ts +7 -0
  232. package/src/transport/nostr.ts +576 -0
  233. package/src/transport/transport.ts +79 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Parse an SSE stream into an async iterable of {@link SseEvent} records.
3
+ *
4
+ * The parser follows the HTML Living Standard ({@link https://html.spec.whatwg.org/multipage/server-sent-events.html})
5
+ * closely enough for our needs: LF and CRLF line terminators, multi-line
6
+ * `data` fields, `event` / `id` / `retry` fields, and `:`-prefixed comments.
7
+ * CR-only line terminators are not supported (every mainstream SSE
8
+ * implementation emits LF or CRLF).
9
+ *
10
+ * Pure, runtime-agnostic - works anywhere `ReadableStream<Uint8Array>` and
11
+ * `TextDecoder` exist (browsers and Node 22+).
12
+ *
13
+ * The caller owns stream lifecycle: cancellation should be effected via an
14
+ * `AbortController` on the producing `fetch`, which propagates as a read
15
+ * error and cleanly unwinds this generator's `finally`.
16
+ */
17
+ export async function* parseSseStream(readable) {
18
+ const decoder = new TextDecoder('utf-8');
19
+ const reader = readable.getReader();
20
+ let buffer = '';
21
+ let pending = {};
22
+ const dispatchPending = () => {
23
+ if (pending.data === undefined) {
24
+ pending = {};
25
+ return null;
26
+ }
27
+ const ev = { data: pending.data };
28
+ if (pending.event !== undefined)
29
+ ev.event = pending.event;
30
+ if (pending.id !== undefined)
31
+ ev.id = pending.id;
32
+ if (pending.retry !== undefined)
33
+ ev.retry = pending.retry;
34
+ pending = {};
35
+ return ev;
36
+ };
37
+ const processLine = (line) => {
38
+ if (line.startsWith(':'))
39
+ return; // comment
40
+ const colon = line.indexOf(':');
41
+ const field = colon === -1 ? line : line.slice(0, colon);
42
+ let value = colon === -1 ? '' : line.slice(colon + 1);
43
+ if (value.startsWith(' '))
44
+ value = value.slice(1);
45
+ switch (field) {
46
+ case 'data':
47
+ pending.data = pending.data === undefined ? value : `${pending.data}\n${value}`;
48
+ break;
49
+ case 'event':
50
+ pending.event = value;
51
+ break;
52
+ case 'id':
53
+ // Per spec: ignore ids containing NUL.
54
+ if (!value.includes('\0'))
55
+ pending.id = value;
56
+ break;
57
+ case 'retry': {
58
+ const n = Number(value);
59
+ if (Number.isInteger(n) && n >= 0)
60
+ pending.retry = n;
61
+ break;
62
+ }
63
+ // Other fields (including unknown names) are ignored per the spec.
64
+ }
65
+ };
66
+ try {
67
+ for (;;) {
68
+ const { value, done } = await reader.read();
69
+ if (done) {
70
+ // Flush any bytes the decoder is still holding.
71
+ buffer += decoder.decode();
72
+ if (buffer.length > 0) {
73
+ const line = buffer.endsWith('\r') ? buffer.slice(0, -1) : buffer;
74
+ if (line.length > 0)
75
+ processLine(line);
76
+ buffer = '';
77
+ }
78
+ const tail = dispatchPending();
79
+ if (tail)
80
+ yield tail;
81
+ return;
82
+ }
83
+ buffer += decoder.decode(value, { stream: true });
84
+ // Drain as many complete lines as are available.
85
+ let lineEnd = buffer.indexOf('\n');
86
+ while (lineEnd !== -1) {
87
+ let line = buffer.slice(0, lineEnd);
88
+ if (line.endsWith('\r'))
89
+ line = line.slice(0, -1);
90
+ buffer = buffer.slice(lineEnd + 1);
91
+ if (line.length === 0) {
92
+ const ev = dispatchPending();
93
+ if (ev)
94
+ yield ev;
95
+ }
96
+ else {
97
+ processLine(line);
98
+ }
99
+ lineEnd = buffer.indexOf('\n');
100
+ }
101
+ }
102
+ }
103
+ finally {
104
+ try {
105
+ reader.releaseLock();
106
+ }
107
+ catch { /* already released */ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=sse-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-stream.js","sourceRoot":"","sources":["../../../../src/transport/http/sse-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Format an SSE event frame. Pairs with {@link parseSseStream}.
3
+ *
4
+ * Multi-line `data` is split across multiple `data:` lines per the SSE spec -
5
+ * each embedded `\n` becomes its own line, and the parser rejoins them.
6
+ *
7
+ * The returned string includes a trailing blank line (the dispatch marker).
8
+ */
9
+ export function formatSseEvent(event, data, id) {
10
+ const lines = [];
11
+ if (id !== undefined)
12
+ lines.push(`id: ${id}`);
13
+ lines.push(`event: ${event}`);
14
+ for (const part of data.split('\n'))
15
+ lines.push(`data: ${part}`);
16
+ lines.push('');
17
+ lines.push('');
18
+ return lines.join('\n');
19
+ }
20
+ /** SSE comment frame (server keepalive). Lines starting with `:` are ignored by compliant parsers. */
21
+ export function formatSseComment(comment) {
22
+ const safe = comment.replace(/\n/g, ' ');
23
+ return `: ${safe}\n\n`;
24
+ }
25
+ //# sourceMappingURL=sse-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-writer.js","sourceRoot":"","sources":["../../../../src/transport/http/sse-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY,EAAE,EAAW;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAG,EAAE,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;IAC9B,KAAI,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils';
2
+ /**
3
+ * In-process message bus connecting one or more {@link InMemoryTransport}
4
+ * instances. Routes broadcasts to every registered actor and directed messages
5
+ * to the actor that owns the recipient DID, with no relay, server, or network.
6
+ *
7
+ * Each delivery does a JSON round-trip (Uint8Array preserved as `__bytes` hex)
8
+ * so handlers receive an isolated, serialization-faithful copy, exactly as a
9
+ * real transport would. The message `body` is merged to the top level to match
10
+ * the shape the {@link NostrTransport} dispatch produces.
11
+ *
12
+ * @class InMemoryBus
13
+ */
14
+ export class InMemoryBus {
15
+ #transports = new Set();
16
+ /** Attach a transport to this bus. Called by the transport's constructor. */
17
+ register(transport) {
18
+ this.#transports.add(transport);
19
+ }
20
+ /** Detach a transport from this bus. */
21
+ unregister(transport) {
22
+ this.#transports.delete(transport);
23
+ }
24
+ /**
25
+ * Deliver a message. With no `recipient` the message is broadcast to every
26
+ * actor on the bus; otherwise it is routed to the single transport that owns
27
+ * the recipient DID.
28
+ */
29
+ async deliver(message, _sender, recipient) {
30
+ const type = message.type;
31
+ if (!type)
32
+ return;
33
+ // JSON round-trip to mimic transport serialization, preserving Uint8Array.
34
+ const replacer = (_k, v) => v instanceof Uint8Array ? { __bytes: bytesToHex(v) } : v;
35
+ const reviver = (_k, v) => v && typeof v === 'object' && '__bytes' in v
36
+ ? hexToBytes(v.__bytes)
37
+ : v;
38
+ const raw = JSON.parse(JSON.stringify(message, replacer), reviver);
39
+ const serialized = { ...raw, ...(raw.body ?? {}) };
40
+ if (!recipient) {
41
+ for (const t of this.#transports) {
42
+ await t.dispatchBroadcast(type, serialized);
43
+ }
44
+ return;
45
+ }
46
+ for (const t of this.#transports) {
47
+ if (t.hasActor(recipient)) {
48
+ await t.dispatchDirected(recipient, type, serialized);
49
+ return;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * In-process {@link Transport} that routes aggregation messages through an
56
+ * {@link InMemoryBus} instead of a relay or HTTP server. Supports multiple
57
+ * actors per instance, so a single transport can host both a service and its
58
+ * participants (e.g. a cohort-of-one via {@link AggregationRunner.solo}).
59
+ *
60
+ * Encryption is a no-op (in-process, same trust domain); `registerPeer` /
61
+ * `getPeerPk` keep a registry so the contract matches the wire transports.
62
+ *
63
+ * @class InMemoryTransport
64
+ * @implements {Transport}
65
+ */
66
+ export class InMemoryTransport {
67
+ name = 'in-memory';
68
+ bus;
69
+ #actors = new Map();
70
+ #peers = new Map();
71
+ /** @param bus Shared bus. Pass the same bus to connect multiple transports. */
72
+ constructor(bus = new InMemoryBus()) {
73
+ this.bus = bus;
74
+ this.bus.register(this);
75
+ }
76
+ start() {
77
+ // No-op: there is no underlying connection to open.
78
+ }
79
+ registerActor(did, keys) {
80
+ // In-process delivery does no signing or encryption (same trust domain), so
81
+ // retain only the public key - the secret-bearing keypair is never stored in
82
+ // the transport registry (see ADR 038).
83
+ this.#actors.set(did, { publicKey: keys.publicKey.compressed, handlers: new Map() });
84
+ }
85
+ getActorPk(did) {
86
+ return this.#actors.get(did)?.publicKey;
87
+ }
88
+ /** True if `did` is registered on this transport. Used by the bus for routing. */
89
+ hasActor(did) {
90
+ return this.#actors.has(did);
91
+ }
92
+ registerPeer(did, communicationPk) {
93
+ this.#peers.set(did, communicationPk);
94
+ }
95
+ getPeerPk(did) {
96
+ return this.#peers.get(did);
97
+ }
98
+ registerMessageHandler(actorDid, messageType, handler) {
99
+ const actor = this.#actors.get(actorDid);
100
+ if (actor)
101
+ actor.handlers.set(messageType, handler);
102
+ }
103
+ unregisterMessageHandler(actorDid, messageType) {
104
+ const actor = this.#actors.get(actorDid);
105
+ if (actor)
106
+ actor.handlers.delete(messageType);
107
+ }
108
+ unregisterActor(did) {
109
+ const actor = this.#actors.get(did);
110
+ if (!actor)
111
+ return;
112
+ actor.handlers.clear();
113
+ this.#actors.delete(did);
114
+ this.#peers.delete(did);
115
+ }
116
+ async sendMessage(message, sender, recipient) {
117
+ await this.bus.deliver(message, sender, recipient);
118
+ }
119
+ publishRepeating(message, sender, intervalMs, recipient) {
120
+ let stopped = false;
121
+ void this.sendMessage(message, sender, recipient).catch(() => { });
122
+ const timer = setInterval(() => {
123
+ if (stopped)
124
+ return;
125
+ void this.sendMessage(message, sender, recipient).catch(() => { });
126
+ }, intervalMs);
127
+ return () => {
128
+ if (stopped)
129
+ return;
130
+ stopped = true;
131
+ clearInterval(timer);
132
+ };
133
+ }
134
+ /** Deliver a broadcast message to every actor on this transport that handles `type`. */
135
+ async dispatchBroadcast(type, message) {
136
+ for (const actor of this.#actors.values()) {
137
+ const handler = actor.handlers.get(type);
138
+ if (handler)
139
+ await handler(message);
140
+ }
141
+ }
142
+ /** Deliver a directed message to the recipient actor's handler for `type`. */
143
+ async dispatchDirected(recipientDid, type, message) {
144
+ const handler = this.#actors.get(recipientDid)?.handlers.get(type);
145
+ if (handler)
146
+ await handler(message);
147
+ }
148
+ }
149
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../../src/transport/in-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './transport.js';
2
+ export * from './error.js';
3
+ export * from './factory.js';
4
+ export * from './in-memory.js';
5
+ export * from './nostr.js';
6
+ export * from './didcomm.js';
7
+ export * from './http/index.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}