@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.
- package/dist/lib/{browser → neutral}/index.mjs +378 -76
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/types/src/document-structure.d.ts +15 -1
- package/dist/types/src/document-structure.d.ts.map +1 -1
- package/dist/types/src/echo-feed-codec.d.ts +17 -0
- package/dist/types/src/echo-feed-codec.d.ts.map +1 -0
- package/dist/types/src/foreign-key.d.ts +1 -1
- package/dist/types/src/foreign-key.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +4 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/query/ast.d.ts +221 -23
- package/dist/types/src/query/ast.d.ts.map +1 -1
- package/dist/types/src/reference.d.ts +1 -0
- package/dist/types/src/reference.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -11
- package/src/document-structure.ts +23 -1
- package/src/echo-feed-codec.ts +67 -0
- package/src/foreign-key.ts +4 -3
- package/src/index.ts +4 -3
- package/src/query/ast.ts +310 -34
- package/src/reference.ts +5 -2
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -527
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
|
@@ -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(
|
|
39
|
-
return new _Reference(
|
|
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 = (
|
|
128
|
-
if (typeof
|
|
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 =
|
|
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 = (
|
|
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: (
|
|
141
|
-
assertArgument(isEncodedReference(
|
|
142
|
-
return
|
|
140
|
+
getReferenceString: (value2) => {
|
|
141
|
+
assertArgument(isEncodedReference(value2), "value", "invalid reference");
|
|
142
|
+
return value2["/"];
|
|
143
143
|
},
|
|
144
|
-
toDXN: (
|
|
145
|
-
return DXN.parse(EncodedReference.getReferenceString(
|
|
144
|
+
toDXN: (value2) => {
|
|
145
|
+
return DXN.parse(EncodedReference.getReferenceString(value2));
|
|
146
146
|
},
|
|
147
147
|
fromDXN: (dxn) => {
|
|
148
|
-
return
|
|
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,
|
|
227
|
-
if (isEncodedReference(
|
|
236
|
+
const visit2 = (path, value2) => {
|
|
237
|
+
if (isEncodedReference(value2)) {
|
|
228
238
|
references.push({
|
|
229
239
|
path,
|
|
230
|
-
reference:
|
|
240
|
+
reference: value2
|
|
231
241
|
});
|
|
232
242
|
} else {
|
|
233
|
-
visitValues(
|
|
243
|
+
visitValues(value2, (value3, key) => visit2([
|
|
234
244
|
...path,
|
|
235
245
|
String(key)
|
|
236
|
-
],
|
|
246
|
+
], value3));
|
|
237
247
|
}
|
|
238
248
|
};
|
|
239
|
-
visitValues(object.data, (
|
|
249
|
+
visitValues(object.data, (value2, key) => visit2([
|
|
240
250
|
String(key)
|
|
241
|
-
],
|
|
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/
|
|
280
|
-
|
|
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
|
-
*
|
|
299
|
+
* Prepares a value for feed storage (strips queue position from metadata) and encodes to bytes.
|
|
283
300
|
*/
|
|
284
|
-
|
|
301
|
+
static encode(value2) {
|
|
302
|
+
const prepared = _EchoFeedCodec.#stripQueuePosition(value2);
|
|
303
|
+
return _EchoFeedCodec.#encoder.encode(JSON.stringify(prepared));
|
|
304
|
+
}
|
|
285
305
|
/**
|
|
286
|
-
*
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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,
|