@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.
- package/dist/adapters/node/database.d.ts.map +1 -1
- package/dist/adapters/node/database.js +204 -27
- package/dist/adapters/node/database.js.map +1 -1
- package/dist/adapters/node/realtime.d.ts +29 -1
- package/dist/adapters/node/realtime.d.ts.map +1 -1
- package/dist/adapters/node/realtime.js +241 -50
- package/dist/adapters/node/realtime.js.map +1 -1
- package/dist/auth/tokenKind.d.ts +1 -1
- package/dist/auth/tokenKind.d.ts.map +1 -1
- package/dist/auth/tokenKind.js +4 -1
- package/dist/auth/tokenKind.js.map +1 -1
- package/dist/db/migrations/0028_node_providers.sql +55 -0
- package/dist/db/schema.d.ts +376 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +59 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/action.d.ts +47 -1
- package/dist/engine/action.d.ts.map +1 -1
- package/dist/engine/action.js +342 -43
- package/dist/engine/action.js.map +1 -1
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +2 -1
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/node.d.ts +71 -28
- package/dist/engine/node.d.ts.map +1 -1
- package/dist/engine/node.js +357 -189
- package/dist/engine/node.js.map +1 -1
- package/dist/engine/nodeContext.d.ts.map +1 -1
- package/dist/engine/nodeContext.js +17 -6
- package/dist/engine/nodeContext.js.map +1 -1
- package/dist/engine/nodeDeliver.d.ts.map +1 -1
- package/dist/engine/nodeDeliver.js +4 -1
- package/dist/engine/nodeDeliver.js.map +1 -1
- package/dist/engine/nodeLock.d.ts +2 -0
- package/dist/engine/nodeLock.d.ts.map +1 -0
- package/dist/engine/nodeLock.js +31 -0
- package/dist/engine/nodeLock.js.map +1 -0
- package/dist/engine/nodeProvider.d.ts +62 -0
- package/dist/engine/nodeProvider.d.ts.map +1 -0
- package/dist/engine/nodeProvider.js +256 -0
- package/dist/engine/nodeProvider.js.map +1 -0
- package/dist/engine/placement.d.ts +10 -0
- package/dist/engine/placement.d.ts.map +1 -1
- package/dist/engine/placement.js +10 -0
- package/dist/engine/placement.js.map +1 -1
- package/dist/engine/trigger.d.ts.map +1 -1
- package/dist/engine/trigger.js +17 -3
- package/dist/engine/trigger.js.map +1 -1
- package/dist/middleware/auth.d.ts +6 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +6 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/node-control.d.ts +1 -1
- package/dist/node-control.d.ts.map +1 -1
- package/dist/node-control.js +11 -1
- package/dist/node-control.js.map +1 -1
- package/dist/ports/auth.d.ts +1 -1
- package/dist/ports/auth.d.ts.map +1 -1
- package/dist/ports/realtime.d.ts +30 -2
- package/dist/ports/realtime.d.ts.map +1 -1
- package/dist/routes/deliveryRouting.d.ts.map +1 -1
- package/dist/routes/deliveryRouting.js +6 -1
- package/dist/routes/deliveryRouting.js.map +1 -1
- package/dist/routes/message.d.ts.map +1 -1
- package/dist/routes/message.js +44 -14
- package/dist/routes/message.js.map +1 -1
- package/dist/routes/node.d.ts.map +1 -1
- package/dist/routes/node.js +92 -3
- package/dist/routes/node.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/database.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
45
|
+
sqlite.exec('BEGIN IMMEDIATE');
|
|
35
46
|
try {
|
|
36
|
-
|
|
37
|
-
|
|
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 (
|
|
48
|
-
|
|
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
|
-
|
|
53
|
-
txSqlite.close();
|
|
107
|
+
token.active = false;
|
|
54
108
|
}
|
|
55
109
|
};
|
|
56
|
-
const result =
|
|
57
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAA4B,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAgB7C;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAA4B,CAAC;
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/realtime.ts"],"names":[],"mappings":"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"}
|