@radishbot/sdk 0.6.0 → 0.7.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.
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
- const conn = DbConnection.builder().withUri(this._host).withDatabaseName(this._dbName).onConnect((c, _identity, _token) => {
301
+ DbConnection.builder().withUri(this._host).withDatabaseName(this._dbName).onConnect((c, _identity, _token) => {
302
302
  this._conn = c;
303
- c.subscriptionBuilder().onApplied(() => {
304
- resolve(c);
305
- }).subscribe([`SELECT * FROM flow WHERE key_hash = '${this._keyHash}'`]);
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)).subscribeToAll();
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
- this._flowWaiters.set(exportToken, resolve);
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 check = () => {
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 true;
349
+ return;
332
350
  }
333
351
  }
334
- return false;
335
- };
336
- let attempts = 0;
337
- const interval = setInterval(() => {
338
- if (check() || attempts++ > 100) {
352
+ }, 100);
353
+ setTimeout(() => {
354
+ if (!resolved) {
355
+ resolved = true;
339
356
  clearInterval(interval);
340
- if (attempts > 100) {
341
- this._flowWaiters.delete(exportToken);
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
- }, 100);
360
+ }, 15000);
346
361
  });
347
362
  }
348
363
  disconnect() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radishbot/sdk",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
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
- const conn = StdbConnection.builder()
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
- // Only subscribe to flows for this key (needed to resolve flow IDs)
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
- resolve(c);
41
- })
42
- .subscribe([`SELECT * FROM flow WHERE key_hash = '${this._keyHash}'`]);
47
+ .onApplied(() => resolve(c))
48
+ .subscribeToAll();
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
- // Set up watcher
72
- this._flowWaiters.set(exportToken, resolve);
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
- // Also poll in case subscription update was missed
78
- const check = () => {
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 true;
103
+ return;
84
104
  }
85
105
  }
86
- return false;
87
- };
106
+ }, 100);
88
107
 
89
- // Poll every 100ms for up to 10 seconds
90
- let attempts = 0;
91
- const interval = setInterval(() => {
92
- if (check() || attempts++ > 100) {
108
+ // Timeout after 15 seconds (properly rejects the promise)
109
+ setTimeout(() => {
110
+ if (!resolved) {
111
+ resolved = true;
93
112
  clearInterval(interval);
94
- if (attempts > 100) {
95
- this._flowWaiters.delete(exportToken);
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
- }, 100);
116
+ }, 15_000);
100
117
  });
101
118
  }
102
119