@adobe/data-rpc 0.10.11

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/arg-async.test.d.ts +1 -0
  4. package/dist/arg-async.test.js +147 -0
  5. package/dist/arg-async.test.js.map +1 -0
  6. package/dist/arg-marshal.d.ts +34 -0
  7. package/dist/arg-marshal.js +90 -0
  8. package/dist/arg-marshal.js.map +1 -0
  9. package/dist/arg-observe.test.d.ts +1 -0
  10. package/dist/arg-observe.test.js +114 -0
  11. package/dist/arg-observe.test.js.map +1 -0
  12. package/dist/consume/caller-context.d.ts +47 -0
  13. package/dist/consume/caller-context.js +3 -0
  14. package/dist/consume/caller-context.js.map +1 -0
  15. package/dist/consume/make-generator.d.ts +16 -0
  16. package/dist/consume/make-generator.js +75 -0
  17. package/dist/consume/make-generator.js.map +1 -0
  18. package/dist/consume/make-observe.d.ts +16 -0
  19. package/dist/consume/make-observe.js +29 -0
  20. package/dist/consume/make-observe.js.map +1 -0
  21. package/dist/consume/make-promise.d.ts +12 -0
  22. package/dist/consume/make-promise.js +32 -0
  23. package/dist/consume/make-promise.js.map +1 -0
  24. package/dist/consume/make-void.d.ts +12 -0
  25. package/dist/consume/make-void.js +17 -0
  26. package/dist/consume/make-void.js.map +1 -0
  27. package/dist/consume/reconstruct-error.d.ts +7 -0
  28. package/dist/consume/reconstruct-error.js +14 -0
  29. package/dist/consume/reconstruct-error.js.map +1 -0
  30. package/dist/consume/synthesize-service.d.ts +10 -0
  31. package/dist/consume/synthesize-service.js +77 -0
  32. package/dist/consume/synthesize-service.js.map +1 -0
  33. package/dist/create-endpoint.d.ts +8 -0
  34. package/dist/create-endpoint.js +462 -0
  35. package/dist/create-endpoint.js.map +1 -0
  36. package/dist/endpoint.d.ts +64 -0
  37. package/dist/endpoint.js +3 -0
  38. package/dist/endpoint.js.map +1 -0
  39. package/dist/host/host-context.d.ts +28 -0
  40. package/dist/host/host-context.js +3 -0
  41. package/dist/host/host-context.js.map +1 -0
  42. package/dist/host/marshal-error.d.ts +8 -0
  43. package/dist/host/marshal-error.js +15 -0
  44. package/dist/host/marshal-error.js.map +1 -0
  45. package/dist/host/register-service.d.ts +10 -0
  46. package/dist/host/register-service.js +169 -0
  47. package/dist/host/register-service.js.map +1 -0
  48. package/dist/id.d.ts +7 -0
  49. package/dist/id.js +12 -0
  50. package/dist/id.js.map +1 -0
  51. package/dist/index.d.ts +7 -0
  52. package/dist/index.js +7 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/nested.test.d.ts +1 -0
  55. package/dist/nested.test.js +128 -0
  56. package/dist/nested.test.js.map +1 -0
  57. package/dist/protocol.d.ts +157 -0
  58. package/dist/protocol.js +18 -0
  59. package/dist/protocol.js.map +1 -0
  60. package/dist/review-fixes.test.d.ts +1 -0
  61. package/dist/review-fixes.test.js +200 -0
  62. package/dist/review-fixes.test.js.map +1 -0
  63. package/dist/rpc.test.d.ts +1 -0
  64. package/dist/rpc.test.js +250 -0
  65. package/dist/rpc.test.js.map +1 -0
  66. package/dist/transport.d.ts +32 -0
  67. package/dist/transport.js +3 -0
  68. package/dist/transport.js.map +1 -0
  69. package/dist/transports/loopback-transport.d.ts +13 -0
  70. package/dist/transports/loopback-transport.js +102 -0
  71. package/dist/transports/loopback-transport.js.map +1 -0
  72. package/dist/transports/loopback-transport.test.d.ts +1 -0
  73. package/dist/transports/loopback-transport.test.js +42 -0
  74. package/dist/transports/loopback-transport.test.js.map +1 -0
  75. package/dist/transports/message-port-transport.d.ts +14 -0
  76. package/dist/transports/message-port-transport.js +63 -0
  77. package/dist/transports/message-port-transport.js.map +1 -0
  78. package/dist/transports/message-port-transport.test.d.ts +1 -0
  79. package/dist/transports/message-port-transport.test.js +49 -0
  80. package/dist/transports/message-port-transport.test.js.map +1 -0
  81. package/dist/transports/window-transport.d.ts +20 -0
  82. package/dist/transports/window-transport.js +69 -0
  83. package/dist/transports/window-transport.js.map +1 -0
  84. package/dist/transports/window-transport.test.d.ts +1 -0
  85. package/dist/transports/window-transport.test.js +47 -0
  86. package/dist/transports/window-transport.test.js.map +1 -0
  87. package/package.json +38 -0
@@ -0,0 +1,462 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ import { marshalArgsWith, unmarshalArgsWith } from "./arg-marshal.js";
3
+ import { reconstructError } from "./consume/reconstruct-error.js";
4
+ import { marshalError } from "./host/marshal-error.js";
5
+ import { synthesizeService } from "./consume/synthesize-service.js";
6
+ import { handleHostRequest } from "./host/register-service.js";
7
+ import { createIdAllocator } from "./id.js";
8
+ import { RPC_PROTOCOL_VERSION } from "./protocol.js";
9
+ /**
10
+ * Create a bidirectional RPC endpoint over `transport`. Sends a `hello`
11
+ * handshake immediately; re-announces exposed services whenever the peer says
12
+ * `hello`, so services exposed before the peer connected are still discovered.
13
+ */
14
+ export function createRpcEndpoint(transport, options = {}) {
15
+ const nextId = createIdAllocator();
16
+ const canInvoke = options.canInvoke ?? (() => true);
17
+ const onError = options.onError ?? ((error) => console.error("[data-rpc]", error));
18
+ let closed = false;
19
+ const send = (msg) => {
20
+ if (!closed)
21
+ transport.send(msg);
22
+ };
23
+ // ---- argument-constructor state (REVERSE channel: an Observe/Promise/
24
+ // AsyncGenerator passed as/inside a call argument is serviced from THIS
25
+ // side, as caller, and reconstructed on THIS side, as callee) ----
26
+ // Caller role — providers we service on the peer's demand, keyed by our ref:
27
+ const argObserveProviders = new Map();
28
+ const argObserveSubs = new Map(); // sub → callee's live subscription
29
+ const argPromiseProviders = new Set(); // refs whose promise is still pending
30
+ const argGenProviders = new Map();
31
+ const callArgRefs = new Map(); // opId → arg refs to release when the op ends
32
+ // Callee role — local reconstructions of the peer's arg constructors, keyed by ref:
33
+ const hostArgObserveSubs = new Map(); // sub → our notify for a remote arg observe
34
+ const argPromiseWaiters = new Map();
35
+ const argGenSlots = new Map();
36
+ const trackRef = (opId, ref) => {
37
+ let refs = callArgRefs.get(opId);
38
+ if (refs === undefined) {
39
+ refs = new Set();
40
+ callArgRefs.set(opId, refs);
41
+ }
42
+ refs.add(ref);
43
+ };
44
+ const marshalArgs = (args, params, opId) => marshalArgsWith(args, params, {
45
+ observe: (obs) => {
46
+ const ref = nextId();
47
+ argObserveProviders.set(ref, obs);
48
+ trackRef(opId, ref);
49
+ return ref;
50
+ },
51
+ promise: (promise) => {
52
+ const ref = nextId();
53
+ argPromiseProviders.add(ref);
54
+ trackRef(opId, ref);
55
+ void promise.then((value) => { if (argPromiseProviders.delete(ref))
56
+ send({ kind: "arg-resolve", ref, value: value === undefined ? null : value }); }, (error) => { if (argPromiseProviders.delete(ref))
57
+ send({ kind: "arg-reject", ref, error: marshalError(error) }); });
58
+ return ref;
59
+ },
60
+ generator: (generator) => {
61
+ const ref = nextId();
62
+ argGenProviders.set(ref, generator);
63
+ trackRef(opId, ref);
64
+ return ref;
65
+ },
66
+ });
67
+ const releaseArgRefs = (opId) => {
68
+ const refs = callArgRefs.get(opId);
69
+ if (refs === undefined)
70
+ return;
71
+ callArgRefs.delete(opId);
72
+ for (const ref of refs) {
73
+ argObserveProviders.delete(ref);
74
+ for (const [sub, entry] of argObserveSubs) {
75
+ if (entry.ref === ref) {
76
+ entry.unobserve();
77
+ argObserveSubs.delete(sub);
78
+ }
79
+ }
80
+ // A still-pending promise arg is cancelled on the callee so its `await`
81
+ // can't hang after we stop servicing the ref.
82
+ if (argPromiseProviders.delete(ref)) {
83
+ send({ kind: "arg-reject", ref, error: { name: "RpcError", message: "data-rpc: argument cancelled — call completed" } });
84
+ }
85
+ const gen = argGenProviders.get(ref);
86
+ if (gen !== undefined) {
87
+ argGenProviders.delete(ref);
88
+ void gen.return(undefined).catch(() => undefined);
89
+ // Any later `arg-pull` for this ref is answered `arg-done` (below).
90
+ }
91
+ }
92
+ };
93
+ // Callee-role reconstruction of a remote arg-generator: pull-based, keyed by ref.
94
+ const makeArgGenerator = (ref) => {
95
+ const slot = { pulls: [] };
96
+ argGenSlots.set(ref, slot);
97
+ let finished = false;
98
+ const finish = () => {
99
+ finished = true;
100
+ argGenSlots.delete(ref);
101
+ };
102
+ const gen = {
103
+ async next() {
104
+ if (finished || closed) {
105
+ finish();
106
+ return { done: true, value: undefined };
107
+ }
108
+ send({ kind: "arg-pull", ref });
109
+ const result = await new Promise((res) => slot.pulls.push(res));
110
+ if ("error" in result) {
111
+ finish();
112
+ throw result.error;
113
+ }
114
+ if (result.done) {
115
+ finish();
116
+ return { done: true, value: result.value };
117
+ }
118
+ return { done: false, value: result.value };
119
+ },
120
+ async return(value) {
121
+ if (!finished) {
122
+ finish();
123
+ send({ kind: "arg-return", ref });
124
+ }
125
+ return { done: true, value: value };
126
+ },
127
+ async throw(error) {
128
+ if (!finished) {
129
+ finish();
130
+ send({ kind: "arg-raise", ref, error: marshalError(error) });
131
+ }
132
+ throw error;
133
+ },
134
+ [Symbol.asyncIterator]() { return this; },
135
+ async [Symbol.asyncDispose]() { await gen.return(undefined); },
136
+ };
137
+ return gen;
138
+ };
139
+ const unmarshalArgs = (args, params) => unmarshalArgsWith(args, params, {
140
+ observe: (ref) => (notify) => {
141
+ const sub = nextId();
142
+ hostArgObserveSubs.set(sub, notify);
143
+ send({ kind: "arg-subscribe", ref, sub });
144
+ return () => {
145
+ if (hostArgObserveSubs.delete(sub))
146
+ send({ kind: "arg-unsubscribe", sub });
147
+ };
148
+ },
149
+ promise: (ref) => {
150
+ const promise = new Promise((resolve, reject) => argPromiseWaiters.set(ref, { resolve, reject }));
151
+ // Suppress an unhandledRejection if the member never awaits this arg
152
+ // (a rejection/cancellation still surfaces to any real `await`).
153
+ promise.catch(() => undefined);
154
+ return promise;
155
+ },
156
+ generator: (ref) => makeArgGenerator(ref),
157
+ });
158
+ // ---- host-side state (keyed by the REMOTE caller's id) ----
159
+ const exposed = new Map();
160
+ const hostSubs = new Map();
161
+ const hostGens = new Map();
162
+ const hostCtx = { send, exposed, hostSubs, hostGens, canInvoke, onError, unmarshalArgs };
163
+ // ---- caller-side state (keyed by a LOCAL id) ----
164
+ const callPending = new Map();
165
+ const callerSubs = new Map();
166
+ const callerGens = new Map();
167
+ const schemaPending = new Map();
168
+ const availableSchemas = new Map();
169
+ const awaiting = new Map();
170
+ const callerCtx = {
171
+ send,
172
+ nextId,
173
+ callPending,
174
+ callerSubs,
175
+ callerGens,
176
+ defaultTimeoutMs: options.defaultTimeoutMs,
177
+ isClosed: () => closed,
178
+ marshalArgs,
179
+ releaseArgRefs,
180
+ };
181
+ const flushAwaiting = (name, schema) => {
182
+ const waiters = awaiting.get(name);
183
+ if (waiters === undefined)
184
+ return;
185
+ awaiting.delete(name);
186
+ for (const w of waiters)
187
+ w(schema);
188
+ };
189
+ // ---- dispatcher ----
190
+ const unMessage = transport.onMessage((msg) => {
191
+ switch (msg.kind) {
192
+ case "hello": {
193
+ send({ kind: "welcome", protocol: RPC_PROTOCOL_VERSION });
194
+ // Re-announce everything already exposed for a peer that connected late.
195
+ for (const [name, ex] of exposed)
196
+ send({ kind: "available", service: name, schema: ex.schema });
197
+ return;
198
+ }
199
+ case "welcome": {
200
+ if (msg.protocol !== RPC_PROTOCOL_VERSION) {
201
+ onError(new Error(`data-rpc protocol mismatch: local ${RPC_PROTOCOL_VERSION}, peer ${msg.protocol}`));
202
+ }
203
+ return;
204
+ }
205
+ case "available": {
206
+ availableSchemas.set(msg.service, msg.schema);
207
+ flushAwaiting(msg.service, msg.schema);
208
+ return;
209
+ }
210
+ case "unavailable": {
211
+ availableSchemas.delete(msg.service);
212
+ return;
213
+ }
214
+ case "schema": {
215
+ const waiter = schemaPending.get(msg.id);
216
+ if (waiter !== undefined) {
217
+ schemaPending.delete(msg.id);
218
+ waiter(msg.schema);
219
+ }
220
+ return;
221
+ }
222
+ case "resolve": {
223
+ const slot = callPending.get(msg.id);
224
+ if (slot !== undefined) {
225
+ if (slot.timer !== undefined)
226
+ clearTimeout(slot.timer);
227
+ callPending.delete(msg.id);
228
+ releaseArgRefs(msg.id);
229
+ slot.resolve(msg.value);
230
+ }
231
+ return;
232
+ }
233
+ case "reject": {
234
+ const slot = callPending.get(msg.id);
235
+ if (slot !== undefined) {
236
+ if (slot.timer !== undefined)
237
+ clearTimeout(slot.timer);
238
+ callPending.delete(msg.id);
239
+ releaseArgRefs(msg.id);
240
+ slot.reject(reconstructError(msg.error));
241
+ }
242
+ return;
243
+ }
244
+ case "next": {
245
+ callerSubs.get(msg.id)?.(msg.value);
246
+ return;
247
+ }
248
+ case "yield":
249
+ case "done":
250
+ case "throw": {
251
+ const slot = callerGens.get(msg.id);
252
+ const resolvePull = slot?.pulls.shift();
253
+ if (resolvePull === undefined)
254
+ return;
255
+ if (msg.kind === "yield")
256
+ resolvePull({ done: false, value: msg.value });
257
+ else if (msg.kind === "done")
258
+ resolvePull({ done: true, value: msg.value });
259
+ else
260
+ resolvePull({ error: reconstructError(msg.error) });
261
+ return;
262
+ }
263
+ // ---- reverse channel: argument observes ----
264
+ case "arg-subscribe": {
265
+ // We are the CALLER: the callee wants to observe an arg we sent.
266
+ const provider = argObserveProviders.get(msg.ref);
267
+ if (provider === undefined)
268
+ return; // ref already released / unknown
269
+ const unobserve = provider((value) => send({ kind: "arg-next", sub: msg.sub, value }));
270
+ argObserveSubs.set(msg.sub, { unobserve, ref: msg.ref });
271
+ return;
272
+ }
273
+ case "arg-next": {
274
+ // We are the CALLEE: a value arrived for a remote arg observe we subscribed to.
275
+ hostArgObserveSubs.get(msg.sub)?.(msg.value);
276
+ return;
277
+ }
278
+ case "arg-unsubscribe": {
279
+ // We are the CALLER: the callee unsubscribed from an arg observe.
280
+ const entry = argObserveSubs.get(msg.sub);
281
+ if (entry !== undefined) {
282
+ entry.unobserve();
283
+ argObserveSubs.delete(msg.sub);
284
+ }
285
+ return;
286
+ }
287
+ // ---- reverse channel: argument promises ----
288
+ case "arg-resolve": {
289
+ // We are the CALLEE: a remote arg promise settled.
290
+ const waiter = argPromiseWaiters.get(msg.ref);
291
+ if (waiter !== undefined) {
292
+ argPromiseWaiters.delete(msg.ref);
293
+ waiter.resolve(msg.value);
294
+ }
295
+ return;
296
+ }
297
+ case "arg-reject": {
298
+ const waiter = argPromiseWaiters.get(msg.ref);
299
+ if (waiter !== undefined) {
300
+ argPromiseWaiters.delete(msg.ref);
301
+ waiter.reject(reconstructError(msg.error));
302
+ }
303
+ return;
304
+ }
305
+ // ---- reverse channel: argument generators ----
306
+ case "arg-pull": {
307
+ // We are the CALLER: the callee pulled the next value from an arg generator.
308
+ const gen = argGenProviders.get(msg.ref);
309
+ if (gen === undefined) {
310
+ // Provider released (op completed) or unknown — tell the callee it's done
311
+ // so its `for await` terminates instead of hanging.
312
+ send({ kind: "arg-done", ref: msg.ref });
313
+ return;
314
+ }
315
+ gen.next().then((result) => {
316
+ if (result.done) {
317
+ argGenProviders.delete(msg.ref);
318
+ send({ kind: "arg-done", ref: msg.ref, value: result.value ?? undefined });
319
+ }
320
+ else {
321
+ send({ kind: "arg-yield", ref: msg.ref, value: result.value });
322
+ }
323
+ }, (error) => {
324
+ argGenProviders.delete(msg.ref);
325
+ send({ kind: "arg-throw", ref: msg.ref, error: marshalError(error) });
326
+ });
327
+ return;
328
+ }
329
+ case "arg-yield":
330
+ case "arg-done":
331
+ case "arg-throw": {
332
+ // We are the CALLEE: a pull on a remote arg generator was answered.
333
+ const slot = argGenSlots.get(msg.ref);
334
+ const resolvePull = slot?.pulls.shift();
335
+ if (resolvePull === undefined)
336
+ return;
337
+ if (msg.kind === "arg-yield")
338
+ resolvePull({ done: false, value: msg.value });
339
+ else if (msg.kind === "arg-done")
340
+ resolvePull({ done: true, value: msg.value });
341
+ else
342
+ resolvePull({ error: reconstructError(msg.error) });
343
+ return;
344
+ }
345
+ case "arg-return": {
346
+ // We are the CALLER: the callee ended an arg generator early.
347
+ const gen = argGenProviders.get(msg.ref);
348
+ argGenProviders.delete(msg.ref);
349
+ void gen?.return(undefined).catch((error) => onError(error));
350
+ return;
351
+ }
352
+ case "arg-raise": {
353
+ const gen = argGenProviders.get(msg.ref);
354
+ argGenProviders.delete(msg.ref);
355
+ void gen?.throw(reconstructError(msg.error)).catch(() => undefined);
356
+ return;
357
+ }
358
+ default:
359
+ // A request kind — route to the host side.
360
+ handleHostRequest(hostCtx, msg);
361
+ return;
362
+ }
363
+ });
364
+ const teardown = () => {
365
+ if (closed)
366
+ return;
367
+ closed = true;
368
+ // Caller side: pending calls reject; observes drop (no error channel);
369
+ // generators end gracefully (pending pulls resolve `done`).
370
+ for (const [, slot] of callPending) {
371
+ if (slot.timer !== undefined)
372
+ clearTimeout(slot.timer);
373
+ slot.reject(new Error("data-rpc endpoint closed"));
374
+ }
375
+ callPending.clear();
376
+ callerSubs.clear();
377
+ for (const [, slot] of callerGens) {
378
+ for (const resolvePull of slot.pulls.splice(0))
379
+ resolvePull({ done: true, value: undefined });
380
+ }
381
+ callerGens.clear();
382
+ for (const [, waiter] of schemaPending)
383
+ waiter(null);
384
+ schemaPending.clear();
385
+ awaiting.clear();
386
+ // Host side: release every subscription and generator.
387
+ for (const [, unobserve] of hostSubs)
388
+ unobserve();
389
+ hostSubs.clear();
390
+ for (const [, gen] of hostGens)
391
+ void gen.return(undefined).catch(() => undefined);
392
+ hostGens.clear();
393
+ // Reverse channel: release every arg-constructor provider and reconstruction.
394
+ for (const [, entry] of argObserveSubs)
395
+ entry.unobserve();
396
+ argObserveSubs.clear();
397
+ argObserveProviders.clear();
398
+ argPromiseProviders.clear();
399
+ for (const [, gen] of argGenProviders)
400
+ void gen.return(undefined).catch(() => undefined);
401
+ argGenProviders.clear();
402
+ callArgRefs.clear();
403
+ hostArgObserveSubs.clear();
404
+ for (const [, waiter] of argPromiseWaiters)
405
+ waiter.reject(new Error("data-rpc endpoint closed"));
406
+ argPromiseWaiters.clear();
407
+ for (const [, slot] of argGenSlots) {
408
+ for (const resolvePull of slot.pulls.splice(0))
409
+ resolvePull({ done: true, value: undefined });
410
+ }
411
+ argGenSlots.clear();
412
+ unMessage();
413
+ };
414
+ transport.onClose(teardown);
415
+ // Initiate the handshake.
416
+ send({ kind: "hello", protocol: RPC_PROTOCOL_VERSION });
417
+ const expose = (name, service, schema) => {
418
+ // The type gate proves `schema` exactly describes `service`; store the plain schema.
419
+ const plainSchema = schema;
420
+ exposed.set(name, { service, schema: plainSchema });
421
+ send({ kind: "available", service: name, schema: plainSchema });
422
+ return () => {
423
+ if (exposed.delete(name))
424
+ send({ kind: "unavailable", service: name });
425
+ };
426
+ };
427
+ // Single implementation backing both `consume` overloads.
428
+ function consume(name, schema) {
429
+ if (schema !== undefined) {
430
+ return synthesizeService(callerCtx, name, schema);
431
+ }
432
+ const known = availableSchemas.get(name);
433
+ if (known !== undefined) {
434
+ return Promise.resolve(synthesizeService(callerCtx, name, known));
435
+ }
436
+ return new Promise((resolve) => {
437
+ const waiters = awaiting.get(name) ?? [];
438
+ waiters.push((s) => resolve(synthesizeService(callerCtx, name, s)));
439
+ awaiting.set(name, waiters);
440
+ // Proactively fetch in case the service is exposed but we missed the
441
+ // announcement (e.g. we connected after it was exposed).
442
+ const id = nextId();
443
+ schemaPending.set(id, (s) => {
444
+ if (s !== null) {
445
+ availableSchemas.set(name, s);
446
+ flushAwaiting(name, s);
447
+ }
448
+ // s === null: not yet exposed — keep waiting for a future `available`.
449
+ });
450
+ send({ kind: "get-schema", id, service: name });
451
+ });
452
+ }
453
+ return {
454
+ expose,
455
+ consume: consume,
456
+ close() {
457
+ teardown();
458
+ transport.close();
459
+ },
460
+ };
461
+ }
462
+ //# sourceMappingURL=create-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-endpoint.js","sourceRoot":"","sources":["../src/create-endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { Schema } from "@adobe/data/schema";
2
+ import { type Service } from "@adobe/data/service";
3
+ import type { EquivalentTypes } from "@adobe/data/types";
4
+ /**
5
+ * The `expose` gate: the schema must describe the service's members EXACTLY
6
+ * (same shape as `createLazy`'s check). This is what keeps the wire `Data`-only —
7
+ * describe members with `Data` leaves plus the `observe`/`promise`/`generator`/
8
+ * `function` constructors (an `Observe` argument is shimmed via the reverse
9
+ * channel; a genuinely non-`Data` leaf like `Response` would throw when marshaled).
10
+ */
11
+ type SchemaDescribesService<T extends Service, S extends Schema> = EquivalentTypes<Schema.ToType<S>, Omit<T, keyof Service>>;
12
+ /** Options for {@link createRpcEndpoint}. */
13
+ export interface RpcEndpointOptions {
14
+ /**
15
+ * Authorization seam — return `false` to refuse a member call from the peer.
16
+ * Defaults to allow-all. This is where per-member policy (e.g.
17
+ * `Schema.resolveExternalInvocation`) drops in; it is SEPARATE from the
18
+ * argument validation the host always performs against `signature.parameters`.
19
+ */
20
+ readonly canInvoke?: (service: string, member: string) => boolean;
21
+ /**
22
+ * If set, a consumed promise call rejects after this many ms with no reply,
23
+ * so a wedged (but not closed) transport can't hang a call forever.
24
+ */
25
+ readonly defaultTimeoutMs?: number;
26
+ /**
27
+ * Receives errors that have no wire channel back to the caller — a throw in a
28
+ * host `void` handler, a refused/failed `subscribe`, or a generator cleanup
29
+ * failure. Defaults to `console.error`.
30
+ */
31
+ readonly onError?: (error: unknown) => void;
32
+ }
33
+ /**
34
+ * A bidirectional RPC endpoint over one transport. Each endpoint can both
35
+ * `expose` local services to the peer and `consume` the peer's services; the
36
+ * channel is symmetric.
37
+ */
38
+ export interface RpcEndpoint {
39
+ /**
40
+ * Expose a local service to the peer. The `schema` must be a valid
41
+ * `AsyncDataService` schema that EXACTLY describes `service` — this is what
42
+ * guarantees only `Data` ever crosses the wire; a mismatch is a compile
43
+ * error carrying an `__rpcError` marker. Returns a teardown that stops new
44
+ * calls (and announces the service unavailable).
45
+ */
46
+ expose<T extends Service, const S extends Schema>(name: string, service: T, schema: S & (SchemaDescribesService<T, S> extends true ? unknown : {
47
+ readonly __rpcError: "data-rpc: schema must describe the service exactly (Data leaves + observe/promise/generator/function constructors)";
48
+ })): () => void;
49
+ /**
50
+ * Consume a peer service using a compile-time schema constant — returns a
51
+ * fully-typed projected service synchronously. The returned type reflects
52
+ * `Schema.ToType<S>` (deep-readonly, defaults widened), not necessarily the
53
+ * peer's hand-authored interface.
54
+ */
55
+ consume<const S extends Schema>(name: string, schema: S): Schema.ToType<S> & Service;
56
+ /**
57
+ * Consume a peer service whose schema is fetched at runtime — resolves once
58
+ * the peer has exposed it (safe to call before the peer exposes).
59
+ */
60
+ consume(name: string): Promise<Service>;
61
+ /** Tear down the endpoint: reject pending calls, end subscriptions/generators, close the transport. */
62
+ close(): void;
63
+ }
64
+ export {};
@@ -0,0 +1,3 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export {};
3
+ //# sourceMappingURL=endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
@@ -0,0 +1,28 @@
1
+ import type { Data } from "@adobe/data";
2
+ import type { Unobserve } from "@adobe/data/observe";
3
+ import type { Schema } from "@adobe/data/schema";
4
+ import type { Service } from "@adobe/data/service";
5
+ import type { RpcMessage } from "../protocol.js";
6
+ /** One exposed service and the schema that describes (and validates) its surface. */
7
+ export interface ExposedService {
8
+ readonly service: Service;
9
+ readonly schema: Schema;
10
+ }
11
+ /**
12
+ * The host-side surface the request handler operates on. `hostSubs`/`hostGens`
13
+ * are keyed by the REMOTE caller's id (separate from the local caller tables),
14
+ * so the same numeric id can be live in both directions without collision.
15
+ */
16
+ export interface HostContext {
17
+ readonly send: (msg: RpcMessage) => void;
18
+ readonly exposed: Map<string, ExposedService>;
19
+ readonly hostSubs: Map<number, Unobserve>;
20
+ readonly hostGens: Map<number, AsyncGenerator<Data>>;
21
+ readonly canInvoke: (service: string, member: string) => boolean;
22
+ readonly onError: (error: unknown) => void;
23
+ /**
24
+ * Transform incoming args: reconstruct any arg-observe ref (guided by
25
+ * `params`) into a local `Observe` that pulls values back from the caller.
26
+ */
27
+ readonly unmarshalArgs: (args: readonly Data[], params: readonly Schema[] | undefined) => unknown[];
28
+ }
@@ -0,0 +1,3 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ export {};
3
+ //# sourceMappingURL=host-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-context.js","sourceRoot":"","sources":["../../src/host/host-context.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
@@ -0,0 +1,8 @@
1
+ import type { RpcError } from "../protocol.js";
2
+ /**
3
+ * Serialize a thrown value into the three wire-safe fields of {@link RpcError}.
4
+ * We never structured-clone the thrown value itself — that would drop its
5
+ * subclass prototype and any non-standard properties, and a non-`Error` throw
6
+ * (a string, an object) may not clone at all.
7
+ */
8
+ export declare function marshalError(error: unknown): RpcError;
@@ -0,0 +1,15 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+ /**
3
+ * Serialize a thrown value into the three wire-safe fields of {@link RpcError}.
4
+ * We never structured-clone the thrown value itself — that would drop its
5
+ * subclass prototype and any non-standard properties, and a non-`Error` throw
6
+ * (a string, an object) may not clone at all.
7
+ */
8
+ export function marshalError(error) {
9
+ if (error instanceof Error) {
10
+ return { name: error.name, message: error.message, stack: error.stack };
11
+ }
12
+ // Non-Error throws (strings, plain objects): stringify into `message`.
13
+ return { name: "Error", message: typeof error === "string" ? error : String(error) };
14
+ }
15
+ //# sourceMappingURL=marshal-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marshal-error.js","sourceRoot":"","sources":["../../src/host/marshal-error.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAIvD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5E,CAAC;IACD,uEAAuE;IACvE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACzF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { RpcMessage } from "../protocol.js";
2
+ import type { HostContext } from "./host-context.js";
3
+ /**
4
+ * Handle one incoming REQUEST message against the host's exposed services.
5
+ * Response/announcement kinds are handled elsewhere (the caller side); this
6
+ * covers get-schema, call, send, subscribe/unsubscribe, and the pull-based
7
+ * generator lifecycle. Returns `true` if the message was a host request it
8
+ * handled, `false` otherwise (so the endpoint can route it to the caller side).
9
+ */
10
+ export declare function handleHostRequest(ctx: HostContext, msg: RpcMessage): boolean;