@dxos/echo-pipeline 0.8.3 → 0.8.4-main.2e9d522

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 (49) hide show
  1. package/dist/lib/browser/{chunk-TQJTKNMS.mjs → chunk-ANZAS5CC.mjs} +2 -2
  2. package/dist/lib/browser/{chunk-35I6ERLG.mjs → chunk-GBFX5J5B.mjs} +27 -27
  3. package/dist/lib/browser/filter/index.mjs +1 -1
  4. package/dist/lib/browser/index.mjs +162 -93
  5. package/dist/lib/browser/index.mjs.map +3 -3
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/testing/index.mjs +13 -13
  8. package/dist/lib/node-esm/{chunk-RVK35BS7.mjs → chunk-2SAZ7CCF.mjs} +2 -2
  9. package/dist/lib/node-esm/{chunk-5BHLPT24.mjs → chunk-FQFKWA3X.mjs} +27 -27
  10. package/dist/lib/node-esm/filter/index.mjs +1 -1
  11. package/dist/lib/node-esm/index.mjs +162 -93
  12. package/dist/lib/node-esm/index.mjs.map +3 -3
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +13 -13
  15. package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
  16. package/dist/types/src/automerge/echo-replicator.d.ts +1 -1
  17. package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
  18. package/dist/types/src/automerge/index.d.ts +1 -1
  19. package/dist/types/src/automerge/index.d.ts.map +1 -1
  20. package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
  21. package/dist/types/src/db-host/query-service.d.ts.map +1 -1
  22. package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
  23. package/dist/types/src/query/errors.d.ts +17 -5
  24. package/dist/types/src/query/errors.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +38 -38
  27. package/src/automerge/echo-network-adapter.ts +2 -1
  28. package/src/automerge/echo-replicator.ts +2 -1
  29. package/src/automerge/index.ts +1 -1
  30. package/src/db-host/documents-synchronizer.ts +4 -1
  31. package/src/db-host/query-service.ts +6 -0
  32. package/src/edge/echo-edge-replicator.ts +31 -11
  33. package/dist/lib/node/chunk-HOPOFWAL.cjs +0 -147
  34. package/dist/lib/node/chunk-HOPOFWAL.cjs.map +0 -7
  35. package/dist/lib/node/chunk-JXX6LF5U.cjs +0 -2084
  36. package/dist/lib/node/chunk-JXX6LF5U.cjs.map +0 -7
  37. package/dist/lib/node/chunk-Q7SFCCGT.cjs +0 -33
  38. package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +0 -7
  39. package/dist/lib/node/filter/index.cjs +0 -32
  40. package/dist/lib/node/filter/index.cjs.map +0 -7
  41. package/dist/lib/node/index.cjs +0 -4699
  42. package/dist/lib/node/index.cjs.map +0 -7
  43. package/dist/lib/node/meta.json +0 -1
  44. package/dist/lib/node/testing/index.cjs +0 -753
  45. package/dist/lib/node/testing/index.cjs.map +0 -7
  46. /package/dist/lib/browser/{chunk-TQJTKNMS.mjs.map → chunk-ANZAS5CC.mjs.map} +0 -0
  47. /package/dist/lib/browser/{chunk-35I6ERLG.mjs.map → chunk-GBFX5J5B.mjs.map} +0 -0
  48. /package/dist/lib/node-esm/{chunk-RVK35BS7.mjs.map → chunk-2SAZ7CCF.mjs.map} +0 -0
  49. /package/dist/lib/node-esm/{chunk-5BHLPT24.mjs.map → chunk-FQFKWA3X.mjs.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/echo-pipeline",
3
- "version": "0.8.3",
3
+ "version": "0.8.4-main.2e9d522",
4
4
  "description": "ECHO database.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -40,51 +40,51 @@
40
40
  "src"
41
41
  ],
42
42
  "dependencies": {
43
- "@automerge/automerge": "3.0.0-beta.4",
44
- "@automerge/automerge-repo": "2.0.1",
43
+ "@automerge/automerge": "3.1.1",
44
+ "@automerge/automerge-repo": "2.0.8",
45
45
  "crc-32": "^1.2.2",
46
- "effect": "3.14.21",
46
+ "effect": "3.17.0",
47
47
  "level-transcoder": "^1.0.1",
48
48
  "lodash.isequal": "^4.5.0",
49
- "@dxos/codec-protobuf": "0.8.3",
50
- "@dxos/credentials": "0.8.3",
51
- "@dxos/context": "0.8.3",
52
- "@dxos/async": "0.8.3",
53
- "@dxos/crypto": "0.8.3",
54
- "@dxos/debug": "0.8.3",
55
- "@dxos/echo": "0.8.3",
56
- "@dxos/echo-protocol": "0.8.3",
57
- "@dxos/edge-client": "0.8.3",
58
- "@dxos/echo-schema": "0.8.3",
59
- "@dxos/feed-store": "0.8.3",
60
- "@dxos/errors": "0.8.3",
61
- "@dxos/indexing": "0.8.3",
62
- "@dxos/hypercore": "0.8.3",
63
- "@dxos/invariant": "0.8.3",
64
- "@dxos/keyring": "0.8.3",
65
- "@dxos/keys": "0.8.3",
66
- "@dxos/kv-store": "0.8.3",
67
- "@dxos/log": "0.8.3",
68
- "@dxos/messaging": "0.8.3",
69
- "@dxos/network-manager": "0.8.3",
70
- "@dxos/node-std": "0.8.3",
71
- "@dxos/teleport": "0.8.3",
72
- "@dxos/protocols": "0.8.3",
73
- "@dxos/random-access-storage": "0.8.3",
74
- "@dxos/teleport-extension-automerge-replicator": "0.8.3",
75
- "@dxos/teleport-extension-gossip": "0.8.3",
76
- "@dxos/teleport-extension-object-sync": "0.8.3",
77
- "@dxos/teleport-extension-replicator": "0.8.3",
78
- "@dxos/timeframe": "0.8.3",
79
- "@dxos/tracing": "0.8.3",
80
- "@dxos/util": "0.8.3",
81
- "@dxos/typings": "0.8.3"
49
+ "@dxos/async": "0.8.4-main.2e9d522",
50
+ "@dxos/codec-protobuf": "0.8.4-main.2e9d522",
51
+ "@dxos/context": "0.8.4-main.2e9d522",
52
+ "@dxos/credentials": "0.8.4-main.2e9d522",
53
+ "@dxos/crypto": "0.8.4-main.2e9d522",
54
+ "@dxos/debug": "0.8.4-main.2e9d522",
55
+ "@dxos/echo": "0.8.4-main.2e9d522",
56
+ "@dxos/echo-protocol": "0.8.4-main.2e9d522",
57
+ "@dxos/edge-client": "0.8.4-main.2e9d522",
58
+ "@dxos/echo-schema": "0.8.4-main.2e9d522",
59
+ "@dxos/feed-store": "0.8.4-main.2e9d522",
60
+ "@dxos/errors": "0.8.4-main.2e9d522",
61
+ "@dxos/hypercore": "0.8.4-main.2e9d522",
62
+ "@dxos/invariant": "0.8.4-main.2e9d522",
63
+ "@dxos/indexing": "0.8.4-main.2e9d522",
64
+ "@dxos/keyring": "0.8.4-main.2e9d522",
65
+ "@dxos/keys": "0.8.4-main.2e9d522",
66
+ "@dxos/kv-store": "0.8.4-main.2e9d522",
67
+ "@dxos/log": "0.8.4-main.2e9d522",
68
+ "@dxos/network-manager": "0.8.4-main.2e9d522",
69
+ "@dxos/protocols": "0.8.4-main.2e9d522",
70
+ "@dxos/messaging": "0.8.4-main.2e9d522",
71
+ "@dxos/random-access-storage": "0.8.4-main.2e9d522",
72
+ "@dxos/teleport": "0.8.4-main.2e9d522",
73
+ "@dxos/teleport-extension-automerge-replicator": "0.8.4-main.2e9d522",
74
+ "@dxos/teleport-extension-gossip": "0.8.4-main.2e9d522",
75
+ "@dxos/teleport-extension-object-sync": "0.8.4-main.2e9d522",
76
+ "@dxos/teleport-extension-replicator": "0.8.4-main.2e9d522",
77
+ "@dxos/timeframe": "0.8.4-main.2e9d522",
78
+ "@dxos/node-std": "0.8.4-main.2e9d522",
79
+ "@dxos/typings": "0.8.4-main.2e9d522",
80
+ "@dxos/util": "0.8.4-main.2e9d522",
81
+ "@dxos/tracing": "0.8.4-main.2e9d522"
82
82
  },
83
83
  "devDependencies": {
84
84
  "@types/lodash.isequal": "^4.5.0",
85
85
  "fast-check": "^3.19.0",
86
86
  "get-port-please": "^3.1.1",
87
- "@dxos/test-utils": "0.8.3"
87
+ "@dxos/test-utils": "0.8.4-main.2e9d522"
88
88
  },
89
89
  "publishConfig": {
90
90
  "access": "public"
@@ -281,8 +281,9 @@ export class EchoNetworkAdapter extends NetworkAdapter {
281
281
  this.emit('peer-disconnected', { peerId: connection.peerId as PeerId });
282
282
  this._params.monitor?.recordPeerDisconnected(connection.peerId);
283
283
 
284
- void entry.reader.cancel().catch((err) => log.catch(err));
285
284
  void entry.writer.abort().catch((err) => log.catch(err));
285
+ void entry.reader.cancel().catch((err) => log.catch(err));
286
+
286
287
  this._connections.delete(connection.peerId as PeerId);
287
288
  }
288
289
 
@@ -3,8 +3,9 @@
3
3
  //
4
4
 
5
5
  import { type PublicKey, type SpaceId } from '@dxos/keys';
6
- import type { AutomergeProtocolMessage } from '@dxos/protocols';
6
+ import { type AutomergeProtocolMessage } from '@dxos/protocols';
7
7
 
8
+ // TODO(burdon): Rename AutomergeReplicator?
8
9
  export interface EchoReplicator {
9
10
  /**
10
11
  * Called on when replicator is added to EchoHost.
@@ -5,7 +5,7 @@
5
5
  export * from './automerge-host';
6
6
  export * from './leveldb-storage-adapter';
7
7
  export * from './mesh-echo-replicator';
8
- export * from './echo-replicator';
8
+ export type * from './echo-replicator';
9
9
  export { diffCollectionState } from './collection-synchronizer';
10
10
  export * from './space-collection';
11
11
  export * from './echo-data-monitor';
@@ -6,7 +6,7 @@ import { next as A, type Heads } from '@automerge/automerge';
6
6
  import { type Repo, type DocHandle, type DocumentId } from '@automerge/automerge-repo';
7
7
 
8
8
  import { UpdateScheduler } from '@dxos/async';
9
- import { Resource } from '@dxos/context';
9
+ import { LifecycleState, Resource } from '@dxos/context';
10
10
  import { type DatabaseDirectory } from '@dxos/echo-protocol';
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { log } from '@dxos/log';
@@ -158,6 +158,9 @@ export class DocumentsSynchronizer extends Resource {
158
158
  }
159
159
 
160
160
  private _writeMutation(documentId: DocumentId, mutation: Uint8Array): void {
161
+ if (this._lifecycleState === LifecycleState.CLOSED) {
162
+ return;
163
+ }
161
164
  const syncState = this._syncStates.get(documentId);
162
165
  invariant(syncState, 'Sync state for document not found');
163
166
  syncState.handle.update((doc) => {
@@ -96,6 +96,12 @@ export class QueryServiceImpl extends Resource implements QueryService {
96
96
 
97
97
  execQuery(request: QueryRequest): Stream<QueryResponse> {
98
98
  return new Stream<QueryResponse>(({ next, close, ctx }) => {
99
+ if (this._params.indexer.config?.enabled !== true) {
100
+ log.error('indexer is disabled', { config: this._params.indexer.config });
101
+ close();
102
+ return;
103
+ }
104
+
99
105
  const queryEntry = this._createQuery(ctx, request, next, close, close);
100
106
  scheduleMicroTask(ctx, async () => {
101
107
  await queryEntry.executor.open();
@@ -132,9 +132,11 @@ export class EchoEdgeReplicator implements EchoReplicator {
132
132
  context: this._context,
133
133
  sharedPolicyEnabled: this._sharePolicyEnabled,
134
134
  onRemoteConnected: async () => {
135
+ log.trace('dxos.echo.edge.replicator.onRemoteConnected', { spaceId });
135
136
  this._context?.onConnectionOpen(connection);
136
137
  },
137
138
  onRemoteDisconnected: async () => {
139
+ log.trace('dxos.echo.edge.replicator.onRemoteDisconnected', { spaceId });
138
140
  this._context?.onConnectionClosed(connection);
139
141
  },
140
142
  onRestartRequested: async () => {
@@ -162,6 +164,7 @@ export class EchoEdgeReplicator implements EchoReplicator {
162
164
  if (ctx?.disposed) {
163
165
  return;
164
166
  }
167
+ log.trace('dxos.echo.edge.replicator.restart', { spaceId, reconnects, restartDelay });
165
168
  await this._openConnection(spaceId, reconnects + 1);
166
169
  },
167
170
  restartDelay,
@@ -252,13 +255,26 @@ class EdgeReplicatorConnection extends Resource implements ReplicatorConnection
252
255
 
253
256
  await this._requestLimiter.open();
254
257
 
255
- // TODO: handle reconnects
256
258
  this._ctx.onDispose(
257
259
  this._edgeConnection.onMessage((msg: RouterMessage) => {
258
260
  this._onMessage(msg);
259
261
  }),
260
262
  );
261
263
 
264
+ let firstReconnect = true;
265
+ this._ctx.onDispose(
266
+ // NOTE: This will fire immediately if the connection is already open.
267
+ this._edgeConnection.onReconnected(async () => {
268
+ if (firstReconnect) {
269
+ log.verbose('first reconnect skipped');
270
+ firstReconnect = false;
271
+ return;
272
+ }
273
+
274
+ this._onRestartRequested();
275
+ }),
276
+ );
277
+
262
278
  await this._onRemoteConnected();
263
279
  }
264
280
 
@@ -353,16 +369,20 @@ class EdgeReplicatorConnection extends Resource implements ReplicatorConnection
353
369
 
354
370
  const encoded = cbor.encode(message);
355
371
 
356
- await this._edgeConnection.send(
357
- buf.create(RouterMessageSchema, {
358
- serviceId: this._targetServiceId,
359
- source: {
360
- identityKey: this._edgeConnection.identityKey,
361
- peerKey: this._edgeConnection.peerKey,
362
- },
363
- payload: { value: bufferToArray(encoded) },
364
- }),
365
- );
372
+ try {
373
+ await this._edgeConnection.send(
374
+ buf.create(RouterMessageSchema, {
375
+ serviceId: this._targetServiceId,
376
+ source: {
377
+ identityKey: this._edgeConnection.identityKey,
378
+ peerKey: this._edgeConnection.peerKey,
379
+ },
380
+ payload: { value: bufferToArray(encoded) },
381
+ }),
382
+ );
383
+ } catch (err) {
384
+ log.error('failed to send message', { err });
385
+ }
366
386
  }
367
387
  }
368
388
 
@@ -1,147 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_HOPOFWAL_exports = {};
20
- __export(chunk_HOPOFWAL_exports, {
21
- filterMatchObject: () => filterMatchObject,
22
- filterMatchValue: () => filterMatchValue
23
- });
24
- module.exports = __toCommonJS(chunk_HOPOFWAL_exports);
25
- var import_echo_protocol = require("@dxos/echo-protocol");
26
- var import_echo_schema = require("@dxos/echo-schema");
27
- var import_keys = require("@dxos/keys");
28
- var filterMatchObject = (filter, obj) => {
29
- switch (filter.type) {
30
- case "object": {
31
- if (filter.typename !== null) {
32
- if (!obj.doc.system?.type?.["/"]) {
33
- const expectedDXN = import_keys.DXN.parse(filter.typename).asTypeDXN();
34
- if (expectedDXN?.type !== import_echo_schema.EXPANDO_TYPENAME) {
35
- return false;
36
- }
37
- } else {
38
- const actualDXN = import_keys.DXN.parse(obj.doc.system.type["/"]);
39
- const expectedDXN = import_keys.DXN.parse(filter.typename);
40
- if (!compareTypename(expectedDXN, actualDXN)) {
41
- return false;
42
- }
43
- }
44
- }
45
- if (filter.id && filter.id.length > 0 && !filter.id.includes(obj.id)) {
46
- return false;
47
- }
48
- if (filter.props) {
49
- for (const [key, valueFilter] of Object.entries(filter.props)) {
50
- const value = obj.doc.data[key];
51
- if (!filterMatchValue(valueFilter, value)) {
52
- return false;
53
- }
54
- }
55
- }
56
- if (filter.foreignKeys && filter.foreignKeys.length > 0) {
57
- const hasMatchingKey = filter.foreignKeys.some((filterKey) => obj.doc.meta.keys.some((objKey) => objKey.source === filterKey.source && objKey.id === filterKey.id));
58
- if (!hasMatchingKey) {
59
- return false;
60
- }
61
- }
62
- return true;
63
- }
64
- case "text-search": {
65
- return false;
66
- }
67
- case "not": {
68
- return !filterMatchObject(filter.filter, obj);
69
- }
70
- case "and": {
71
- return filter.filters.every((f) => filterMatchObject(f, obj));
72
- }
73
- case "or": {
74
- return filter.filters.some((f) => filterMatchObject(f, obj));
75
- }
76
- default:
77
- return false;
78
- }
79
- };
80
- var filterMatchValue = (filter, value) => {
81
- switch (filter.type) {
82
- case "compare": {
83
- const compareValue = filter.value;
84
- switch (filter.operator) {
85
- case "eq":
86
- if ((0, import_echo_protocol.isEncodedReference)(compareValue)) {
87
- if (!(0, import_echo_protocol.isEncodedReference)(value)) {
88
- return false;
89
- }
90
- return import_keys.DXN.equals((0, import_echo_protocol.decodeReference)(value).toDXN(), (0, import_echo_protocol.decodeReference)(compareValue).toDXN());
91
- }
92
- return value === compareValue;
93
- case "neq":
94
- return value !== compareValue;
95
- case "gt":
96
- return value > compareValue;
97
- case "gte":
98
- return value >= compareValue;
99
- case "lt":
100
- return value < compareValue;
101
- case "lte":
102
- return value <= compareValue;
103
- }
104
- break;
105
- }
106
- case "in": {
107
- return filter.values.includes(value);
108
- }
109
- case "range": {
110
- return value >= filter.from && value <= filter.to;
111
- }
112
- case "not": {
113
- return !filterMatchValue(filter.filter, value);
114
- }
115
- case "and": {
116
- return filter.filters.every((f) => filterMatchValue(f, value));
117
- }
118
- case "or": {
119
- return filter.filters.some((f) => filterMatchValue(f, value));
120
- }
121
- default:
122
- return false;
123
- }
124
- };
125
- var compareTypename = (expectedDXN, actualDXN) => {
126
- const expectedTypeDXN = expectedDXN.asTypeDXN();
127
- if (expectedTypeDXN) {
128
- const actualTypeDXN = actualDXN.asTypeDXN();
129
- if (!actualTypeDXN) {
130
- return false;
131
- }
132
- if (actualTypeDXN.type !== expectedTypeDXN.type || expectedTypeDXN.version !== void 0 && actualTypeDXN.version !== void 0 && actualTypeDXN.version !== expectedTypeDXN.version) {
133
- return false;
134
- }
135
- } else {
136
- if (!import_keys.DXN.equals(actualDXN, expectedDXN)) {
137
- return false;
138
- }
139
- }
140
- return true;
141
- };
142
- // Annotate the CommonJS export names for ESM import in node:
143
- 0 && (module.exports = {
144
- filterMatchObject,
145
- filterMatchValue
146
- });
147
- //# sourceMappingURL=chunk-HOPOFWAL.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/filter/filter-match.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { decodeReference, isEncodedReference, type QueryAST, type ObjectStructure } from '@dxos/echo-protocol';\nimport { EXPANDO_TYPENAME } from '@dxos/echo-schema';\nimport { DXN, type ObjectId, type SpaceId } from '@dxos/keys';\n\nexport type MatchedObject = {\n id: ObjectId;\n spaceId: SpaceId;\n doc: ObjectStructure;\n};\n\n/**\n * Matches an object against a filter AST.\n */\nexport const filterMatchObject = (filter: QueryAST.Filter, obj: MatchedObject): boolean => {\n switch (filter.type) {\n case 'object': {\n // Check typename if specified\n if (filter.typename !== null) {\n // TODO(dmaretskyi): `system` is missing in some cases.\n if (!obj.doc.system?.type?.['/']) {\n // Objects with no type are considered to be expando objects\n const expectedDXN = DXN.parse(filter.typename).asTypeDXN();\n if (expectedDXN?.type !== EXPANDO_TYPENAME) {\n return false;\n }\n } else {\n const actualDXN = DXN.parse(obj.doc.system.type['/']);\n const expectedDXN = DXN.parse(filter.typename);\n\n if (!compareTypename(expectedDXN, actualDXN)) {\n return false;\n }\n }\n }\n\n // Check IDs if specified\n if (filter.id && filter.id.length > 0 && !filter.id.includes(obj.id)) {\n return false;\n }\n\n // Check properties\n if (filter.props) {\n for (const [key, valueFilter] of Object.entries(filter.props)) {\n const value = obj.doc.data[key];\n if (!filterMatchValue(valueFilter, value)) {\n return false;\n }\n }\n }\n\n // Check foreign keys if specified\n if (filter.foreignKeys && filter.foreignKeys.length > 0) {\n const hasMatchingKey = filter.foreignKeys.some((filterKey) =>\n obj.doc.meta.keys.some((objKey) => objKey.source === filterKey.source && objKey.id === filterKey.id),\n );\n if (!hasMatchingKey) {\n return false;\n }\n }\n\n return true;\n }\n\n case 'text-search': {\n // TODO: Implement text search\n return false;\n }\n\n case 'not': {\n return !filterMatchObject(filter.filter, obj);\n }\n\n case 'and': {\n return filter.filters.every((f) => filterMatchObject(f, obj));\n }\n\n case 'or': {\n return filter.filters.some((f) => filterMatchObject(f, obj));\n }\n\n default:\n return false;\n }\n};\n\nexport const filterMatchValue = (filter: QueryAST.Filter, value: unknown): boolean => {\n switch (filter.type) {\n case 'compare': {\n const compareValue = filter.value as any;\n switch (filter.operator) {\n case 'eq':\n if (isEncodedReference(compareValue)) {\n if (!isEncodedReference(value)) {\n return false;\n }\n return DXN.equals(decodeReference(value).toDXN(), decodeReference(compareValue).toDXN());\n }\n return value === compareValue;\n case 'neq':\n return value !== compareValue;\n case 'gt':\n return (value as any) > compareValue;\n case 'gte':\n return (value as any) >= compareValue;\n case 'lt':\n return (value as any) < compareValue;\n case 'lte':\n return (value as any) <= compareValue;\n }\n break;\n }\n case 'in': {\n return filter.values.includes(value);\n }\n case 'range': {\n return (value as any) >= filter.from && (value as any) <= filter.to;\n }\n case 'not': {\n return !filterMatchValue(filter.filter, value);\n }\n case 'and': {\n return filter.filters.every((f) => filterMatchValue(f, value));\n }\n case 'or': {\n return filter.filters.some((f) => filterMatchValue(f, value));\n }\n default:\n return false;\n }\n};\n\n/**\n * Compares typename DXNs.\n * @returns true if they match\n *\n * Compares typename string.\n * Missing version (on either actual or expected) matches any version.\n * non `type` DXNs are compared exactly.\n *\n * Examples: (expected) (actual)\n *\n * dxn:type:example.org/type/Task !== dxn:type:example.org/type/Contact\n * dxn:type:example.org/type/Task === dxn:type:example.org/type/Task\n * dxn:type:example.org/type/Task:0.1.0 !== dxn:type:example.org/type/Task:0.2.0\n * dxn:type:example.org/type/Task === dxn:type:example.org/type/Task:0.1.0\n * dxn:type:example.org/type/Task:0.1.0 === dxn:type:example.org/type/Task\n *\n */\nconst compareTypename = (expectedDXN: DXN, actualDXN: DXN): boolean => {\n const expectedTypeDXN = expectedDXN.asTypeDXN();\n if (expectedTypeDXN) {\n const actualTypeDXN = actualDXN.asTypeDXN();\n if (!actualTypeDXN) {\n return false;\n }\n if (\n actualTypeDXN.type !== expectedTypeDXN.type ||\n (expectedTypeDXN.version !== undefined &&\n actualTypeDXN.version !== undefined &&\n actualTypeDXN.version !== expectedTypeDXN.version)\n ) {\n return false;\n }\n } else {\n if (!DXN.equals(actualDXN, expectedDXN)) {\n return false;\n }\n }\n return true;\n};\n"],
5
- "mappings": "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",
6
- "names": ["filterMatchObject", "filter", "obj", "type", "typename", "doc", "system", "expectedDXN", "DXN", "parse", "asTypeDXN", "EXPANDO_TYPENAME", "actualDXN", "compareTypename", "id", "length", "includes", "props", "key", "valueFilter", "Object", "entries", "value", "data", "filterMatchValue", "foreignKeys", "hasMatchingKey", "some", "filterKey", "meta", "keys", "objKey", "source", "filters", "every", "f", "compareValue", "operator", "isEncodedReference", "equals", "decodeReference", "toDXN", "values", "from", "to", "expectedTypeDXN", "actualTypeDXN", "version", "undefined"]
7
- }