@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.
- package/dist/lib/browser/{chunk-TQJTKNMS.mjs → chunk-ANZAS5CC.mjs} +2 -2
- package/dist/lib/browser/{chunk-35I6ERLG.mjs → chunk-GBFX5J5B.mjs} +27 -27
- package/dist/lib/browser/filter/index.mjs +1 -1
- package/dist/lib/browser/index.mjs +162 -93
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +13 -13
- package/dist/lib/node-esm/{chunk-RVK35BS7.mjs → chunk-2SAZ7CCF.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-5BHLPT24.mjs → chunk-FQFKWA3X.mjs} +27 -27
- package/dist/lib/node-esm/filter/index.mjs +1 -1
- package/dist/lib/node-esm/index.mjs +162 -93
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +13 -13
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-replicator.d.ts +1 -1
- package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
- package/dist/types/src/automerge/index.d.ts +1 -1
- package/dist/types/src/automerge/index.d.ts.map +1 -1
- package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
- package/dist/types/src/db-host/query-service.d.ts.map +1 -1
- package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
- package/dist/types/src/query/errors.d.ts +17 -5
- package/dist/types/src/query/errors.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +38 -38
- package/src/automerge/echo-network-adapter.ts +2 -1
- package/src/automerge/echo-replicator.ts +2 -1
- package/src/automerge/index.ts +1 -1
- package/src/db-host/documents-synchronizer.ts +4 -1
- package/src/db-host/query-service.ts +6 -0
- package/src/edge/echo-edge-replicator.ts +31 -11
- package/dist/lib/node/chunk-HOPOFWAL.cjs +0 -147
- package/dist/lib/node/chunk-HOPOFWAL.cjs.map +0 -7
- package/dist/lib/node/chunk-JXX6LF5U.cjs +0 -2084
- package/dist/lib/node/chunk-JXX6LF5U.cjs.map +0 -7
- package/dist/lib/node/chunk-Q7SFCCGT.cjs +0 -33
- package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +0 -7
- package/dist/lib/node/filter/index.cjs +0 -32
- package/dist/lib/node/filter/index.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -4699
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/testing/index.cjs +0 -753
- package/dist/lib/node/testing/index.cjs.map +0 -7
- /package/dist/lib/browser/{chunk-TQJTKNMS.mjs.map → chunk-ANZAS5CC.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-35I6ERLG.mjs.map → chunk-GBFX5J5B.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-RVK35BS7.mjs.map → chunk-2SAZ7CCF.mjs.map} +0 -0
- /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
|
+
"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.
|
|
44
|
-
"@automerge/automerge-repo": "2.0.
|
|
43
|
+
"@automerge/automerge": "3.1.1",
|
|
44
|
+
"@automerge/automerge-repo": "2.0.8",
|
|
45
45
|
"crc-32": "^1.2.2",
|
|
46
|
-
"effect": "3.
|
|
46
|
+
"effect": "3.17.0",
|
|
47
47
|
"level-transcoder": "^1.0.1",
|
|
48
48
|
"lodash.isequal": "^4.5.0",
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/context": "0.8.
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/crypto": "0.8.
|
|
54
|
-
"@dxos/debug": "0.8.
|
|
55
|
-
"@dxos/echo": "0.8.
|
|
56
|
-
"@dxos/echo-protocol": "0.8.
|
|
57
|
-
"@dxos/edge-client": "0.8.
|
|
58
|
-
"@dxos/echo-schema": "0.8.
|
|
59
|
-
"@dxos/feed-store": "0.8.
|
|
60
|
-
"@dxos/errors": "0.8.
|
|
61
|
-
"@dxos/
|
|
62
|
-
"@dxos/
|
|
63
|
-
"@dxos/
|
|
64
|
-
"@dxos/keyring": "0.8.
|
|
65
|
-
"@dxos/keys": "0.8.
|
|
66
|
-
"@dxos/kv-store": "0.8.
|
|
67
|
-
"@dxos/log": "0.8.
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/
|
|
71
|
-
"@dxos/
|
|
72
|
-
"@dxos/
|
|
73
|
-
"@dxos/
|
|
74
|
-
"@dxos/teleport-extension-
|
|
75
|
-
"@dxos/teleport-extension-
|
|
76
|
-
"@dxos/teleport-extension-
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/
|
|
79
|
-
"@dxos/
|
|
80
|
-
"@dxos/util": "0.8.
|
|
81
|
-
"@dxos/
|
|
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.
|
|
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
|
|
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.
|
package/src/automerge/index.ts
CHANGED
|
@@ -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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
}
|