@dxos/echo-protocol 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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.
@@ -35,8 +35,8 @@ var Reference = class _Reference {
35
35
  return new _Reference(dxn.parts[0], void 0, dxn.parts[0], dxn);
36
36
  }
37
37
  }
38
- static fromValue(value) {
39
- return new _Reference(value.objectId, value.protocol, value.host);
38
+ static fromValue(value2) {
39
+ return new _Reference(value2.objectId, value2.protocol, value2.host);
40
40
  }
41
41
  /**
42
42
  * Reference an object in the local space.
@@ -124,28 +124,35 @@ var REFERENCE_TYPE_TAG = "dxos.echo.model.document.Reference";
124
124
  var encodeReference = (reference) => ({
125
125
  "/": reference.toDXN().toString()
126
126
  });
127
- var decodeReference = (value) => {
128
- if (typeof value !== "object" || value === null || typeof value["/"] !== "string") {
127
+ var decodeReference = (value2) => {
128
+ if (typeof value2 !== "object" || value2 === null || typeof value2["/"] !== "string") {
129
129
  throw new Error("Invalid reference");
130
130
  }
131
- const dxnString = value["/"];
131
+ const dxnString = value2["/"];
132
132
  if (dxnString.length % 2 === 0 && dxnString.slice(0, dxnString.length / 2) === dxnString.slice(dxnString.length / 2) && dxnString.includes("dxn:echo")) {
133
133
  throw new Error("Automerge bug detected!");
134
134
  }
135
135
  return Reference.fromDXN(DXN.parse(dxnString));
136
136
  };
137
- var isEncodedReference = (value) => typeof value === "object" && value !== null && Object.keys(value).length === 1 && typeof value["/"] === "string";
137
+ var isEncodedReference = (value2) => typeof value2 === "object" && value2 !== null && Object.keys(value2).length === 1 && typeof value2["/"] === "string";
138
138
  var EncodedReference = Object.freeze({
139
139
  isEncodedReference,
140
- getReferenceString: (value) => {
141
- assertArgument(isEncodedReference(value), "invalid reference");
142
- return value["/"];
140
+ getReferenceString: (value2) => {
141
+ assertArgument(isEncodedReference(value2), "value", "invalid reference");
142
+ return value2["/"];
143
143
  },
144
- toDXN: (value) => {
145
- return DXN.parse(EncodedReference.getReferenceString(value));
144
+ toDXN: (value2) => {
145
+ return DXN.parse(EncodedReference.getReferenceString(value2));
146
146
  },
147
147
  fromDXN: (dxn) => {
148
- return encodeReference(Reference.fromDXN(dxn));
148
+ return {
149
+ "/": dxn.toString()
150
+ };
151
+ },
152
+ fromLegacyTypename: (typename) => {
153
+ return {
154
+ "/": DXN.fromTypename(typename).toString()
155
+ };
149
156
  }
150
157
  });
151
158
 
@@ -218,29 +225,35 @@ var ObjectStructure = Object.freeze({
218
225
  getRelationTarget: (object) => {
219
226
  return object.system?.target;
220
227
  },
228
+ getParent: (object) => {
229
+ return object.system?.parent;
230
+ },
221
231
  /**
222
232
  * @returns All references in the data section of the object.
223
233
  */
224
234
  getAllOutgoingReferences: (object) => {
225
235
  const references = [];
226
- const visit2 = (path, value) => {
227
- if (isEncodedReference(value)) {
236
+ const visit2 = (path, value2) => {
237
+ if (isEncodedReference(value2)) {
228
238
  references.push({
229
239
  path,
230
- reference: value
240
+ reference: value2
231
241
  });
232
242
  } else {
233
- visitValues(value, (value2, key) => visit2([
243
+ visitValues(value2, (value3, key) => visit2([
234
244
  ...path,
235
245
  String(key)
236
- ], value2));
246
+ ], value3));
237
247
  }
238
248
  };
239
- visitValues(object.data, (value, key) => visit2([
249
+ visitValues(object.data, (value2, key) => visit2([
240
250
  String(key)
241
- ], value));
251
+ ], value2));
242
252
  return references;
243
253
  },
254
+ getTags: (object) => {
255
+ return object.meta.tags ?? [];
256
+ },
244
257
  makeObject: ({ type, data, keys }) => {
245
258
  return {
246
259
  system: {
@@ -276,37 +289,63 @@ var ObjectStructure = Object.freeze({
276
289
  var PROPERTY_ID = "id";
277
290
  var DATA_NAMESPACE = "data";
278
291
 
279
- // src/space-doc-version.ts
280
- var SpaceDocVersion = Object.freeze({
292
+ // src/echo-feed-codec.ts
293
+ import { FeedProtocol } from "@dxos/protocols";
294
+ var ATTR_META = "@meta";
295
+ var EchoFeedCodec = class _EchoFeedCodec {
296
+ static #encoder = new TextEncoder();
297
+ static #decoder = new TextDecoder();
281
298
  /**
282
- * For the documents created before the versioning was introduced.
299
+ * Prepares a value for feed storage (strips queue position from metadata) and encodes to bytes.
283
300
  */
284
- LEGACY: 0,
301
+ static encode(value2) {
302
+ const prepared = _EchoFeedCodec.#stripQueuePosition(value2);
303
+ return _EchoFeedCodec.#encoder.encode(JSON.stringify(prepared));
304
+ }
285
305
  /**
286
- * Current version.
306
+ * Decodes feed block bytes to a JSON value.
307
+ * If position is provided, injects queue position into the decoded object's metadata.
287
308
  */
288
- CURRENT: 1
289
- });
290
-
291
- // src/space-id.ts
292
- import { subtleCrypto } from "@dxos/crypto";
293
- import { PublicKey, SpaceId } from "@dxos/keys";
294
- import { ComplexMap } from "@dxos/util";
295
- var SPACE_IDS_CACHE = new ComplexMap(PublicKey.hash);
296
- var createIdFromSpaceKey = async (spaceKey) => {
297
- const cachedValue = SPACE_IDS_CACHE.get(spaceKey);
298
- if (cachedValue !== void 0) {
299
- return cachedValue;
309
+ static decode(data, position) {
310
+ const decoded = JSON.parse(_EchoFeedCodec.#decoder.decode(data));
311
+ if (position !== void 0 && typeof decoded === "object" && decoded !== null) {
312
+ _EchoFeedCodec.#setQueuePosition(decoded, position);
313
+ }
314
+ return decoded;
315
+ }
316
+ static #stripQueuePosition(value2) {
317
+ if (typeof value2 !== "object" || value2 === null) {
318
+ return value2;
319
+ }
320
+ const obj = structuredClone(value2);
321
+ const meta = obj[ATTR_META];
322
+ if (meta?.keys?.some((key) => key.source === FeedProtocol.KEY_QUEUE_POSITION)) {
323
+ meta.keys = meta.keys.filter((key) => key.source !== FeedProtocol.KEY_QUEUE_POSITION);
324
+ }
325
+ return obj;
326
+ }
327
+ static #setQueuePosition(obj, position) {
328
+ obj[ATTR_META] ??= {
329
+ keys: []
330
+ };
331
+ obj[ATTR_META].keys ??= [];
332
+ const keys = obj[ATTR_META].keys;
333
+ for (let i = 0; i < keys.length; i++) {
334
+ if (keys[i].source === FeedProtocol.KEY_QUEUE_POSITION) {
335
+ keys.splice(i, 1);
336
+ i--;
337
+ }
338
+ }
339
+ keys.push({
340
+ source: FeedProtocol.KEY_QUEUE_POSITION,
341
+ id: position.toString()
342
+ });
300
343
  }
301
- const digest = await subtleCrypto.digest("SHA-256", spaceKey.asUint8Array());
302
- const bytes = new Uint8Array(digest).slice(0, SpaceId.byteLength);
303
- const spaceId = SpaceId.encode(bytes);
304
- SPACE_IDS_CACHE.set(spaceKey, spaceId);
305
- return spaceId;
306
344
  };
307
345
 
308
346
  // src/foreign-key.ts
309
- import { Schema, SchemaAST } from "effect";
347
+ import * as Schema from "effect/Schema";
348
+ import * as SchemaAST from "effect/SchemaAST";
310
349
  var ForeignKey_ = Schema.Struct({
311
350
  /**
312
351
  * Name of the foreign database/system.
@@ -317,9 +356,9 @@ var ForeignKey_ = Schema.Struct({
317
356
  * Id within the foreign database.
318
357
  */
319
358
  // TODO(wittjosiah): This annotation is currently used to ensure id field shows up in forms.
320
- // TODO(dmaretskyi): `false` is not a valid value for the annotation.
359
+ // TODO(dmaretskyi): `false` is not a valid value for the annotation. Use a different annotation.
321
360
  id: Schema.String.annotations({
322
- [SchemaAST.IdentifierAnnotationId]: false
361
+ [SchemaAST.IdentifierAnnotationId]: "false"
323
362
  })
324
363
  });
325
364
  var ForeignKey = ForeignKey_;
@@ -329,30 +368,45 @@ var ast_exports = {};
329
368
  __export(ast_exports, {
330
369
  Filter: () => Filter,
331
370
  FilterAnd: () => FilterAnd,
371
+ FilterChildOf: () => FilterChildOf,
332
372
  FilterCompare: () => FilterCompare,
373
+ FilterContains: () => FilterContains,
333
374
  FilterIn: () => FilterIn,
334
375
  FilterNot: () => FilterNot,
335
376
  FilterObject: () => FilterObject,
336
377
  FilterOr: () => FilterOr,
337
378
  FilterRange: () => FilterRange,
379
+ FilterTag: () => FilterTag,
338
380
  FilterTextSearch: () => FilterTextSearch,
381
+ FilterTimestamp: () => FilterTimestamp,
382
+ Order: () => Order,
383
+ OrderDirection: () => OrderDirection,
339
384
  Query: () => Query,
340
385
  QueryFilterClause: () => QueryFilterClause,
386
+ QueryFromClause: () => QueryFromClause,
387
+ QueryFromClause_: () => QueryFromClause_,
388
+ QueryHierarchyTraversalClause: () => QueryHierarchyTraversalClause,
341
389
  QueryIncomingReferencesClause: () => QueryIncomingReferencesClause,
390
+ QueryLimitClause: () => QueryLimitClause,
342
391
  QueryOptions: () => QueryOptions,
343
392
  QueryOptionsClause: () => QueryOptionsClause,
393
+ QueryOrderClause: () => QueryOrderClause,
344
394
  QueryReferenceTraversalClause: () => QueryReferenceTraversalClause,
345
395
  QueryRelationClause: () => QueryRelationClause,
346
396
  QueryRelationTraversalClause: () => QueryRelationTraversalClause,
347
397
  QuerySelectClause: () => QuerySelectClause,
348
398
  QuerySetDifferenceClause: () => QuerySetDifferenceClause,
349
399
  QueryUnionClause: () => QueryUnionClause,
400
+ Scope: () => Scope,
401
+ fold: () => fold,
402
+ map: () => map,
350
403
  visit: () => visit
351
404
  });
352
- import { Schema as Schema2 } from "effect";
405
+ import * as Match from "effect/Match";
406
+ import * as Schema2 from "effect/Schema";
353
407
  import { DXN as DXN2, ObjectId } from "@dxos/keys";
354
408
  var TypenameSpecifier = Schema2.Union(DXN2.Schema, Schema2.Null).annotations({
355
- description: "DXN or null. Null means any type will match"
409
+ description: "DXN or null; null matches any type"
356
410
  });
357
411
  var FilterObject_ = Schema2.Struct({
358
412
  type: Schema2.Literal("object"),
@@ -385,12 +439,29 @@ var FilterIn_ = Schema2.Struct({
385
439
  values: Schema2.Array(Schema2.Any)
386
440
  });
387
441
  var FilterIn = FilterIn_;
442
+ var FilterContains_ = Schema2.Struct({
443
+ type: Schema2.Literal("contains"),
444
+ value: Schema2.Any
445
+ });
446
+ var FilterContains = FilterContains_;
447
+ var FilterTag_ = Schema2.Struct({
448
+ type: Schema2.Literal("tag"),
449
+ tag: Schema2.String
450
+ });
451
+ var FilterTag = FilterTag_;
388
452
  var FilterRange_ = Schema2.Struct({
389
453
  type: Schema2.Literal("range"),
390
454
  from: Schema2.Any,
391
455
  to: Schema2.Any
392
456
  });
393
457
  var FilterRange = FilterRange_;
458
+ var FilterTimestamp_ = Schema2.Struct({
459
+ type: Schema2.Literal("timestamp"),
460
+ field: Schema2.Literal("createdAt", "updatedAt"),
461
+ operator: Schema2.Literal("gt", "gte", "lt", "lte"),
462
+ value: Schema2.Number
463
+ });
464
+ var FilterTimestamp = FilterTimestamp_;
394
465
  var FilterTextSearch_ = Schema2.Struct({
395
466
  type: Schema2.Literal("text-search"),
396
467
  text: Schema2.String,
@@ -412,7 +483,17 @@ var FilterOr_ = Schema2.Struct({
412
483
  filters: Schema2.Array(Schema2.suspend(() => Filter))
413
484
  });
414
485
  var FilterOr = FilterOr_;
415
- var Filter = Schema2.Union(FilterObject, FilterTextSearch, FilterCompare, FilterIn, FilterRange, FilterNot, FilterAnd, FilterOr);
486
+ var FilterChildOf_ = Schema2.Struct({
487
+ type: Schema2.Literal("child-of"),
488
+ /** Parent DXNs to match children of. */
489
+ parents: Schema2.Array(DXN2.Schema),
490
+ /** Whether to match transitively (grandchildren, etc.). Defaults to true. */
491
+ transitive: Schema2.Boolean
492
+ });
493
+ var FilterChildOf = FilterChildOf_;
494
+ var Filter = Schema2.Union(FilterObject, FilterCompare, FilterIn, FilterContains, FilterTag, FilterRange, FilterTimestamp, FilterTextSearch, FilterChildOf, FilterNot, FilterAnd, FilterOr).annotations({
495
+ identifier: "org.dxos.schema.filter"
496
+ });
416
497
  var QuerySelectClause_ = Schema2.Struct({
417
498
  type: Schema2.Literal("select"),
418
499
  filter: Schema2.suspend(() => Filter)
@@ -433,7 +514,11 @@ var QueryReferenceTraversalClause = QueryReferenceTraversalClause_;
433
514
  var QueryIncomingReferencesClause_ = Schema2.Struct({
434
515
  type: Schema2.Literal("incoming-references"),
435
516
  anchor: Schema2.suspend(() => Query),
436
- property: Schema2.String,
517
+ /**
518
+ * Property path where the reference is located.
519
+ * If null, matches references from any property.
520
+ */
521
+ property: Schema2.NullOr(Schema2.String),
437
522
  typename: TypenameSpecifier
438
523
  });
439
524
  var QueryIncomingReferencesClause = QueryIncomingReferencesClause_;
@@ -455,6 +540,16 @@ var QueryRelationTraversalClause_ = Schema2.Struct({
455
540
  direction: Schema2.Literal("source", "target", "both")
456
541
  });
457
542
  var QueryRelationTraversalClause = QueryRelationTraversalClause_;
543
+ var QueryHierarchyTraversalClause_ = Schema2.Struct({
544
+ type: Schema2.Literal("hierarchy-traversal"),
545
+ anchor: Schema2.suspend(() => Query),
546
+ /**
547
+ * to-parent: traverse from child to parent.
548
+ * to-children: traverse from parent to children.
549
+ */
550
+ direction: Schema2.Literal("to-parent", "to-children")
551
+ });
552
+ var QueryHierarchyTraversalClause = QueryHierarchyTraversalClause_;
458
553
  var QueryUnionClause_ = Schema2.Struct({
459
554
  type: Schema2.Literal("union"),
460
555
  queries: Schema2.Array(Schema2.suspend(() => Query))
@@ -466,50 +561,257 @@ var QuerySetDifferenceClause_ = Schema2.Struct({
466
561
  exclude: Schema2.suspend(() => Query)
467
562
  });
468
563
  var QuerySetDifferenceClause = QuerySetDifferenceClause_;
564
+ var OrderDirection = Schema2.Literal("asc", "desc");
565
+ var Order_ = Schema2.Union(Schema2.Struct({
566
+ // How database wants to order them (in practice - by id).
567
+ kind: Schema2.Literal("natural")
568
+ }), Schema2.Struct({
569
+ kind: Schema2.Literal("property"),
570
+ property: Schema2.String,
571
+ direction: OrderDirection
572
+ }), Schema2.Struct({
573
+ // Order by relevance rank (for FTS/vector search results).
574
+ // Default direction is 'desc' (higher rank = better match first).
575
+ kind: Schema2.Literal("rank"),
576
+ direction: OrderDirection
577
+ }));
578
+ var Order = Order_;
579
+ var QueryOrderClause_ = Schema2.Struct({
580
+ type: Schema2.Literal("order"),
581
+ query: Schema2.suspend(() => Query),
582
+ order: Schema2.Array(Order)
583
+ });
584
+ var QueryOrderClause = QueryOrderClause_;
469
585
  var QueryOptionsClause_ = Schema2.Struct({
470
586
  type: Schema2.Literal("options"),
471
587
  query: Schema2.suspend(() => Query),
472
588
  options: Schema2.suspend(() => QueryOptions)
473
589
  });
474
590
  var QueryOptionsClause = QueryOptionsClause_;
475
- var Query_ = Schema2.Union(QuerySelectClause, QueryFilterClause, QueryReferenceTraversalClause, QueryIncomingReferencesClause, QueryRelationClause, QueryRelationTraversalClause, QueryUnionClause, QuerySetDifferenceClause, QueryOptionsClause);
591
+ var QueryLimitClause_ = Schema2.Struct({
592
+ type: Schema2.Literal("limit"),
593
+ query: Schema2.suspend(() => Query),
594
+ limit: Schema2.Number
595
+ });
596
+ var QueryLimitClause = QueryLimitClause_;
597
+ var QueryFromClause_ = Schema2.Struct({
598
+ type: Schema2.Literal("from"),
599
+ query: Schema2.suspend(() => Query),
600
+ from: Schema2.Union(Schema2.TaggedStruct("scope", {
601
+ scope: Schema2.suspend(() => Scope)
602
+ }), Schema2.TaggedStruct("query", {
603
+ query: Schema2.suspend(() => Query)
604
+ }))
605
+ });
606
+ var QueryFromClause = QueryFromClause_;
607
+ var Query_ = Schema2.Union(QuerySelectClause, QueryFilterClause, QueryReferenceTraversalClause, QueryIncomingReferencesClause, QueryRelationClause, QueryRelationTraversalClause, QueryHierarchyTraversalClause, QueryUnionClause, QuerySetDifferenceClause, QueryOrderClause, QueryOptionsClause, QueryLimitClause, QueryFromClause).annotations({
608
+ identifier: "org.dxos.schema.query"
609
+ });
476
610
  var Query = Query_;
477
611
  var QueryOptions = Schema2.Struct({
478
- spaceIds: Schema2.optional(Schema2.Array(Schema2.String)),
612
+ /**
613
+ * Nested select statements will use this option to filter deleted objects.
614
+ */
479
615
  deleted: Schema2.optional(Schema2.Literal("include", "exclude", "only"))
480
616
  });
617
+ var Scope = Schema2.Struct({
618
+ /**
619
+ * The nested select statemets will select from the given spaces.
620
+ *
621
+ * NOTE: Spaces and queues are unioned together if both are specified.
622
+ */
623
+ spaceIds: Schema2.optional(Schema2.Array(Schema2.String)),
624
+ /**
625
+ * If true, the nested select statements will select from all queues in the spaces specified by `spaceIds`.
626
+ */
627
+ allQueuesFromSpaces: Schema2.optional(Schema2.Boolean),
628
+ /**
629
+ * The nested select statemets will select from the given queues.
630
+ *
631
+ * NOTE: Spaces and queues are unioned together if both are specified.
632
+ */
633
+ queues: Schema2.optional(Schema2.Array(DXN2.Schema))
634
+ });
481
635
  var visit = (query, visitor) => {
482
- switch (query.type) {
483
- case "filter":
484
- visit(query.selection, visitor);
485
- break;
486
- case "reference-traversal":
487
- visit(query.anchor, visitor);
488
- break;
489
- case "incoming-references":
490
- visit(query.anchor, visitor);
491
- break;
492
- case "relation":
493
- visit(query.anchor, visitor);
494
- break;
495
- case "options":
496
- visit(query.query, visitor);
497
- break;
498
- case "relation-traversal":
499
- visit(query.anchor, visitor);
500
- break;
501
- case "union":
502
- query.queries.forEach((q) => visit(q, visitor));
503
- break;
504
- case "set-difference":
505
- visit(query.source, visitor);
506
- visit(query.exclude, visitor);
507
- break;
636
+ visitor(query);
637
+ Match.value(query).pipe(Match.when({
638
+ type: "filter"
639
+ }, ({ selection }) => visit(selection, visitor)), Match.when({
640
+ type: "reference-traversal"
641
+ }, ({ anchor }) => visit(anchor, visitor)), Match.when({
642
+ type: "incoming-references"
643
+ }, ({ anchor }) => visit(anchor, visitor)), Match.when({
644
+ type: "relation"
645
+ }, ({ anchor }) => visit(anchor, visitor)), Match.when({
646
+ type: "options"
647
+ }, ({ query: query2 }) => visit(query2, visitor)), Match.when({
648
+ type: "relation-traversal"
649
+ }, ({ anchor }) => visit(anchor, visitor)), Match.when({
650
+ type: "hierarchy-traversal"
651
+ }, ({ anchor }) => visit(anchor, visitor)), Match.when({
652
+ type: "union"
653
+ }, ({ queries }) => queries.forEach((q) => visit(q, visitor))), Match.when({
654
+ type: "set-difference"
655
+ }, ({ source, exclude }) => {
656
+ visit(source, visitor);
657
+ visit(exclude, visitor);
658
+ }), Match.when({
659
+ type: "order"
660
+ }, ({ query: query2 }) => visit(query2, visitor)), Match.when({
661
+ type: "limit"
662
+ }, ({ query: query2 }) => visit(query2, visitor)), Match.when({
663
+ type: "from"
664
+ }, (node) => {
665
+ visit(node.query, visitor);
666
+ if (node.from._tag === "query") {
667
+ visit(node.from.query, visitor);
668
+ }
669
+ }), Match.when({
670
+ type: "select"
671
+ }, () => {
672
+ }), Match.exhaustive);
673
+ };
674
+ var map = (query, mapper) => {
675
+ const mapped = Match.value(query).pipe(Match.when({
676
+ type: "filter"
677
+ }, (node) => ({
678
+ ...node,
679
+ selection: map(node.selection, mapper)
680
+ })), Match.when({
681
+ type: "reference-traversal"
682
+ }, (node) => ({
683
+ ...node,
684
+ anchor: map(node.anchor, mapper)
685
+ })), Match.when({
686
+ type: "incoming-references"
687
+ }, (node) => ({
688
+ ...node,
689
+ anchor: map(node.anchor, mapper)
690
+ })), Match.when({
691
+ type: "relation"
692
+ }, (node) => ({
693
+ ...node,
694
+ anchor: map(node.anchor, mapper)
695
+ })), Match.when({
696
+ type: "relation-traversal"
697
+ }, (node) => ({
698
+ ...node,
699
+ anchor: map(node.anchor, mapper)
700
+ })), Match.when({
701
+ type: "hierarchy-traversal"
702
+ }, (node) => ({
703
+ ...node,
704
+ anchor: map(node.anchor, mapper)
705
+ })), Match.when({
706
+ type: "options"
707
+ }, (node) => ({
708
+ ...node,
709
+ query: map(node.query, mapper)
710
+ })), Match.when({
711
+ type: "order"
712
+ }, (node) => ({
713
+ ...node,
714
+ query: map(node.query, mapper)
715
+ })), Match.when({
716
+ type: "limit"
717
+ }, (node) => ({
718
+ ...node,
719
+ query: map(node.query, mapper)
720
+ })), Match.when({
721
+ type: "from"
722
+ }, (node) => ({
723
+ ...node,
724
+ query: map(node.query, mapper),
725
+ ...node.from._tag === "query" ? {
726
+ from: {
727
+ _tag: "query",
728
+ query: map(node.from.query, mapper)
729
+ }
730
+ } : {}
731
+ })), Match.when({
732
+ type: "union"
733
+ }, (node) => ({
734
+ ...node,
735
+ queries: node.queries.map((q) => map(q, mapper))
736
+ })), Match.when({
737
+ type: "set-difference"
738
+ }, (node) => ({
739
+ ...node,
740
+ source: map(node.source, mapper),
741
+ exclude: map(node.exclude, mapper)
742
+ })), Match.when({
743
+ type: "select"
744
+ }, (node) => node), Match.exhaustive);
745
+ return mapper(mapped);
746
+ };
747
+ var fold = (query, reducer) => {
748
+ return Match.value(query).pipe(Match.withReturnType(), Match.when({
749
+ type: "filter"
750
+ }, ({ selection }) => fold(selection, reducer)), Match.when({
751
+ type: "reference-traversal"
752
+ }, ({ anchor }) => fold(anchor, reducer)), Match.when({
753
+ type: "incoming-references"
754
+ }, ({ anchor }) => fold(anchor, reducer)), Match.when({
755
+ type: "relation"
756
+ }, ({ anchor }) => fold(anchor, reducer)), Match.when({
757
+ type: "options"
758
+ }, ({ query: query2 }) => fold(query2, reducer)), Match.when({
759
+ type: "relation-traversal"
760
+ }, ({ anchor }) => fold(anchor, reducer)), Match.when({
761
+ type: "hierarchy-traversal"
762
+ }, ({ anchor }) => fold(anchor, reducer)), Match.when({
763
+ type: "union"
764
+ }, ({ queries }) => queries.flatMap((q) => fold(q, reducer))), Match.when({
765
+ type: "set-difference"
766
+ }, ({ source, exclude }) => fold(source, reducer).concat(fold(exclude, reducer))), Match.when({
767
+ type: "order"
768
+ }, ({ query: query2 }) => fold(query2, reducer)), Match.when({
769
+ type: "limit"
770
+ }, ({ query: query2 }) => fold(query2, reducer)), Match.when({
771
+ type: "from"
772
+ }, (node) => {
773
+ const results = fold(node.query, reducer);
774
+ if (node.from._tag === "query") {
775
+ return results.concat(fold(node.from.query, reducer));
776
+ }
777
+ return results;
778
+ }), Match.when({
779
+ type: "select"
780
+ }, () => []), Match.exhaustive);
781
+ };
782
+
783
+ // src/space-doc-version.ts
784
+ var SpaceDocVersion = Object.freeze({
785
+ /**
786
+ * For the documents created before the versioning was introduced.
787
+ */
788
+ LEGACY: 0,
789
+ /**
790
+ * Current version.
791
+ */
792
+ CURRENT: 1
793
+ });
794
+
795
+ // src/space-id.ts
796
+ import { subtleCrypto } from "@dxos/crypto";
797
+ import { PublicKey, SpaceId } from "@dxos/keys";
798
+ import { ComplexMap } from "@dxos/util";
799
+ var SPACE_IDS_CACHE = new ComplexMap(PublicKey.hash);
800
+ var createIdFromSpaceKey = async (spaceKey) => {
801
+ const cachedValue = SPACE_IDS_CACHE.get(spaceKey);
802
+ if (cachedValue !== void 0) {
803
+ return cachedValue;
508
804
  }
805
+ const digest = await subtleCrypto.digest("SHA-256", spaceKey.asUint8Array());
806
+ const bytes = new Uint8Array(digest).slice(0, SpaceId.byteLength);
807
+ const spaceId = SpaceId.encode(bytes);
808
+ SPACE_IDS_CACHE.set(spaceKey, spaceId);
809
+ return spaceId;
509
810
  };
510
811
  export {
511
812
  DATA_NAMESPACE,
512
813
  DatabaseDirectory,
814
+ EchoFeedCodec,
513
815
  EncodedReference,
514
816
  ForeignKey,
515
817
  ObjectStructure,