@radishbot/sdk 0.6.0 → 0.7.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/index.js +33 -18
- package/package.json +1 -1
- package/src/connection.ts +40 -23
package/dist/index.js
CHANGED
|
@@ -298,11 +298,16 @@ class SdkConnection {
|
|
|
298
298
|
if (this._connectPromise)
|
|
299
299
|
return this._connectPromise;
|
|
300
300
|
this._connectPromise = new Promise((resolve, reject) => {
|
|
301
|
-
|
|
301
|
+
DbConnection.builder().withUri(this._host).withDatabaseName(this._dbName).onConnect((c, _identity, _token) => {
|
|
302
302
|
this._conn = c;
|
|
303
|
-
c.
|
|
304
|
-
|
|
305
|
-
|
|
303
|
+
c.db.flow.onInsert((_ctx, row) => {
|
|
304
|
+
const waiter = this._flowWaiters.get(row.exportToken);
|
|
305
|
+
if (waiter) {
|
|
306
|
+
this._flowWaiters.delete(row.exportToken);
|
|
307
|
+
waiter(row.id);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
c.subscriptionBuilder().onApplied(() => resolve(c)).subscribeToAllTables();
|
|
306
311
|
}).onConnectError((_ctx, err) => {
|
|
307
312
|
reject(new Error(`SpacetimeDB connection failed: ${err}`));
|
|
308
313
|
}).build();
|
|
@@ -320,29 +325,39 @@ class SdkConnection {
|
|
|
320
325
|
if (f.exportToken === exportToken)
|
|
321
326
|
return f.id;
|
|
322
327
|
}
|
|
323
|
-
return new Promise((resolve) => {
|
|
324
|
-
|
|
328
|
+
return new Promise((resolve, reject) => {
|
|
329
|
+
let resolved = false;
|
|
330
|
+
this._flowWaiters.set(exportToken, (id) => {
|
|
331
|
+
if (!resolved) {
|
|
332
|
+
resolved = true;
|
|
333
|
+
clearInterval(interval);
|
|
334
|
+
resolve(id);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
325
337
|
reducerCall();
|
|
326
|
-
const
|
|
338
|
+
const interval = setInterval(() => {
|
|
339
|
+
if (resolved) {
|
|
340
|
+
clearInterval(interval);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
327
343
|
for (const f of conn.db.flow.iter()) {
|
|
328
344
|
if (f.exportToken === exportToken) {
|
|
345
|
+
resolved = true;
|
|
346
|
+
clearInterval(interval);
|
|
329
347
|
this._flowWaiters.delete(exportToken);
|
|
330
348
|
resolve(f.id);
|
|
331
|
-
return
|
|
349
|
+
return;
|
|
332
350
|
}
|
|
333
351
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
if (check() || attempts++ > 100) {
|
|
352
|
+
}, 100);
|
|
353
|
+
setTimeout(() => {
|
|
354
|
+
if (!resolved) {
|
|
355
|
+
resolved = true;
|
|
339
356
|
clearInterval(interval);
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
throw new Error(`Flow creation timed out for token ${exportToken}`);
|
|
343
|
-
}
|
|
357
|
+
this._flowWaiters.delete(exportToken);
|
|
358
|
+
reject(new Error(`Flow creation timed out for token ${exportToken}`));
|
|
344
359
|
}
|
|
345
|
-
},
|
|
360
|
+
}, 15000);
|
|
346
361
|
});
|
|
347
362
|
}
|
|
348
363
|
disconnect() {
|
package/package.json
CHANGED
package/src/connection.ts
CHANGED
|
@@ -28,18 +28,24 @@ export class SdkConnection {
|
|
|
28
28
|
if (this._connectPromise) return this._connectPromise;
|
|
29
29
|
|
|
30
30
|
this._connectPromise = new Promise<StdbConnection>((resolve, reject) => {
|
|
31
|
-
|
|
31
|
+
StdbConnection.builder()
|
|
32
32
|
.withUri(this._host)
|
|
33
33
|
.withDatabaseName(this._dbName)
|
|
34
34
|
.onConnect((c, _identity, _token) => {
|
|
35
35
|
this._conn = c;
|
|
36
36
|
|
|
37
|
-
//
|
|
37
|
+
// Resolve flow waiters immediately when new flows arrive
|
|
38
|
+
c.db.flow.onInsert((_ctx, row) => {
|
|
39
|
+
const waiter = this._flowWaiters.get(row.exportToken);
|
|
40
|
+
if (waiter) {
|
|
41
|
+
this._flowWaiters.delete(row.exportToken);
|
|
42
|
+
waiter(row.id);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
38
46
|
c.subscriptionBuilder()
|
|
39
|
-
.onApplied(() =>
|
|
40
|
-
|
|
41
|
-
})
|
|
42
|
-
.subscribe([`SELECT * FROM flow WHERE key_hash = '${this._keyHash}'`]);
|
|
47
|
+
.onApplied(() => resolve(c))
|
|
48
|
+
.subscribeToAllTables();
|
|
43
49
|
})
|
|
44
50
|
.onConnectError((_ctx, err) => {
|
|
45
51
|
reject(new Error(`SpacetimeDB connection failed: ${err}`));
|
|
@@ -67,36 +73,47 @@ export class SdkConnection {
|
|
|
67
73
|
if (f.exportToken === exportToken) return f.id;
|
|
68
74
|
}
|
|
69
75
|
|
|
70
|
-
return new Promise<bigint>((resolve) => {
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
return new Promise<bigint>((resolve, reject) => {
|
|
77
|
+
let resolved = false;
|
|
78
|
+
|
|
79
|
+
// Register waiter — triggered by onInsert handler in connect()
|
|
80
|
+
this._flowWaiters.set(exportToken, (id) => {
|
|
81
|
+
if (!resolved) {
|
|
82
|
+
resolved = true;
|
|
83
|
+
clearInterval(interval);
|
|
84
|
+
resolve(id);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
73
87
|
|
|
74
88
|
// Call the reducer
|
|
75
89
|
reducerCall();
|
|
76
90
|
|
|
77
|
-
//
|
|
78
|
-
const
|
|
91
|
+
// Poll as fallback in case onInsert fires before waiter is registered
|
|
92
|
+
const interval = setInterval(() => {
|
|
93
|
+
if (resolved) {
|
|
94
|
+
clearInterval(interval);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
79
97
|
for (const f of conn.db.flow.iter()) {
|
|
80
98
|
if (f.exportToken === exportToken) {
|
|
99
|
+
resolved = true;
|
|
100
|
+
clearInterval(interval);
|
|
81
101
|
this._flowWaiters.delete(exportToken);
|
|
82
102
|
resolve(f.id);
|
|
83
|
-
return
|
|
103
|
+
return;
|
|
84
104
|
}
|
|
85
105
|
}
|
|
86
|
-
|
|
87
|
-
};
|
|
106
|
+
}, 100);
|
|
88
107
|
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
// Timeout after 15 seconds (properly rejects the promise)
|
|
109
|
+
setTimeout(() => {
|
|
110
|
+
if (!resolved) {
|
|
111
|
+
resolved = true;
|
|
93
112
|
clearInterval(interval);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
throw new Error(`Flow creation timed out for token ${exportToken}`);
|
|
97
|
-
}
|
|
113
|
+
this._flowWaiters.delete(exportToken);
|
|
114
|
+
reject(new Error(`Flow creation timed out for token ${exportToken}`));
|
|
98
115
|
}
|
|
99
|
-
},
|
|
116
|
+
}, 15_000);
|
|
100
117
|
});
|
|
101
118
|
}
|
|
102
119
|
|