@peerbit/trusted-network 5.1.5 → 5.1.6-3f16953
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/src/controller.d.ts +1 -0
- package/dist/src/controller.d.ts.map +1 -1
- package/dist/src/controller.js +18 -13
- package/dist/src/controller.js.map +1 -1
- package/dist/src/identity-graph.d.ts +2 -0
- package/dist/src/identity-graph.d.ts.map +1 -1
- package/dist/src/identity-graph.js +36 -17
- package/dist/src/identity-graph.js.map +1 -1
- package/package.json +9 -9
- package/src/controller.ts +24 -13
- package/src/identity-graph.ts +53 -24
package/dist/src/controller.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ type TrustedNetworkArgs = {
|
|
|
28
28
|
export declare class TrustedNetwork extends Program<TrustedNetworkArgs> {
|
|
29
29
|
rootTrust: PublicSignKey;
|
|
30
30
|
trustGraph: DocumentsLike<IdentityRelation, FromTo>;
|
|
31
|
+
private _lastWarmupAt;
|
|
31
32
|
constructor(props: {
|
|
32
33
|
id?: Uint8Array;
|
|
33
34
|
rootTrust: PublicSignKey | PeerId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACN,aAAa,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,OAAO,EAEZ,KAAK,aAAa,EAClB,KAAK,SAAS,EAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACN,MAAM,EACN,gBAAgB,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACN,aAAa,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,OAAO,EAEZ,KAAK,aAAa,EAClB,KAAK,SAAS,EAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACN,MAAM,EACN,gBAAgB,EAQhB,MAAM,qBAAqB,CAAC;AA8D7B,KAAK,iBAAiB,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,qBACa,aAAc,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IAE5D,aAAa,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;gBAE3C,KAAK,CAAC,EAAE;QACnB,EAAE,CAAC,EAAE,UAAU,CAAC;QAChB,aAAa,CAAC,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;KACxD;IAQK,UAAU,CACf,UAAU,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC;IAIb,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB;IAYhC,WAAW,CAChB,EAAE,EAAE,aAAa,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC;CAWnC;AAED;;GAEG;AAEH,KAAK,kBAAkB,GAAG;IAAE,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE7D,qBACa,cAAe,SAAQ,OAAO,CAAC,kBAAkB,CAAC;IAE9D,SAAS,EAAE,aAAa,CAAC;IAGzB,UAAU,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAIpD,OAAO,CAAC,aAAa,CAAK;gBAEd,KAAK,EAAE;QAAE,EAAE,CAAC,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE;IAMnE,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB;IAejC,UAAU,CACf,UAAU,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC;IAIb,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAInE,GAAG,CACR,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC;IAsB7B,WAAW,CAChB,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,GAAE,aAAa,GAAG,MAAuB;IAIjD,WAAW,CACV,OAAO,EAAE,aAAa,GAAG,MAAM,EAC/B,OAAO,GAAE,aAAa,GAAG,MAAuB;IASjD;;;;;;;;;OASG;IACG,SAAS,CACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAA8B,GACrC,OAAO,CAAC,OAAO,CAAC;IAyBb,eAAe,CACpB,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAA8B,GACrC,OAAO,CAAC,OAAO,CAAC;IAUb,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAU5C,QAAQ,IAAI,MAAM;CAGlB"}
|
package/dist/src/controller.js
CHANGED
|
@@ -39,7 +39,7 @@ import { Documents, SearchRequest, } from "@peerbit/document";
|
|
|
39
39
|
import {} from "@peerbit/log";
|
|
40
40
|
import { Program } from "@peerbit/program";
|
|
41
41
|
import {} from "@peerbit/shared-log";
|
|
42
|
-
import { FromTo, IdentityRelation, createIdentityGraphStore, getFromByTo, getPathGenerator, getToByFrom, hasPath, getRelation as resolveRelation, } from "./identity-graph.js";
|
|
42
|
+
import { FromTo, IdentityRelation, createIdentityGraphStore, getFromByTo, getFromByToLocalOnly, getPathGenerator, getToByFrom, hasPath, getRelation as resolveRelation, } from "./identity-graph.js";
|
|
43
43
|
const openDocumentsLike = async (owner, docs, args) => {
|
|
44
44
|
if (!(docs instanceof Program)) {
|
|
45
45
|
return docs;
|
|
@@ -171,9 +171,11 @@ let TrustedNetwork = (() => {
|
|
|
171
171
|
}
|
|
172
172
|
rootTrust = __runInitializers(this, _rootTrust_initializers, void 0);
|
|
173
173
|
trustGraph = (__runInitializers(this, _rootTrust_extraInitializers), __runInitializers(this, _trustGraph_initializers, void 0));
|
|
174
|
+
// Best-effort remote warmup throttle for `isTrusted()` calls when the local graph is empty.
|
|
175
|
+
// Access control should be conservative (default deny) and non-blocking, so this is fire-and-forget.
|
|
176
|
+
_lastWarmupAt = (__runInitializers(this, _trustGraph_extraInitializers), 0);
|
|
174
177
|
constructor(props) {
|
|
175
178
|
super();
|
|
176
|
-
__runInitializers(this, _trustGraph_extraInitializers);
|
|
177
179
|
this.rootTrust = coercePublicKey(props.rootTrust);
|
|
178
180
|
this.trustGraph = createIdentityGraphStore(props.id);
|
|
179
181
|
}
|
|
@@ -232,22 +234,25 @@ let TrustedNetwork = (() => {
|
|
|
232
234
|
if (trustee.equals(this.rootTrust)) {
|
|
233
235
|
return true;
|
|
234
236
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
: false;
|
|
239
|
-
if (isReplicating) {
|
|
240
|
-
return this._isTrustedLocal(trustee, truster);
|
|
237
|
+
// Fast local-only check first. This avoids stalling writes on cold-start or churn.
|
|
238
|
+
if (await this._isTrustedLocal(trustee, truster)) {
|
|
239
|
+
return true;
|
|
241
240
|
}
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
// Best-effort: kick off a background remote query to encourage replication metadata to converge.
|
|
242
|
+
// Do not await; access control remains default-deny until local state reflects trust.
|
|
243
|
+
const now = Date.now();
|
|
244
|
+
if (now - this._lastWarmupAt > 2_000) {
|
|
245
|
+
this._lastWarmupAt = now;
|
|
246
|
+
void this.trustGraph.index
|
|
247
|
+
.search(new SearchRequest({ query: [] }), {
|
|
244
248
|
remote: { replicate: true },
|
|
245
|
-
})
|
|
246
|
-
|
|
249
|
+
})
|
|
250
|
+
.catch(() => { });
|
|
247
251
|
}
|
|
252
|
+
return false;
|
|
248
253
|
}
|
|
249
254
|
async _isTrustedLocal(trustee, truster = this.rootTrust) {
|
|
250
|
-
const trustPath = await hasPath(trustee, truster, this.trustGraph,
|
|
255
|
+
const trustPath = await hasPath(trustee, truster, this.trustGraph, getFromByToLocalOnly);
|
|
251
256
|
return !!trustPath;
|
|
252
257
|
}
|
|
253
258
|
async getTrusted() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export type RelationResolver = {
|
|
|
6
6
|
};
|
|
7
7
|
export declare const getFromByTo: RelationResolver;
|
|
8
8
|
export declare const getToByFrom: RelationResolver;
|
|
9
|
+
export declare const getFromByToLocalOnly: RelationResolver;
|
|
10
|
+
export declare const getToByFromLocalOnly: RelationResolver;
|
|
9
11
|
export declare function getPathGenerator(from: PublicSignKey, db: DocumentsLike<IdentityRelation, FromTo>, resolver: RelationResolver): AsyncGenerator<IdentityRelation, void, unknown>;
|
|
10
12
|
/**
|
|
11
13
|
* Get path, to target.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-graph.d.ts","sourceRoot":"","sources":["../../src/identity-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACN,SAAS,EACT,KAAK,aAAa,EAGlB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,CACR,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,KACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,aAAa,CAAC;CACpD,CAAC;
|
|
1
|
+
{"version":3,"file":"identity-graph.d.ts","sourceRoot":"","sources":["../../src/identity-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACN,SAAS,EACT,KAAK,aAAa,EAGlB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,CACR,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,KACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,aAAa,CAAC;CACpD,CAAC;AAuBF,eAAO,MAAM,WAAW,EAAE,gBAQzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,gBAQzB,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,gBAQlC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,gBAYlC,CAAC;AAEF,wBAAuB,gBAAgB,CACtC,IAAI,EAAE,aAAa,EACnB,EAAE,EAAE,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAC3C,QAAQ,EAAE,gBAAgB,mDAsB1B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC3B,OAAO,aAAa,EACpB,QAAQ,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,EACvC,IAAI,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAC3C,UAAU,gBAAgB,KACxB,OAAO,CAAC,OAAO,CAiBjB,CAAC;AAEF,8BACsB,gBAAgB;IAErC,EAAE,EAAE,UAAU,CAAC;CACf;AAED,qBACa,gBAAiB,SAAQ,gBAAgB;IAErD,KAAK,EAAE,aAAa,CAAC;IAGrB,GAAG,EAAE,aAAa,CAAC;gBAEP,UAAU,CAAC,EAAE;QACxB,EAAE,EAAE,aAAa,CAAC;QAClB,IAAI,EAAE,aAAa,CAAC;KACpB;IASD,IAAI,IAAI,IAAI,aAAa,CAExB;IAED,IAAI,EAAE,IAAI,aAAa,CAEtB;IAED,YAAY;IAIZ,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa;CAGhD;AAED,eAAO,MAAM,OAAO,GACnB,OAAO,aAAa,EACpB,KAAK,aAAa,EAClB,IAAI,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAC3C,UAAU,gBAAgB,KACxB,OAAO,CAAC,OAAO,CAEjB,CAAC;AAEF,eAAO,MAAM,WAAW,GACvB,MAAM,aAAa,EACnB,IAAI,aAAa,EACjB,IAAI,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,KACzC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAOtC,CAAC;AAEF,qBACa,MAAM;IAElB,EAAE,EAAE,UAAU,CAAC;IAGf,IAAI,EAAE,MAAM,CAAC;IAGb,EAAE,EAAE,MAAM,CAAC;gBAEC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,GAAG;CAKnD;AAED,eAAO,MAAM,wBAAwB,GAAI,KAAK,UAAU,6CAGrD,CAAC"}
|
|
@@ -36,29 +36,43 @@ import { field, fixedArray, serialize, variant } from "@dao-xyz/borsh";
|
|
|
36
36
|
import { PublicSignKey, sha256Sync } from "@peerbit/crypto";
|
|
37
37
|
import { Documents, SearchRequest, StringMatch, } from "@peerbit/document";
|
|
38
38
|
import { concat } from "uint8arrays";
|
|
39
|
+
const LOCAL_ONLY_QUERY = { remote: false, local: true };
|
|
40
|
+
const searchRelations = async (db, query, options) => {
|
|
41
|
+
const request = new SearchRequest({
|
|
42
|
+
query: [
|
|
43
|
+
new StringMatch({
|
|
44
|
+
key: query.key,
|
|
45
|
+
value: query.value,
|
|
46
|
+
}),
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
const results = options
|
|
50
|
+
? await db.index.search(request, options)
|
|
51
|
+
: await db.index.search(request);
|
|
52
|
+
return Promise.all(results);
|
|
53
|
+
};
|
|
39
54
|
export const getFromByTo = {
|
|
40
55
|
resolve: async (to, db) => {
|
|
41
|
-
return
|
|
42
|
-
query: [
|
|
43
|
-
new StringMatch({
|
|
44
|
-
key: "to",
|
|
45
|
-
value: to.hashcode(),
|
|
46
|
-
}),
|
|
47
|
-
],
|
|
48
|
-
})));
|
|
56
|
+
return searchRelations(db, { key: "to", value: to.hashcode() });
|
|
49
57
|
},
|
|
50
58
|
next: (relation) => relation.from,
|
|
51
59
|
};
|
|
52
60
|
export const getToByFrom = {
|
|
53
61
|
resolve: async (from, db) => {
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
})
|
|
62
|
+
return searchRelations(db, { key: "from", value: from.hashcode() });
|
|
63
|
+
},
|
|
64
|
+
next: (relation) => relation.to,
|
|
65
|
+
};
|
|
66
|
+
// Local-only resolvers for access control checks. These must be conservative and non-blocking.
|
|
67
|
+
export const getFromByToLocalOnly = {
|
|
68
|
+
resolve: async (to, db) => {
|
|
69
|
+
return searchRelations(db, { key: "to", value: to.hashcode() }, LOCAL_ONLY_QUERY);
|
|
70
|
+
},
|
|
71
|
+
next: (relation) => relation.from,
|
|
72
|
+
};
|
|
73
|
+
export const getToByFromLocalOnly = {
|
|
74
|
+
resolve: async (from, db) => {
|
|
75
|
+
return searchRelations(db, { key: "from", value: from.hashcode() }, LOCAL_ONLY_QUERY);
|
|
62
76
|
},
|
|
63
77
|
next: (relation) => relation.to,
|
|
64
78
|
};
|
|
@@ -189,7 +203,12 @@ export const hasPath = async (start, end, db, resolver) => {
|
|
|
189
203
|
return hasPathToTarget(start, (key) => end.equals(key), db, resolver);
|
|
190
204
|
};
|
|
191
205
|
export const getRelation = async (from, to, db) => {
|
|
192
|
-
|
|
206
|
+
// This is used as a local existence check before writing relations.
|
|
207
|
+
// Avoid remote queries which can hang under churn or cold-start.
|
|
208
|
+
return db.index.get(new IdentityRelation({ from, to }).id, {
|
|
209
|
+
remote: false,
|
|
210
|
+
local: true,
|
|
211
|
+
});
|
|
193
212
|
};
|
|
194
213
|
let FromTo = (() => {
|
|
195
214
|
let _classDecorators = [variant(0)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-graph.js","sourceRoot":"","sources":["../../src/identity-graph.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EACN,SAAS,EAET,aAAa,EACb,WAAW,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"identity-graph.js","sourceRoot":"","sources":["../../src/identity-graph.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peerbit/trusted-network",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.6-3f16953",
|
|
4
4
|
"description": "Access controller that operates on a DB",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -54,17 +54,17 @@
|
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@dao-xyz/borsh": "^6.0.0",
|
|
56
56
|
"@libp2p/interface": "^3.1.0",
|
|
57
|
-
"
|
|
58
|
-
"@peerbit/
|
|
59
|
-
"@peerbit/
|
|
60
|
-
"@peerbit/
|
|
61
|
-
"@peerbit/
|
|
62
|
-
"
|
|
57
|
+
"@peerbit/crypto": "2.4.1-3f16953",
|
|
58
|
+
"@peerbit/document": "12.3.5-3f16953",
|
|
59
|
+
"@peerbit/log": "5.0.10-3f16953",
|
|
60
|
+
"@peerbit/program": "5.6.3-3f16953",
|
|
61
|
+
"@peerbit/shared-log": "12.3.5-3f16953",
|
|
62
|
+
"uint8arrays": "^5.1.0"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
|
+
"@peerbit/time": "2.3.0-3f16953",
|
|
65
66
|
"@ethersproject/wallet": "^5.8.0",
|
|
66
|
-
"@peerbit/
|
|
67
|
-
"@peerbit/test-utils": "2.3.19"
|
|
67
|
+
"@peerbit/test-utils": "2.3.19-3f16953"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"clean": "aegir clean",
|
package/src/controller.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
IdentityRelation,
|
|
22
22
|
createIdentityGraphStore,
|
|
23
23
|
getFromByTo,
|
|
24
|
+
getFromByToLocalOnly,
|
|
24
25
|
getPathGenerator,
|
|
25
26
|
getToByFrom,
|
|
26
27
|
hasPath,
|
|
@@ -155,6 +156,10 @@ export class TrustedNetwork extends Program<TrustedNetworkArgs> {
|
|
|
155
156
|
@field({ type: Documents })
|
|
156
157
|
trustGraph: DocumentsLike<IdentityRelation, FromTo>;
|
|
157
158
|
|
|
159
|
+
// Best-effort remote warmup throttle for `isTrusted()` calls when the local graph is empty.
|
|
160
|
+
// Access control should be conservative (default deny) and non-blocking, so this is fire-and-forget.
|
|
161
|
+
private _lastWarmupAt = 0;
|
|
162
|
+
|
|
158
163
|
constructor(props: { id?: Uint8Array; rootTrust: PublicSignKey | PeerId }) {
|
|
159
164
|
super();
|
|
160
165
|
this.rootTrust = coercePublicKey(props.rootTrust);
|
|
@@ -244,19 +249,25 @@ export class TrustedNetwork extends Program<TrustedNetworkArgs> {
|
|
|
244
249
|
if (trustee.equals(this.rootTrust)) {
|
|
245
250
|
return true;
|
|
246
251
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
252
|
+
|
|
253
|
+
// Fast local-only check first. This avoids stalling writes on cold-start or churn.
|
|
254
|
+
if (await this._isTrustedLocal(trustee, truster)) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Best-effort: kick off a background remote query to encourage replication metadata to converge.
|
|
259
|
+
// Do not await; access control remains default-deny until local state reflects trust.
|
|
260
|
+
const now = Date.now();
|
|
261
|
+
if (now - this._lastWarmupAt > 2_000) {
|
|
262
|
+
this._lastWarmupAt = now;
|
|
263
|
+
void this.trustGraph.index
|
|
264
|
+
.search(new SearchRequest({ query: [] }), {
|
|
265
|
+
remote: { replicate: true },
|
|
266
|
+
})
|
|
267
|
+
.catch(() => {});
|
|
259
268
|
}
|
|
269
|
+
|
|
270
|
+
return false;
|
|
260
271
|
}
|
|
261
272
|
|
|
262
273
|
async _isTrustedLocal(
|
|
@@ -267,7 +278,7 @@ export class TrustedNetwork extends Program<TrustedNetworkArgs> {
|
|
|
267
278
|
trustee,
|
|
268
279
|
truster,
|
|
269
280
|
this.trustGraph,
|
|
270
|
-
|
|
281
|
+
getFromByToLocalOnly,
|
|
271
282
|
);
|
|
272
283
|
return !!trustPath;
|
|
273
284
|
}
|
package/src/identity-graph.ts
CHANGED
|
@@ -16,23 +16,33 @@ export type RelationResolver = {
|
|
|
16
16
|
next: (relation: IdentityRelation) => PublicSignKey;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
+
const LOCAL_ONLY_QUERY = { remote: false, local: true } as any;
|
|
20
|
+
|
|
21
|
+
const searchRelations = async (
|
|
22
|
+
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
23
|
+
query: { key: "from" | "to"; value: string },
|
|
24
|
+
options?: any,
|
|
25
|
+
): Promise<IdentityRelation[]> => {
|
|
26
|
+
const request = new SearchRequest({
|
|
27
|
+
query: [
|
|
28
|
+
new StringMatch({
|
|
29
|
+
key: query.key,
|
|
30
|
+
value: query.value,
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
const results = options
|
|
35
|
+
? await db.index.search(request, options)
|
|
36
|
+
: await db.index.search(request);
|
|
37
|
+
return Promise.all(results);
|
|
38
|
+
};
|
|
39
|
+
|
|
19
40
|
export const getFromByTo: RelationResolver = {
|
|
20
41
|
resolve: async (
|
|
21
42
|
to: PublicSignKey,
|
|
22
43
|
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
23
44
|
) => {
|
|
24
|
-
return
|
|
25
|
-
await db.index.search(
|
|
26
|
-
new SearchRequest({
|
|
27
|
-
query: [
|
|
28
|
-
new StringMatch({
|
|
29
|
-
key: "to",
|
|
30
|
-
value: to.hashcode(),
|
|
31
|
-
}),
|
|
32
|
-
],
|
|
33
|
-
}),
|
|
34
|
-
),
|
|
35
|
-
);
|
|
45
|
+
return searchRelations(db, { key: "to", value: to.hashcode() });
|
|
36
46
|
},
|
|
37
47
|
next: (relation) => relation.from,
|
|
38
48
|
};
|
|
@@ -42,17 +52,31 @@ export const getToByFrom: RelationResolver = {
|
|
|
42
52
|
from: PublicSignKey,
|
|
43
53
|
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
44
54
|
) => {
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
return searchRelations(db, { key: "from", value: from.hashcode() });
|
|
56
|
+
},
|
|
57
|
+
next: (relation) => relation.to,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// Local-only resolvers for access control checks. These must be conservative and non-blocking.
|
|
61
|
+
export const getFromByToLocalOnly: RelationResolver = {
|
|
62
|
+
resolve: async (
|
|
63
|
+
to: PublicSignKey,
|
|
64
|
+
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
65
|
+
) => {
|
|
66
|
+
return searchRelations(db, { key: "to", value: to.hashcode() }, LOCAL_ONLY_QUERY);
|
|
67
|
+
},
|
|
68
|
+
next: (relation) => relation.from,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const getToByFromLocalOnly: RelationResolver = {
|
|
72
|
+
resolve: async (
|
|
73
|
+
from: PublicSignKey,
|
|
74
|
+
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
75
|
+
) => {
|
|
76
|
+
return searchRelations(
|
|
77
|
+
db,
|
|
78
|
+
{ key: "from", value: from.hashcode() },
|
|
79
|
+
LOCAL_ONLY_QUERY,
|
|
56
80
|
);
|
|
57
81
|
},
|
|
58
82
|
next: (relation) => relation.to,
|
|
@@ -173,7 +197,12 @@ export const getRelation = async (
|
|
|
173
197
|
to: PublicSignKey,
|
|
174
198
|
db: DocumentsLike<IdentityRelation, FromTo>,
|
|
175
199
|
): Promise<IdentityRelation | undefined> => {
|
|
176
|
-
|
|
200
|
+
// This is used as a local existence check before writing relations.
|
|
201
|
+
// Avoid remote queries which can hang under churn or cold-start.
|
|
202
|
+
return db.index.get(new IdentityRelation({ from, to }).id, {
|
|
203
|
+
remote: false,
|
|
204
|
+
local: true,
|
|
205
|
+
} as any);
|
|
177
206
|
};
|
|
178
207
|
|
|
179
208
|
@variant(0)
|