@relaycast/engine 5.1.1 → 6.0.1

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 (70) hide show
  1. package/dist/adapters/node/database.d.ts.map +1 -1
  2. package/dist/adapters/node/database.js +204 -27
  3. package/dist/adapters/node/database.js.map +1 -1
  4. package/dist/adapters/node/realtime.d.ts +29 -1
  5. package/dist/adapters/node/realtime.d.ts.map +1 -1
  6. package/dist/adapters/node/realtime.js +241 -50
  7. package/dist/adapters/node/realtime.js.map +1 -1
  8. package/dist/auth/tokenKind.d.ts +1 -1
  9. package/dist/auth/tokenKind.d.ts.map +1 -1
  10. package/dist/auth/tokenKind.js +4 -1
  11. package/dist/auth/tokenKind.js.map +1 -1
  12. package/dist/db/migrations/0028_node_providers.sql +55 -0
  13. package/dist/db/schema.d.ts +376 -0
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +59 -1
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/engine/action.d.ts +47 -1
  18. package/dist/engine/action.d.ts.map +1 -1
  19. package/dist/engine/action.js +342 -43
  20. package/dist/engine/action.js.map +1 -1
  21. package/dist/engine/delivery.d.ts.map +1 -1
  22. package/dist/engine/delivery.js +2 -1
  23. package/dist/engine/delivery.js.map +1 -1
  24. package/dist/engine/node.d.ts +71 -28
  25. package/dist/engine/node.d.ts.map +1 -1
  26. package/dist/engine/node.js +357 -189
  27. package/dist/engine/node.js.map +1 -1
  28. package/dist/engine/nodeContext.d.ts.map +1 -1
  29. package/dist/engine/nodeContext.js +17 -6
  30. package/dist/engine/nodeContext.js.map +1 -1
  31. package/dist/engine/nodeDeliver.d.ts.map +1 -1
  32. package/dist/engine/nodeDeliver.js +4 -1
  33. package/dist/engine/nodeDeliver.js.map +1 -1
  34. package/dist/engine/nodeLock.d.ts +2 -0
  35. package/dist/engine/nodeLock.d.ts.map +1 -0
  36. package/dist/engine/nodeLock.js +31 -0
  37. package/dist/engine/nodeLock.js.map +1 -0
  38. package/dist/engine/nodeProvider.d.ts +62 -0
  39. package/dist/engine/nodeProvider.d.ts.map +1 -0
  40. package/dist/engine/nodeProvider.js +256 -0
  41. package/dist/engine/nodeProvider.js.map +1 -0
  42. package/dist/engine/placement.d.ts +10 -0
  43. package/dist/engine/placement.d.ts.map +1 -1
  44. package/dist/engine/placement.js +10 -0
  45. package/dist/engine/placement.js.map +1 -1
  46. package/dist/engine/trigger.d.ts.map +1 -1
  47. package/dist/engine/trigger.js +17 -3
  48. package/dist/engine/trigger.js.map +1 -1
  49. package/dist/middleware/auth.d.ts +6 -0
  50. package/dist/middleware/auth.d.ts.map +1 -1
  51. package/dist/middleware/auth.js +6 -0
  52. package/dist/middleware/auth.js.map +1 -1
  53. package/dist/node-control.d.ts +1 -1
  54. package/dist/node-control.d.ts.map +1 -1
  55. package/dist/node-control.js +11 -1
  56. package/dist/node-control.js.map +1 -1
  57. package/dist/ports/auth.d.ts +1 -1
  58. package/dist/ports/auth.d.ts.map +1 -1
  59. package/dist/ports/realtime.d.ts +30 -2
  60. package/dist/ports/realtime.d.ts.map +1 -1
  61. package/dist/routes/deliveryRouting.d.ts.map +1 -1
  62. package/dist/routes/deliveryRouting.js +6 -1
  63. package/dist/routes/deliveryRouting.js.map +1 -1
  64. package/dist/routes/message.d.ts.map +1 -1
  65. package/dist/routes/message.js +44 -14
  66. package/dist/routes/message.js.map +1 -1
  67. package/dist/routes/node.d.ts.map +1 -1
  68. package/dist/routes/node.js +92 -3
  69. package/dist/routes/node.js.map +1 -1
  70. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,qBAAqB,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,YAAY,CAAC;IACjB,4EAA4E;IAC5E,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CA8CxD;AAwBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuC3E"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,qBAAqB,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,YAAY,CAAC;IACjB,4EAA4E;IAC5E,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAexD;AA0PD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuC3E"}
@@ -1,3 +1,4 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
1
2
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
3
  import { dirname, join } from 'node:path';
3
4
  import { fileURLToPath } from 'node:url';
@@ -17,47 +18,223 @@ export function getSqliteDb(path) {
17
18
  const sqlite = new Database(path);
18
19
  configureSqlite(sqlite, { enableWal: true });
19
20
  const db = drizzle(sqlite, { schema });
20
- const isolatedTransactions = path !== ':memory:';
21
- // Attach the transaction capability (`runAtomicWrites` detects it on the
22
- // handle and prefers it over a batch).
23
- //
24
- // Drizzle's better-sqlite3 `db.transaction()` requires a synchronous
25
- // callback (better-sqlite3's native wrapper commits when the sync call
26
- // returns), but engine write paths are async. For file-backed databases we
27
- // therefore open the transaction on a short-lived, dedicated connection so
28
- // unrelated statements on the main handle cannot join the open transaction.
29
- // `:memory:` databases are connection-local, so tests keep the shared
30
- // connection while still serializing transactional callers.
21
+ // `:memory:` databases are connection-local: a transaction and a raw write
22
+ // share the same connection, so there is no cross-connection lock contention
23
+ // and no event-loop-freezing busy-wait. Keep the shared connection and only
24
+ // serialize transactional callers.
25
+ if (path === ':memory:') {
26
+ attachMemoryTransaction(db, sqlite);
27
+ return { db, sqlite };
28
+ }
29
+ return { db: withFileWriteGate(db, path), sqlite };
30
+ }
31
+ const noop = () => { };
32
+ function isThenable(value) {
33
+ return (typeof value === 'object' &&
34
+ value !== null &&
35
+ typeof value.then === 'function');
36
+ }
37
+ /**
38
+ * `:memory:` transaction capability: interactive transactions on the shared
39
+ * connection, serialized so concurrent callers don't interleave `BEGIN`s.
40
+ */
41
+ function attachMemoryTransaction(db, sqlite) {
31
42
  let txTail = Promise.resolve();
32
43
  db.withTransaction = (fn) => {
33
44
  const run = async () => {
34
- const txSqlite = isolatedTransactions ? new Database(path) : sqlite;
45
+ sqlite.exec('BEGIN IMMEDIATE');
35
46
  try {
36
- if (isolatedTransactions)
37
- configureSqlite(txSqlite);
38
- const txDb = (isolatedTransactions
39
- ? drizzle(txSqlite, { schema })
40
- : db);
41
- txSqlite.exec('BEGIN IMMEDIATE');
42
- const result = await fn(txDb);
43
- txSqlite.exec('COMMIT');
47
+ const result = await fn(db);
48
+ sqlite.exec('COMMIT');
44
49
  return result;
45
50
  }
46
51
  catch (err) {
47
- if (txSqlite.inTransaction)
48
- txSqlite.exec('ROLLBACK');
52
+ if (sqlite.inTransaction)
53
+ sqlite.exec('ROLLBACK');
49
54
  throw err;
50
55
  }
56
+ };
57
+ const result = txTail.then(run);
58
+ txTail = result.then(noop, noop);
59
+ return result;
60
+ };
61
+ }
62
+ /**
63
+ * File-backed transaction capability plus a single async write gate.
64
+ *
65
+ * better-sqlite3 is synchronous, so a raw write that finds the database locked
66
+ * blocks the entire Node event loop on `busy_timeout`. A transaction body runs
67
+ * async (engine write paths `await` inside it), so it holds `BEGIN IMMEDIATE`'s
68
+ * write lock across awaits on its own short-lived connection. If a raw write on
69
+ * the main connection busy-waits for that lock, the event loop freezes and the
70
+ * lock-holding transaction can never progress to `COMMIT` — the raw write times
71
+ * out with `SQLITE_BUSY` and its losing statement rolls back with the error
72
+ * swallowed by the caller. Under concurrency (two nodes registering at once)
73
+ * this silently drops a provider registration.
74
+ *
75
+ * Funnelling *every* write — raw statement writes on the main connection and
76
+ * transaction bodies alike — through one serialization chain guarantees that no
77
+ * raw write ever executes while a transaction holds the lock. Writes never
78
+ * contend, `busy_timeout` stops being load-bearing, and the transaction always
79
+ * commits. Reads stay ungated: WAL readers never block the single writer.
80
+ */
81
+ function withFileWriteGate(db, path) {
82
+ let writeGate = Promise.resolve();
83
+ // Marks the async context of a write that currently holds the gate. A nested
84
+ // gated write (e.g. a statement built from this handle awaited inside a
85
+ // `withTransaction` body) would queue behind the very transaction that is
86
+ // awaiting it — a self-deadlock. Such a write also belongs on the
87
+ // transaction's own connection, not this handle's; reject it loudly instead.
88
+ //
89
+ // The marker is a per-run token cleared when its task settles, not a bare
90
+ // `true`: AsyncLocalStorage propagates the store to every descendant context,
91
+ // so a detached async resource created inside a transaction body would inherit
92
+ // it forever. Keying on `active` restricts rejection to writes issued *while*
93
+ // the enclosing task is still running; a leaked descendant that writes after
94
+ // the transaction commits gates normally.
95
+ const gateHeld = new AsyncLocalStorage();
96
+ const runGated = (task) => {
97
+ if (gateHeld.getStore()?.active) {
98
+ return Promise.reject(new Error('write issued through the engine handle inside a transaction; use the ' +
99
+ 'transaction handle (tx) for writes inside withTransaction/runAtomic'));
100
+ }
101
+ const token = { active: true };
102
+ const runTask = async () => {
103
+ try {
104
+ return await task();
105
+ }
51
106
  finally {
52
- if (isolatedTransactions)
53
- txSqlite.close();
107
+ token.active = false;
54
108
  }
55
109
  };
56
- const result = txTail.then(run);
57
- txTail = result.then(() => undefined, () => undefined);
110
+ const result = writeGate.then(() => gateHeld.run(token, runTask));
111
+ // The chain must survive an individual failure so later writes still run.
112
+ writeGate = result.then(noop, noop);
58
113
  return result;
59
114
  };
60
- return { db, sqlite };
115
+ // Interactive transactions run on a dedicated short-lived connection so
116
+ // unrelated statements can't join the open transaction. `runAtomicWrites`
117
+ // detects this capability and prefers it over a batch.
118
+ db.withTransaction = (fn) => runGated(async () => {
119
+ const txSqlite = new Database(path);
120
+ try {
121
+ configureSqlite(txSqlite);
122
+ const txDb = drizzle(txSqlite, { schema });
123
+ txSqlite.exec('BEGIN IMMEDIATE');
124
+ try {
125
+ const result = await fn(txDb);
126
+ txSqlite.exec('COMMIT');
127
+ return result;
128
+ }
129
+ catch (err) {
130
+ if (txSqlite.inTransaction)
131
+ txSqlite.exec('ROLLBACK');
132
+ throw err;
133
+ }
134
+ }
135
+ finally {
136
+ txSqlite.close();
137
+ }
138
+ });
139
+ return gateRawWrites(db, runGated);
140
+ }
141
+ /**
142
+ * Every method on `BaseSQLiteDatabase` that executes SQL directly on the main
143
+ * connection — including raw statements that may carry `RETURNING` writes and
144
+ * drizzle's native interactive `transaction`. Each is deferred behind the gate.
145
+ * `insert`/`update`/`delete` are handled separately (they return lazy builders).
146
+ */
147
+ const GATED_HANDLE_EXECUTORS = new Set(['run', 'all', 'get', 'values', 'transaction']);
148
+ /**
149
+ * Wrap the main-connection handle so raw statement writes route through the
150
+ * write gate. `insert`/`update`/`delete` return lazy drizzle builders, so the
151
+ * builder is wrapped and gated at its execution seam; the direct executors
152
+ * ({@link GATED_HANDLE_EXECUTORS}) run on call, so the whole call is deferred
153
+ * behind the gate. Query-builder reads (`db.select()...`) and every other member
154
+ * run directly against the main connection — WAL readers never block the writer.
155
+ */
156
+ function gateRawWrites(db, runGated) {
157
+ return new Proxy(db, {
158
+ get(target, prop) {
159
+ const value = Reflect.get(target, prop, target);
160
+ if (typeof value !== 'function')
161
+ return value;
162
+ if (typeof prop === 'string' && GATED_HANDLE_EXECUTORS.has(prop)) {
163
+ return (...args) => runGated(() => value.apply(target, args));
164
+ }
165
+ if (prop === 'insert' || prop === 'update' || prop === 'delete') {
166
+ return (...args) => gateWriteBuilder(value.apply(target, args), runGated);
167
+ }
168
+ // Binding to `target` keeps read builders and helpers running against the
169
+ // real handle rather than leaking the proxy into their `this`.
170
+ return value.bind(target);
171
+ },
172
+ });
173
+ }
174
+ /** Terminal executors on a thenable drizzle statement (and on a prepared query). */
175
+ const GATED_STATEMENT_EXECUTORS = new Set(['execute', 'run', 'all', 'get', 'values']);
176
+ /**
177
+ * Wrap a drizzle write-statement builder so its execution runs inside the write
178
+ * gate. Drizzle builders are lazy — SQL runs only when the promise protocol
179
+ * (`then`/`catch`/`finally`), an explicit executor ({@link
180
+ * GATED_STATEMENT_EXECUTORS}), or a `prepare()`d statement's executor fires.
181
+ * Every one of those seams is gated; chain methods (`set`/`where`/`returning`/
182
+ * `onConflict*`, and `values`/`set` on the pre-thenable builder) are re-wrapped
183
+ * so whichever stage the caller finally awaits still routes through the gate.
184
+ *
185
+ * `values` is ambiguous: on the pre-thenable insert builder it sets rows (a
186
+ * chain step); on a thenable statement it is a placeholder executor. The
187
+ * `targetThenable` guard routes each correctly.
188
+ */
189
+ function gateWriteBuilder(builder, runGated) {
190
+ const targetThenable = isThenable(builder);
191
+ return new Proxy(builder, {
192
+ get(target, prop) {
193
+ if (targetThenable && (prop === 'then' || prop === 'catch' || prop === 'finally')) {
194
+ // Await the raw builder inside the gate — that is where SQL executes.
195
+ const gated = () => runGated(() => Promise.resolve(target));
196
+ if (prop === 'then') {
197
+ return (onF, onR) => gated().then(onF, onR);
198
+ }
199
+ if (prop === 'catch') {
200
+ return (onR) => gated().catch(onR);
201
+ }
202
+ return (onFinally) => gated().finally(onFinally);
203
+ }
204
+ const value = Reflect.get(target, prop, target);
205
+ if (typeof value !== 'function')
206
+ return value;
207
+ if (targetThenable && typeof prop === 'string' && GATED_STATEMENT_EXECUTORS.has(prop)) {
208
+ return (...args) => runGated(() => value.apply(target, args));
209
+ }
210
+ // `prepare()` returns a reusable prepared query whose own executors run
211
+ // SQL; gate them so a prepared write can't bypass the gate either.
212
+ if (prop === 'prepare') {
213
+ return (...args) => gatePreparedStatement(value.apply(target, args), runGated);
214
+ }
215
+ return (...args) => {
216
+ const result = value.apply(target, args);
217
+ return isThenable(result) ? gateWriteBuilder(result, runGated) : result;
218
+ };
219
+ },
220
+ });
221
+ }
222
+ /**
223
+ * Wrap a drizzle prepared statement (from `statement.prepare()`) so its
224
+ * executors run inside the write gate, matching the un-prepared path.
225
+ */
226
+ function gatePreparedStatement(prepared, runGated) {
227
+ return new Proxy(prepared, {
228
+ get(target, prop) {
229
+ const value = Reflect.get(target, prop, target);
230
+ if (typeof value !== 'function')
231
+ return value;
232
+ if (typeof prop === 'string' && GATED_STATEMENT_EXECUTORS.has(prop)) {
233
+ return (...args) => runGated(() => value.apply(target, args));
234
+ }
235
+ return value.bind(target);
236
+ },
237
+ });
61
238
  }
62
239
  function configureSqlite(sqlite, options = {}) {
63
240
  if (options.enableWal)
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"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"}
@@ -26,14 +26,31 @@ export interface SocketHandle {
26
26
  export declare class InProcessRealtime implements RealtimeBus, ConnectionRegistry, NodeConnectionRegistry {
27
27
  private readonly db;
28
28
  private readonly workspaceSockets;
29
- private readonly nodeSockets;
29
+ /** Every attached node control connection, keyed by its registry connection id. */
30
+ private readonly nodeConnections;
31
+ /** All connection ids attached to a node (bound to a provider or not yet). */
32
+ private readonly nodeConnIndex;
33
+ /** Per node, the connection id currently bound to each provider name. */
34
+ private readonly providerIndex;
35
+ /** Per-provider queued `action.invoke` frames (`workspace:node::provider`). */
30
36
  private readonly nodeQueues;
31
37
  /** Serializes drains per node so concurrent triggers never overlap. */
32
38
  private readonly nodeDrainChains;
33
39
  private nodeCompletionDeps;
40
+ private connectionSeq;
34
41
  constructor(db: EngineDb);
35
42
  setNodeCompletionDeps(deps: InvocationCompletionDeps): void;
36
43
  private nodeKey;
44
+ private providerQueueKey;
45
+ private providerConnId;
46
+ private providerSocket;
47
+ /**
48
+ * The provider a node-addressed message targets when none is specified: the
49
+ * `default` provider if attached, otherwise any currently-attached provider.
50
+ * Never returns a name that is not in the index, so node-level sends do not
51
+ * silently target a phantom provider. `undefined` means nothing is attached.
52
+ */
53
+ private defaultProviderName;
37
54
  publishToWorkspaceStream(args: {
38
55
  workspaceId: string;
39
56
  event: EngineEvent;
@@ -48,12 +65,23 @@ export declare class InProcessRealtime implements RealtimeBus, ConnectionRegistr
48
65
  upgrade(_args: UpgradeArgs): Promise<Response>;
49
66
  upgradeNode(_args: NodeUpgradeArgs): Promise<Response>;
50
67
  sendToNode(workspaceId: string, nodeId: string, message: FleetRelaycastToBrokerMessage): Promise<boolean>;
68
+ sendToProvider(workspaceId: string, nodeId: string, providerName: string, message: FleetRelaycastToBrokerMessage): Promise<boolean>;
51
69
  isNodeConnected(workspaceId: string, nodeId: string): boolean;
70
+ isProviderConnected(workspaceId: string, nodeId: string, providerName: string): boolean;
71
+ isProviderAttached(workspaceId: string, nodeId: string, providerName: string): boolean;
72
+ providerNameForConnection(connectionId: string): string | undefined;
73
+ providerAttachConflict(workspaceId: string, nodeId: string, providerName: string, instanceId: string, connectionId: string): {
74
+ code: string;
75
+ message: string;
76
+ } | null;
77
+ attachProvider(workspaceId: string, nodeId: string, providerName: string, instanceId: string, connectionId: string): void;
78
+ detachProvider(workspaceId: string, nodeId: string, providerName: string): void;
52
79
  disconnectNode(workspaceId: string, nodeId: string): Promise<void>;
53
80
  /** Register a live workspace-stream socket; returns handlers the transport drives. */
54
81
  attachWorkspaceSocket(workspaceId: string, socket: EngineSocket, observerToken?: ObserverToken): SocketHandle;
55
82
  /** Register a live fleet node control socket; returns handlers the transport drives. */
56
83
  attachNodeSocket(workspaceId: string, nodeId: string, socket: EngineSocket): SocketHandle;
84
+ private onNodeConnectionClose;
57
85
  /**
58
86
  * Public, serialized drain entrypoint. Concurrent calls for the same node are
59
87
  * chained so two drains never run at once (which could double-reserve spawn
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,eAAe,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA0BD;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,WAAW,EAAE,kBAAkB,EAAE,sBAAsB;IAQnF,OAAO,CAAC,QAAQ,CAAC,EAAE;IAP/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAC1E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0C;IACrE,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,kBAAkB,CAAuC;gBAEpC,EAAE,EAAE,QAAQ;IAEzC,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAI3D,OAAO,CAAC,OAAO;IAIT,wBAAwB,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChG;;;;;OAKG;YACW,uBAAuB;IAmB/B,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS9C,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAItD,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC;IA0BnB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIvD,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,sFAAsF;IACtF,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,YAAY;IAqB7G,wFAAwF;IACxF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY;IAoCzF;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW/C,cAAc;YAQd,kBAAkB;CAQjC"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"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"}