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