@dxos/functions-runtime-cloudflare 0.8.4-main.3c1ae3b → 0.8.4-main.3eb6e50203

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 (35) hide show
  1. package/dist/lib/browser/index.mjs +516 -110
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +516 -110
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/functions-client.d.ts +1 -0
  8. package/dist/types/src/functions-client.d.ts.map +1 -1
  9. package/dist/types/src/internal/data-service-impl.d.ts +7 -6
  10. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  11. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  12. package/dist/types/src/internal/queue-service-impl.d.ts +5 -7
  13. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  14. package/dist/types/src/internal/service-container.d.ts +8 -8
  15. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  16. package/dist/types/src/internal/utils.d.ts +2 -0
  17. package/dist/types/src/internal/utils.d.ts.map +1 -0
  18. package/dist/types/src/logger.d.ts.map +1 -1
  19. package/dist/types/src/queues-api.d.ts +6 -6
  20. package/dist/types/src/queues-api.d.ts.map +1 -1
  21. package/dist/types/src/space-proxy.d.ts +3 -2
  22. package/dist/types/src/space-proxy.d.ts.map +1 -1
  23. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +20 -16
  26. package/src/functions-client.ts +8 -1
  27. package/src/internal/data-service-impl.ts +27 -10
  28. package/src/internal/query-service-impl.ts +7 -3
  29. package/src/internal/queue-service-impl.ts +32 -21
  30. package/src/internal/service-container.ts +45 -10
  31. package/src/internal/utils.ts +5 -0
  32. package/src/logger.ts +2 -0
  33. package/src/queues-api.ts +6 -6
  34. package/src/space-proxy.ts +4 -3
  35. package/src/wrap-handler-for-cloudflare.ts +3 -3
@@ -10,6 +10,76 @@ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
10
10
  import { invariant } from "@dxos/invariant";
11
11
  import { SpaceId } from "@dxos/keys";
12
12
  import { log } from "@dxos/log";
13
+
14
+ // src/internal/utils.ts
15
+ var copyUint8Array = (value) => new Uint8Array(value);
16
+
17
+ // src/internal/data-service-impl.ts
18
+ function _ts_add_disposable_resource(env, value, async) {
19
+ if (value !== null && value !== void 0) {
20
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
21
+ var dispose, inner;
22
+ if (async) {
23
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
24
+ dispose = value[Symbol.asyncDispose];
25
+ }
26
+ if (dispose === void 0) {
27
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
28
+ dispose = value[Symbol.dispose];
29
+ if (async) inner = dispose;
30
+ }
31
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
32
+ if (inner) dispose = function() {
33
+ try {
34
+ inner.call(this);
35
+ } catch (e) {
36
+ return Promise.reject(e);
37
+ }
38
+ };
39
+ env.stack.push({
40
+ value,
41
+ dispose,
42
+ async
43
+ });
44
+ } else if (async) {
45
+ env.stack.push({
46
+ async: true
47
+ });
48
+ }
49
+ return value;
50
+ }
51
+ function _ts_dispose_resources(env) {
52
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
53
+ var e = new Error(message);
54
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
55
+ };
56
+ return (_ts_dispose_resources = function _ts_dispose_resources5(env2) {
57
+ function fail(e) {
58
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
59
+ env2.hasError = true;
60
+ }
61
+ var r, s = 0;
62
+ function next() {
63
+ while (r = env2.stack.pop()) {
64
+ try {
65
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
66
+ if (r.dispose) {
67
+ var result = r.dispose.call(r.value);
68
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
69
+ fail(e);
70
+ return next();
71
+ });
72
+ } else s |= 1;
73
+ } catch (e) {
74
+ fail(e);
75
+ }
76
+ }
77
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
78
+ if (env2.hasError) throw env2.error;
79
+ }
80
+ return next();
81
+ })(env);
82
+ }
13
83
  var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
14
84
  var DataServiceImpl = class {
15
85
  _executionContext;
@@ -23,7 +93,7 @@ var DataServiceImpl = class {
23
93
  return new Stream(({ next }) => {
24
94
  invariant(SpaceId.isValid(spaceId), void 0, {
25
95
  F: __dxlog_file,
26
- L: 35,
96
+ L: 39,
27
97
  S: this,
28
98
  A: [
29
99
  "SpaceId.isValid(spaceId)",
@@ -39,7 +109,7 @@ var DataServiceImpl = class {
39
109
  };
40
110
  });
41
111
  }
42
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
112
+ async updateSubscription({ subscriptionId, addIds }) {
43
113
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
44
114
  message: "Subscription not found.",
45
115
  context: {
@@ -51,44 +121,79 @@ var DataServiceImpl = class {
51
121
  count: addIds.length
52
122
  }, {
53
123
  F: __dxlog_file,
54
- L: 55,
124
+ L: 59,
55
125
  S: this,
56
126
  C: (f, a) => f(...a)
57
127
  });
58
128
  for (const documentId of addIds) {
59
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
60
- log.info("document loaded", {
61
- documentId,
62
- spaceId: sub.spaceId,
63
- found: !!document
64
- }, {
65
- F: __dxlog_file,
66
- L: 59,
67
- S: this,
68
- C: (f, a) => f(...a)
69
- });
70
- if (!document) {
71
- log.warn("not found", {
72
- documentId
129
+ const env = {
130
+ stack: [],
131
+ error: void 0,
132
+ hasError: false
133
+ };
134
+ try {
135
+ const document = _ts_add_disposable_resource(env, await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId), false);
136
+ log.info("document loaded", {
137
+ documentId,
138
+ spaceId: sub.spaceId,
139
+ found: !!document
73
140
  }, {
74
141
  F: __dxlog_file,
75
- L: 61,
142
+ L: 63,
76
143
  S: this,
77
144
  C: (f, a) => f(...a)
78
145
  });
79
- continue;
146
+ if (!document) {
147
+ log.warn("not found", {
148
+ documentId
149
+ }, {
150
+ F: __dxlog_file,
151
+ L: 65,
152
+ S: this,
153
+ C: (f, a) => f(...a)
154
+ });
155
+ continue;
156
+ }
157
+ sub.next({
158
+ updates: [
159
+ {
160
+ documentId,
161
+ // Copy returned object to avoid hanging RPC stub
162
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
163
+ mutation: copyUint8Array(document.data)
164
+ }
165
+ ]
166
+ });
167
+ } catch (e) {
168
+ env.error = e;
169
+ env.hasError = true;
170
+ } finally {
171
+ _ts_dispose_resources(env);
80
172
  }
81
- sub.next({
82
- updates: [
83
- {
84
- documentId,
85
- mutation: document.data
86
- }
87
- ]
88
- });
89
173
  }
90
174
  }
91
175
  }
176
+ async createDocument({ spaceId, initialValue }) {
177
+ const env = {
178
+ stack: [],
179
+ error: void 0,
180
+ hasError: false
181
+ };
182
+ try {
183
+ const response = _ts_add_disposable_resource(env, await this._dataService.createDocument(this._executionContext, {
184
+ spaceId,
185
+ initialValue
186
+ }), false);
187
+ return {
188
+ documentId: response.documentId
189
+ };
190
+ } catch (e) {
191
+ env.error = e;
192
+ env.hasError = true;
193
+ } finally {
194
+ _ts_dispose_resources(env);
195
+ }
196
+ }
92
197
  async update({ updates, subscriptionId }) {
93
198
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
94
199
  message: "Subscription not found.",
@@ -112,27 +217,30 @@ var DataServiceImpl = class {
112
217
  }
113
218
  async flush() {
114
219
  }
115
- subscribeSpaceSyncState(request, options) {
220
+ subscribeSpaceSyncState(_request, _options) {
116
221
  throw new NotImplementedError({
117
222
  message: "subscribeSpaceSyncState is not implemented."
118
223
  });
119
224
  }
120
- async getDocumentHeads({ documentIds }) {
225
+ async getDocumentHeads({ documentIds: _documentIds }) {
121
226
  throw new NotImplementedError({
122
227
  message: "getDocumentHeads is not implemented."
123
228
  });
124
229
  }
125
- async reIndexHeads({ documentIds }) {
230
+ async reIndexHeads({ documentIds: _documentIds }) {
126
231
  throw new NotImplementedError({
127
232
  message: "reIndexHeads is not implemented."
128
233
  });
129
234
  }
130
235
  async updateIndexes() {
131
- throw new NotImplementedError({
132
- message: "updateIndexes is not implemented."
236
+ log.error("updateIndexes is not available in EDGE env.", void 0, {
237
+ F: __dxlog_file,
238
+ L: 133,
239
+ S: this,
240
+ C: (f, a) => f(...a)
133
241
  });
134
242
  }
135
- async waitUntilHeadsReplicated({ heads }) {
243
+ async waitUntilHeadsReplicated({ heads: _heads }) {
136
244
  throw new NotImplementedError({
137
245
  message: "waitUntilHeadsReplicated is not implemented."
138
246
  });
@@ -217,6 +325,71 @@ var isSimpleSelectionQuery = (query) => {
217
325
  };
218
326
 
219
327
  // src/internal/query-service-impl.ts
328
+ function _ts_add_disposable_resource2(env, value, async) {
329
+ if (value !== null && value !== void 0) {
330
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
331
+ var dispose, inner;
332
+ if (async) {
333
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
334
+ dispose = value[Symbol.asyncDispose];
335
+ }
336
+ if (dispose === void 0) {
337
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
338
+ dispose = value[Symbol.dispose];
339
+ if (async) inner = dispose;
340
+ }
341
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
342
+ if (inner) dispose = function() {
343
+ try {
344
+ inner.call(this);
345
+ } catch (e) {
346
+ return Promise.reject(e);
347
+ }
348
+ };
349
+ env.stack.push({
350
+ value,
351
+ dispose,
352
+ async
353
+ });
354
+ } else if (async) {
355
+ env.stack.push({
356
+ async: true
357
+ });
358
+ }
359
+ return value;
360
+ }
361
+ function _ts_dispose_resources2(env) {
362
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
363
+ var e = new Error(message);
364
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
365
+ };
366
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
367
+ function fail(e) {
368
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
369
+ env2.hasError = true;
370
+ }
371
+ var r, s = 0;
372
+ function next() {
373
+ while (r = env2.stack.pop()) {
374
+ try {
375
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
376
+ if (r.dispose) {
377
+ var result = r.dispose.call(r.value);
378
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
379
+ fail(e);
380
+ return next();
381
+ });
382
+ } else s |= 1;
383
+ } catch (e) {
384
+ fail(e);
385
+ }
386
+ }
387
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
388
+ if (env2.hasError) throw env2.error;
389
+ }
390
+ return next();
391
+ })(env);
392
+ }
220
393
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
221
394
  var QueryServiceImpl = class {
222
395
  _executionContext;
@@ -231,7 +404,7 @@ var QueryServiceImpl = class {
231
404
  request
232
405
  }, {
233
406
  F: __dxlog_file3,
234
- L: 33,
407
+ L: 34,
235
408
  S: this,
236
409
  C: (f, a) => f(...a)
237
410
  });
@@ -239,7 +412,7 @@ var QueryServiceImpl = class {
239
412
  const requestedSpaceIds = getTargetSpacesForQuery(query);
240
413
  invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
241
414
  F: __dxlog_file3,
242
- L: 36,
415
+ L: 37,
243
416
  S: this,
244
417
  A: [
245
418
  "requestedSpaceIds.length === 1",
@@ -249,42 +422,57 @@ var QueryServiceImpl = class {
249
422
  const spaceId = requestedSpaceIds[0];
250
423
  return Stream2.fromPromise((async () => {
251
424
  try {
252
- this._queryCount++;
253
- log2.info("begin query", {
254
- spaceId
255
- }, {
256
- F: __dxlog_file3,
257
- L: 43,
258
- S: this,
259
- C: (f, a) => f(...a)
260
- });
261
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
262
- log2.info("query response", {
263
- spaceId,
264
- filter: request.filter,
265
- resultCount: queryResponse.results.length
266
- }, {
267
- F: __dxlog_file3,
268
- L: 48,
269
- S: this,
270
- C: (f, a) => f(...a)
271
- });
272
- return {
273
- results: queryResponse.results.map((object) => ({
274
- id: object.objectId,
275
- spaceId,
276
- spaceKey: PublicKey.ZERO,
277
- documentId: object.document.documentId,
278
- rank: 0,
279
- documentAutomerge: object.document.data
280
- }))
425
+ const env = {
426
+ stack: [],
427
+ error: void 0,
428
+ hasError: false
281
429
  };
430
+ try {
431
+ this._queryCount++;
432
+ log2.info("begin query", {
433
+ spaceId
434
+ }, {
435
+ F: __dxlog_file3,
436
+ L: 44,
437
+ S: this,
438
+ C: (f, a) => f(...a)
439
+ });
440
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query)), false);
441
+ log2.info("query response", {
442
+ spaceId,
443
+ filter: request.filter,
444
+ resultCount: queryResponse.results.length
445
+ }, {
446
+ F: __dxlog_file3,
447
+ L: 49,
448
+ S: this,
449
+ C: (f, a) => f(...a)
450
+ });
451
+ return {
452
+ results: queryResponse.results.map((object) => ({
453
+ id: object.objectId,
454
+ spaceId,
455
+ spaceKey: PublicKey.ZERO,
456
+ documentId: object.document.documentId,
457
+ // Rank 1 for predicate matches where ranking is not determined.
458
+ rank: 1,
459
+ // Copy returned object to avoid hanging RPC stub.
460
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
461
+ documentAutomerge: copyUint8Array(object.document.data)
462
+ }))
463
+ };
464
+ } catch (e) {
465
+ env.error = e;
466
+ env.hasError = true;
467
+ } finally {
468
+ _ts_dispose_resources2(env);
469
+ }
282
470
  } catch (error) {
283
471
  log2.error("query failed", {
284
472
  err: error
285
473
  }, {
286
474
  F: __dxlog_file3,
287
- L: 62,
475
+ L: 66,
288
476
  S: this,
289
477
  C: (f, a) => f(...a)
290
478
  });
@@ -329,7 +517,72 @@ var getTargetSpacesForQuery = (query) => {
329
517
  };
330
518
 
331
519
  // src/internal/queue-service-impl.ts
332
- import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
520
+ import { RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
521
+ function _ts_add_disposable_resource3(env, value, async) {
522
+ if (value !== null && value !== void 0) {
523
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
524
+ var dispose, inner;
525
+ if (async) {
526
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
527
+ dispose = value[Symbol.asyncDispose];
528
+ }
529
+ if (dispose === void 0) {
530
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
531
+ dispose = value[Symbol.dispose];
532
+ if (async) inner = dispose;
533
+ }
534
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
535
+ if (inner) dispose = function() {
536
+ try {
537
+ inner.call(this);
538
+ } catch (e) {
539
+ return Promise.reject(e);
540
+ }
541
+ };
542
+ env.stack.push({
543
+ value,
544
+ dispose,
545
+ async
546
+ });
547
+ } else if (async) {
548
+ env.stack.push({
549
+ async: true
550
+ });
551
+ }
552
+ return value;
553
+ }
554
+ function _ts_dispose_resources3(env) {
555
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
556
+ var e = new Error(message);
557
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
558
+ };
559
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
560
+ function fail(e) {
561
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
562
+ env2.hasError = true;
563
+ }
564
+ var r, s = 0;
565
+ function next() {
566
+ while (r = env2.stack.pop()) {
567
+ try {
568
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
569
+ if (r.dispose) {
570
+ var result = r.dispose.call(r.value);
571
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
572
+ fail(e);
573
+ return next();
574
+ });
575
+ } else s |= 1;
576
+ } catch (e) {
577
+ fail(e);
578
+ }
579
+ }
580
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
581
+ if (env2.hasError) throw env2.error;
582
+ }
583
+ return next();
584
+ })(env);
585
+ }
333
586
  var QueueServiceImpl = class {
334
587
  _ctx;
335
588
  _queueService;
@@ -337,27 +590,56 @@ var QueueServiceImpl = class {
337
590
  this._ctx = _ctx;
338
591
  this._queueService = _queueService;
339
592
  }
340
- async queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
593
+ async queryQueue(request) {
341
594
  try {
342
- const result = await this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
343
- return result;
595
+ const env = {
596
+ stack: [],
597
+ error: void 0,
598
+ hasError: false
599
+ };
600
+ try {
601
+ const result = _ts_add_disposable_resource3(env, await this._queueService.queryQueue(this._ctx, request), false);
602
+ return {
603
+ objects: structuredClone(result.objects),
604
+ nextCursor: result.nextCursor,
605
+ prevCursor: result.prevCursor
606
+ };
607
+ } catch (e) {
608
+ env.error = e;
609
+ env.hasError = true;
610
+ } finally {
611
+ _ts_dispose_resources3(env);
612
+ }
344
613
  } catch (error) {
614
+ const { query } = request;
345
615
  throw RuntimeServiceError3.wrap({
346
616
  message: "Queue query failed.",
347
617
  context: {
348
- subspaceTag,
349
- spaceId,
350
- queueId
618
+ subspaceTag: query?.queuesNamespace,
619
+ spaceId: query?.spaceId,
620
+ queueId: query?.queueIds?.[0]
351
621
  },
352
622
  ifTypeDiffers: true
353
623
  })(error);
354
624
  }
355
625
  }
356
- async insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
626
+ async insertIntoQueue(request) {
357
627
  try {
358
- const result = await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
359
- return result;
628
+ const env = {
629
+ stack: [],
630
+ error: void 0,
631
+ hasError: false
632
+ };
633
+ try {
634
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.insertIntoQueue(this._ctx, request), false);
635
+ } catch (e) {
636
+ env.error = e;
637
+ env.hasError = true;
638
+ } finally {
639
+ _ts_dispose_resources3(env);
640
+ }
360
641
  } catch (error) {
642
+ const { subspaceTag, spaceId, queueId } = request;
361
643
  throw RuntimeServiceError3.wrap({
362
644
  message: "Queue append failed.",
363
645
  context: {
@@ -369,30 +651,131 @@ var QueueServiceImpl = class {
369
651
  })(error);
370
652
  }
371
653
  }
372
- deleteFromQueue(subspaceTag, spaceId, queueId, _objectIds) {
373
- throw new NotImplementedError3({
374
- message: "Deleting from queue is not supported.",
375
- context: {
376
- subspaceTag,
377
- spaceId,
378
- queueId
654
+ async deleteFromQueue(request) {
655
+ try {
656
+ const env = {
657
+ stack: [],
658
+ error: void 0,
659
+ hasError: false
660
+ };
661
+ try {
662
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.deleteFromQueue(this._ctx, request), false);
663
+ } catch (e) {
664
+ env.error = e;
665
+ env.hasError = true;
666
+ } finally {
667
+ _ts_dispose_resources3(env);
379
668
  }
380
- });
669
+ } catch (error) {
670
+ const { subspaceTag, spaceId, queueId } = request;
671
+ throw RuntimeServiceError3.wrap({
672
+ message: "Queue delete failed.",
673
+ context: {
674
+ subspaceTag,
675
+ spaceId,
676
+ queueId
677
+ },
678
+ ifTypeDiffers: true
679
+ })(error);
680
+ }
381
681
  }
382
682
  };
383
683
 
384
684
  // src/internal/service-container.ts
685
+ function _ts_add_disposable_resource4(env, value, async) {
686
+ if (value !== null && value !== void 0) {
687
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
688
+ var dispose, inner;
689
+ if (async) {
690
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
691
+ dispose = value[Symbol.asyncDispose];
692
+ }
693
+ if (dispose === void 0) {
694
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
695
+ dispose = value[Symbol.dispose];
696
+ if (async) inner = dispose;
697
+ }
698
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
699
+ if (inner) dispose = function() {
700
+ try {
701
+ inner.call(this);
702
+ } catch (e) {
703
+ return Promise.reject(e);
704
+ }
705
+ };
706
+ env.stack.push({
707
+ value,
708
+ dispose,
709
+ async
710
+ });
711
+ } else if (async) {
712
+ env.stack.push({
713
+ async: true
714
+ });
715
+ }
716
+ return value;
717
+ }
718
+ function _ts_dispose_resources4(env) {
719
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
720
+ var e = new Error(message);
721
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
722
+ };
723
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
724
+ function fail(e) {
725
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
726
+ env2.hasError = true;
727
+ }
728
+ var r, s = 0;
729
+ function next() {
730
+ while (r = env2.stack.pop()) {
731
+ try {
732
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
733
+ if (r.dispose) {
734
+ var result = r.dispose.call(r.value);
735
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
736
+ fail(e);
737
+ return next();
738
+ });
739
+ } else s |= 1;
740
+ } catch (e) {
741
+ fail(e);
742
+ }
743
+ }
744
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
745
+ if (env2.hasError) throw env2.error;
746
+ }
747
+ return next();
748
+ })(env);
749
+ }
385
750
  var ServiceContainer = class {
386
751
  _executionContext;
387
752
  _dataService;
388
753
  _queueService;
389
- constructor(_executionContext, _dataService, _queueService) {
754
+ _functionsService;
755
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
390
756
  this._executionContext = _executionContext;
391
757
  this._dataService = _dataService;
392
758
  this._queueService = _queueService;
759
+ this._functionsService = _functionsService;
393
760
  }
394
761
  async getSpaceMeta(spaceId) {
395
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
762
+ const env = {
763
+ stack: [],
764
+ error: void 0,
765
+ hasError: false
766
+ };
767
+ try {
768
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
769
+ return result ? {
770
+ spaceKey: result.spaceKey,
771
+ rootDocumentId: result.rootDocumentId
772
+ } : void 0;
773
+ } catch (e) {
774
+ env.error = e;
775
+ env.hasError = true;
776
+ } finally {
777
+ _ts_dispose_resources4(env);
778
+ }
396
779
  }
397
780
  async createServices() {
398
781
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -401,14 +784,43 @@ var ServiceContainer = class {
401
784
  return {
402
785
  dataService,
403
786
  queryService,
404
- queueService
787
+ queueService,
788
+ functionsAiService: this._functionsService
405
789
  };
406
790
  }
407
- queryQueue(queue) {
408
- return this._queueService.query({}, queue.toString(), {});
791
+ async queryQueue(queue) {
792
+ const parts = queue.asQueueDXN();
793
+ if (!parts) {
794
+ throw new Error("Invalid queue DXN");
795
+ }
796
+ const { subspaceTag, spaceId, queueId } = parts;
797
+ const result = await this._queueService.queryQueue(this._executionContext, {
798
+ query: {
799
+ spaceId,
800
+ queuesNamespace: subspaceTag,
801
+ queueIds: [
802
+ queueId
803
+ ]
804
+ }
805
+ });
806
+ return {
807
+ objects: structuredClone(result.objects),
808
+ nextCursor: result.nextCursor ?? null,
809
+ prevCursor: result.prevCursor ?? null
810
+ };
409
811
  }
410
- insertIntoQueue(queue, objects) {
411
- return this._queueService.append({}, queue.toString(), objects);
812
+ async insertIntoQueue(queue, objects) {
813
+ const parts = queue.asQueueDXN();
814
+ if (!parts) {
815
+ throw new Error("Invalid queue DXN");
816
+ }
817
+ const { subspaceTag, spaceId, queueId } = parts;
818
+ await this._queueService.insertIntoQueue(this._executionContext, {
819
+ subspaceTag,
820
+ spaceId,
821
+ queueId,
822
+ objects
823
+ });
412
824
  }
413
825
  };
414
826
 
@@ -451,7 +863,7 @@ var SpaceProxy = class extends Resource {
451
863
  get db() {
452
864
  invariant4(this._db, void 0, {
453
865
  F: __dxlog_file4,
454
- L: 34,
866
+ L: 35,
455
867
  S: this,
456
868
  A: [
457
869
  "this._db",
@@ -466,7 +878,7 @@ var SpaceProxy = class extends Resource {
466
878
  get crud() {
467
879
  invariant4(this._db, void 0, {
468
880
  F: __dxlog_file4,
469
- L: 42,
881
+ L: 43,
470
882
  S: this,
471
883
  A: [
472
884
  "this._db",
@@ -506,7 +918,7 @@ var FunctionsClient = class extends Resource2 {
506
918
  super();
507
919
  invariant5(typeof services.dataService !== "undefined", "DataService is required", {
508
920
  F: __dxlog_file5,
509
- L: 32,
921
+ L: 33,
510
922
  S: this,
511
923
  A: [
512
924
  "typeof services.dataService !== 'undefined'",
@@ -515,14 +927,14 @@ var FunctionsClient = class extends Resource2 {
515
927
  });
516
928
  invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
517
929
  F: __dxlog_file5,
518
- L: 33,
930
+ L: 34,
519
931
  S: this,
520
932
  A: [
521
933
  "typeof services.queueService !== 'undefined'",
522
934
  "'QueueService is required'"
523
935
  ]
524
936
  });
525
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
937
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
526
938
  this._echoClient = new EchoClient({});
527
939
  }
528
940
  get echo() {
@@ -556,7 +968,8 @@ var FunctionsClient = class extends Resource2 {
556
968
  var createClientFromEnv = async (env) => {
557
969
  const client = new FunctionsClient({
558
970
  dataService: env.DATA_SERVICE,
559
- queueService: env.QUEUE_SERVICE
971
+ queueService: env.QUEUE_SERVICE,
972
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
560
973
  });
561
974
  await client.open();
562
975
  return client;
@@ -578,14 +991,6 @@ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/s
578
991
  var wrapHandlerForCloudflare = (func) => {
579
992
  return async (request, env) => {
580
993
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
581
- log3.info(">>> meta", {
582
- func
583
- }, {
584
- F: __dxlog_file6,
585
- L: 25,
586
- S: void 0,
587
- C: (f, a) => f(...a)
588
- });
589
994
  return handleFunctionMetaCall(func, request);
590
995
  }
591
996
  try {
@@ -597,7 +1002,7 @@ var wrapHandlerForCloudflare = (func) => {
597
1002
  });
598
1003
  }
599
1004
  }
600
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
1005
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
601
1006
  const context = await createFunctionContext({
602
1007
  serviceContainer,
603
1008
  contextSpaceId: spaceId
@@ -609,7 +1014,7 @@ var wrapHandlerForCloudflare = (func) => {
609
1014
  stack: error.stack
610
1015
  }, {
611
1016
  F: __dxlog_file6,
612
- L: 45,
1017
+ L: 44,
613
1018
  S: void 0,
614
1019
  C: (f, a) => f(...a)
615
1020
  });
@@ -647,7 +1052,7 @@ var decodeRequest = async (request) => {
647
1052
  } catch (err) {
648
1053
  log3.catch(err, void 0, {
649
1054
  F: __dxlog_file6,
650
- L: 80,
1055
+ L: 79,
651
1056
  S: void 0,
652
1057
  C: (f, a) => f(...a)
653
1058
  });
@@ -674,7 +1079,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
674
1079
  });
675
1080
  };
676
1081
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
677
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
1082
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
678
1083
  let spaceKey;
679
1084
  let rootUrl;
680
1085
  if (contextSpaceId) {
@@ -685,7 +1090,7 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
685
1090
  spaceKey = meta.spaceKey;
686
1091
  invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
687
1092
  F: __dxlog_file6,
688
- L: 118,
1093
+ L: 117,
689
1094
  S: void 0,
690
1095
  A: [
691
1096
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -698,7 +1103,8 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
698
1103
  services: {
699
1104
  dataService,
700
1105
  queryService,
701
- queueService
1106
+ queueService,
1107
+ functionsAiService
702
1108
  },
703
1109
  spaceId: contextSpaceId,
704
1110
  spaceKey,