@agentunion/fastaun 0.5.30 → 0.5.32
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/CHANGELOG.md +60 -0
- package/_packed_docs/CHANGELOG.md +60 -0
- package/_packed_docs/sdk/0.5.31-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +162 -0
- package/_packed_docs/sdk/0.5.31-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +167 -0
- package/_packed_docs/sdk/0.5.32-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +350 -0
- package/_packed_docs/sdk/0.5.32-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +319 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +12 -5
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +459 -0
- package/_packed_docs/sdk/AUN/344/272/213/344/273/266/345/217/221/345/270/203/350/256/242/351/230/205/345/274/200/345/217/221/347/247/273/346/244/215/346/214/207/345/215/227.md +554 -0
- package/_packed_docs/sdk/INDEX.md +27 -5
- package/_packed_docs/sdk//345/255/220AID/344/277/256/346/224/271agent.md/351/200/232/347/237/245Owner/345/234/272/346/231/257/346/214/207/345/215/227.md +234 -0
- package/dist/agent-md-schema.js +7 -6
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +2 -0
- package/dist/agent-md.js +20 -6
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +1 -0
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.js +1 -1
- package/dist/aid.js.map +1 -1
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/client/control-messages.d.ts +22 -7
- package/dist/client/control-messages.js +220 -185
- package/dist/client/control-messages.js.map +1 -1
- package/dist/client/delivery.d.ts +3 -0
- package/dist/client/delivery.js +67 -3
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts +3 -0
- package/dist/client/group-state.js +48 -14
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.js +12 -3
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +9 -3
- package/dist/client/rpc-pipeline.js +61 -26
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +13 -1
- package/dist/client/v2-e2ee.js +32 -19
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +18 -1
- package/dist/client.js +396 -140
- package/dist/client.js.map +1 -1
- package/dist/discovery.d.ts +1 -0
- package/dist/discovery.js +3 -1
- package/dist/discovery.js.map +1 -1
- package/dist/group-fs.js +1 -1
- package/dist/group-fs.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ownership-v21.d.ts +2 -2
- package/dist/ownership-v21.js +18 -21
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.js +6 -4
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/pubsub/binding.d.ts +54 -0
- package/dist/pubsub/binding.js +343 -0
- package/dist/pubsub/binding.js.map +1 -0
- package/dist/pubsub/channel.d.ts +45 -0
- package/dist/pubsub/channel.js +137 -0
- package/dist/pubsub/channel.js.map +1 -0
- package/dist/pubsub/client.d.ts +93 -0
- package/dist/pubsub/client.js +318 -0
- package/dist/pubsub/client.js.map +1 -0
- package/dist/pubsub/credentials.d.ts +51 -0
- package/dist/pubsub/credentials.js +360 -0
- package/dist/pubsub/credentials.js.map +1 -0
- package/dist/pubsub/errors.d.ts +5 -0
- package/dist/pubsub/errors.js +6 -0
- package/dist/pubsub/errors.js.map +1 -0
- package/dist/pubsub/index.d.ts +48 -0
- package/dist/pubsub/index.js +152 -0
- package/dist/pubsub/index.js.map +1 -0
- package/dist/pubsub/scheduler.d.ts +58 -0
- package/dist/pubsub/scheduler.js +249 -0
- package/dist/pubsub/scheduler.js.map +1 -0
- package/dist/pubsub/service.d.ts +100 -0
- package/dist/pubsub/service.js +650 -0
- package/dist/pubsub/service.js.map +1 -0
- package/dist/pubsub/types.d.ts +119 -0
- package/dist/pubsub/types.js +2 -0
- package/dist/pubsub/types.js.map +1 -0
- package/dist/register-flow.js +1 -1
- package/dist/register-flow.js.map +1 -1
- package/dist/storage/lowlevel.js +49 -8
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/read-cache.d.ts +7 -3
- package/dist/storage/read-cache.js +137 -18
- package/dist/storage/read-cache.js.map +1 -1
- package/dist/storage/vfs.d.ts +1 -0
- package/dist/storage/vfs.js +12 -4
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +1 -1
- package/dist/tools/cross-sdk-agent.js +4 -2
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/tools/pubsub-actor.d.ts +27 -0
- package/dist/tools/pubsub-actor.js +260 -0
- package/dist/tools/pubsub-actor.js.map +1 -0
- package/dist/transport.d.ts +26 -2
- package/dist/transport.js +182 -17
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { buildRequestBinding, createCredential, digest, validateCredentialCapability, verifyCredentialChain, verifyCredentialSignature, verifyRegistrationReceipt } from '../org-protocol.js';
|
|
2
|
+
import { identifier } from './channel.js';
|
|
3
|
+
import { PubSubError } from './errors.js';
|
|
4
|
+
export class SDKCredentials {
|
|
5
|
+
sdk;
|
|
6
|
+
serviceAid;
|
|
7
|
+
options;
|
|
8
|
+
revoked = new Set();
|
|
9
|
+
verified = new Map();
|
|
10
|
+
generation = 0;
|
|
11
|
+
bodyBudget;
|
|
12
|
+
verifiedBytes = 0;
|
|
13
|
+
nextVerifiedExpiry = Infinity;
|
|
14
|
+
verifiedLimits = { items: 4096, bytes: 8 * 1024 * 1024 };
|
|
15
|
+
records;
|
|
16
|
+
loaded;
|
|
17
|
+
tail = Promise.resolve();
|
|
18
|
+
constructor(sdk, serviceAid = String(sdk.aid ?? ''), options = {}) {
|
|
19
|
+
this.sdk = sdk;
|
|
20
|
+
this.serviceAid = serviceAid;
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.records = { version: 1, service_aid: serviceAid, issues: {}, revokes: {} };
|
|
23
|
+
}
|
|
24
|
+
async issue(subjectAid, scope, expiresAt, requestId) {
|
|
25
|
+
return this.serial(async () => {
|
|
26
|
+
await this.load();
|
|
27
|
+
try {
|
|
28
|
+
const input = { subject: subjectAid, scope, expires_at: expiresAt };
|
|
29
|
+
let record = this.records.issues[requestId];
|
|
30
|
+
if (record && digest(record.input) !== digest(input))
|
|
31
|
+
throw new PubSubError('REQUEST_CONFLICT');
|
|
32
|
+
if (!record) {
|
|
33
|
+
const signer = this.options.signer ? await this.options.signer(this.serviceAid) : await this.sdk._credentialRenewalSigner?.(this.serviceAid) ?? await this.sdk._credentialSigningIdentity?.(this.serviceAid) ?? (this.sdk.currentAid?.aid === this.serviceAid ? this.sdk.currentAid : null);
|
|
34
|
+
if (!signer)
|
|
35
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
36
|
+
const grant = await createCredential({ sub: subjectAid, aud: [this.serviceAid], delegate: false, exp: Math.floor(expiresAt / 1000), key_version: signer.certFingerprint, cap: scope.map(item => ({ ns: 'event', action: item.action, resource: item.event_name, constraints: [] })) }, signer);
|
|
37
|
+
record = { input: structuredClone(input), grant, request: this.request('credential.register', String(grant.cid), requestId, { credential: grant, registrar_aid: this.serviceAid }) };
|
|
38
|
+
this.records.issues[requestId] = record;
|
|
39
|
+
}
|
|
40
|
+
await this.save();
|
|
41
|
+
if (record.result)
|
|
42
|
+
return structuredClone(record.result);
|
|
43
|
+
let result;
|
|
44
|
+
if (Date.now() / 1000 >= Number(record.request.request_binding.exp)) {
|
|
45
|
+
const proof = await this.recoverRegistration(record);
|
|
46
|
+
result = { grant: record.grant, cid: record.grant.cid, receipt: null, registration_confirmation: proof };
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const response = await this.register(record);
|
|
50
|
+
const receipt = response?.registrationReceipt ?? response?.receipt;
|
|
51
|
+
if (!receipt || !receipt.signature)
|
|
52
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
53
|
+
const certificate = await this.certificate(this.authority, String(receipt.signature.cert_fingerprint));
|
|
54
|
+
await verifyRegistrationReceipt(receipt, record.grant, record.request, () => certificate, this.authority, Math.floor(Date.now() / 1000));
|
|
55
|
+
result = { grant: record.grant, cid: record.grant.cid, receipt };
|
|
56
|
+
}
|
|
57
|
+
record.result = structuredClone(result);
|
|
58
|
+
await this.save();
|
|
59
|
+
return structuredClone(result);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof PubSubError)
|
|
63
|
+
throw error;
|
|
64
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE', String(error));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async verify(grant, subjectAid, scope, request, deadline = request?.expires_at) {
|
|
69
|
+
const generation = this.generation;
|
|
70
|
+
await this.beforeDeadline(deadline, () => this.load());
|
|
71
|
+
if (!scope.length || this.isRevoked(grant))
|
|
72
|
+
throw new PubSubError('FORBIDDEN');
|
|
73
|
+
await this.assertNotRevoked(grant, deadline);
|
|
74
|
+
this.cleanupVerified();
|
|
75
|
+
const facade = this.sdk.credential;
|
|
76
|
+
if (typeof facade?.verify !== 'function')
|
|
77
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
78
|
+
const identity = digest([subjectAid, grant]);
|
|
79
|
+
const previous = this.verified.get(identity)?.params;
|
|
80
|
+
if (!request && scope.some(item => !previous?.has(`${item.event_name}\0${item.action}`)))
|
|
81
|
+
throw new PubSubError('FORBIDDEN');
|
|
82
|
+
const documents = [grant, ...(Array.isArray(grant.proof_chain) ? grant.proof_chain : [])];
|
|
83
|
+
if (grant.sub !== subjectAid || documents.at(-1)?.iss !== this.serviceAid || documents.some(document => Number(document.exp) * 1000 <= Date.now()))
|
|
84
|
+
throw new PubSubError('FORBIDDEN');
|
|
85
|
+
const extra = this.options.verificationContext ? await this.beforeDeadline(deadline, () => this.options.verificationContext(subjectAid, request, grant)) : await this.context(grant, deadline);
|
|
86
|
+
if (typeof extra.resolveCertificate !== 'function' || typeof extra.resolveStatusProof !== 'function')
|
|
87
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
88
|
+
let proofUntil = Infinity;
|
|
89
|
+
for (const document of documents) {
|
|
90
|
+
const proof = extra.resolveStatusProof(String(document.cid));
|
|
91
|
+
if (!proof || typeof proof.proofExpiresAt !== 'number' || proof.proofExpiresAt * 1000 <= Date.now())
|
|
92
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
93
|
+
proofUntil = Math.min(proofUntil, proof.proofExpiresAt * 1000);
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
for (const item of scope) {
|
|
97
|
+
const params = request ?? previous.get(`${item.event_name}\0${item.action}`);
|
|
98
|
+
const context = { ...extra, resolveCertificate: extra.resolveCertificate, audience: this.serviceAid, subject: subjectAid, rootIssuer: this.serviceAid, ns: 'event', action: item.action, resource: item.event_name, params };
|
|
99
|
+
if (request)
|
|
100
|
+
await this.beforeDeadline(deadline, () => facade.verify(grant, { ...context, method: `pubsub.${request.op}`, target: this.serviceAid, requestId: request.request_id, nonce: request.nonce, requestBinding: request.request_binding }));
|
|
101
|
+
else {
|
|
102
|
+
await this.beforeDeadline(deadline, async () => this.sdk._assertCredentialNotRevoked?.(grant));
|
|
103
|
+
await verifyCredentialChain(grant, context.resolveCertificate, cid => extra.resolveStatusProof(cid)?.status, Math.floor(Date.now() / 1000), this.serviceAid);
|
|
104
|
+
await validateCredentialCapability(grant, { ns: 'event', action: item.action, resource: item.event_name, params, now: Math.floor(Date.now() / 1000) });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof PubSubError && error.code === 'TIMEOUT')
|
|
110
|
+
throw error;
|
|
111
|
+
throw new PubSubError('FORBIDDEN', String(error));
|
|
112
|
+
}
|
|
113
|
+
this.checkDeadline(deadline);
|
|
114
|
+
if (generation !== this.generation)
|
|
115
|
+
throw new PubSubError('SERVICE_CLOSED');
|
|
116
|
+
if (request) {
|
|
117
|
+
const saved = new Map(previous);
|
|
118
|
+
for (const item of scope)
|
|
119
|
+
saved.set(`${item.event_name}\0${item.action}`, this.verificationParams(grant, item, request));
|
|
120
|
+
const size = new TextEncoder().encode(JSON.stringify([identity, [...saved]])).byteLength + 128, old = this.verified.get(identity);
|
|
121
|
+
if ((this.bodyBudget && !this.bodyBudget(size - (old?.size ?? 0))) || (!old && this.verified.size >= this.verifiedLimits.items) || this.verifiedBytes + size - (old?.size ?? 0) > this.verifiedLimits.bytes)
|
|
122
|
+
throw new PubSubError('OVERLOADED');
|
|
123
|
+
const expiresAt = Math.min(...documents.map(document => Number(document.exp) * 1000));
|
|
124
|
+
this.verified.set(identity, { params: saved, size, expiresAt });
|
|
125
|
+
this.verifiedBytes += size - (old?.size ?? 0);
|
|
126
|
+
this.nextVerifiedExpiry = Math.min(this.nextVerifiedExpiry, expiresAt);
|
|
127
|
+
}
|
|
128
|
+
await this.assertNotRevoked(grant, deadline);
|
|
129
|
+
if (this.isRevoked(grant))
|
|
130
|
+
throw new PubSubError('FORBIDDEN');
|
|
131
|
+
return { cid: grant.cid, expires_at: Math.min(...documents.map(document => Number(document.exp) * 1000)), proof_expires_at: proofUntil };
|
|
132
|
+
}
|
|
133
|
+
verificationParams(grant, item, request) {
|
|
134
|
+
const result = {};
|
|
135
|
+
for (const capability of (grant.cap ?? [])) {
|
|
136
|
+
if (capability.ns !== 'event' || ![item.action, '*'].includes(String(capability.action)) || ![item.event_name, '*'].includes(String(capability.resource)))
|
|
137
|
+
continue;
|
|
138
|
+
for (const constraint of (capability.constraints ?? [])) {
|
|
139
|
+
const field = String(constraint.field ?? '');
|
|
140
|
+
if (['ns', 'action', 'resource', 'sub', 'delegation_depth', 'operation', 'valid_time', 'now'].includes(field))
|
|
141
|
+
continue;
|
|
142
|
+
const parts = (field.startsWith('params.') ? field.slice(7) : field).split('.');
|
|
143
|
+
let value = request, found = true;
|
|
144
|
+
for (const key of parts) {
|
|
145
|
+
if (!value || typeof value !== 'object' || !Object.hasOwn(value, key)) {
|
|
146
|
+
found = false;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
value = value[key];
|
|
150
|
+
}
|
|
151
|
+
if (!found)
|
|
152
|
+
continue;
|
|
153
|
+
let target = result;
|
|
154
|
+
for (const key of parts.slice(0, -1)) {
|
|
155
|
+
if (!Object.hasOwn(target, key))
|
|
156
|
+
Object.defineProperty(target, key, { value: {}, enumerable: true, writable: true, configurable: true });
|
|
157
|
+
target = target[key];
|
|
158
|
+
}
|
|
159
|
+
Object.defineProperty(target, parts.at(-1), { value: structuredClone(value), enumerable: true, writable: true, configurable: true });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
cleanupVerified() { const now = Date.now(); if (now < this.nextVerifiedExpiry)
|
|
165
|
+
return; this.nextVerifiedExpiry = Infinity; for (const [key, entry] of this.verified) {
|
|
166
|
+
if (entry.expiresAt <= now) {
|
|
167
|
+
this.verified.delete(key);
|
|
168
|
+
this.verifiedBytes -= entry.size;
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
this.nextVerifiedExpiry = Math.min(this.nextVerifiedExpiry, entry.expiresAt);
|
|
172
|
+
} }
|
|
173
|
+
async checkVerified(grant, subjectAid, scope) {
|
|
174
|
+
this.cleanupVerified();
|
|
175
|
+
const previous = this.verified.get(digest([subjectAid, grant]))?.params;
|
|
176
|
+
try {
|
|
177
|
+
for (const item of scope) {
|
|
178
|
+
const params = previous?.get(`${item.event_name}\0${item.action}`);
|
|
179
|
+
if (!params)
|
|
180
|
+
throw new PubSubError('FORBIDDEN');
|
|
181
|
+
await validateCredentialCapability(grant, { ns: 'event', action: item.action, resource: item.event_name, params, now: Math.floor(Date.now() / 1000) });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
throw new PubSubError('FORBIDDEN');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
retainedBodyBytes() { return this.verifiedBytes; }
|
|
189
|
+
setBodyBudget(available) { this.bodyBudget = available; }
|
|
190
|
+
clearVerified() { this.generation++; this.verified.clear(); this.verifiedBytes = 0; this.nextVerifiedExpiry = Infinity; }
|
|
191
|
+
async assertNotRevoked(grant, deadline) { if (this.isRevoked(grant))
|
|
192
|
+
throw new PubSubError('REAUTH_REQUIRED'); if (typeof grant === 'string')
|
|
193
|
+
return; try {
|
|
194
|
+
await this.beforeDeadline(deadline, async () => { await this.sdk._assertCredentialNotRevoked?.(grant); });
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (error instanceof PubSubError && error.code === 'TIMEOUT')
|
|
198
|
+
throw error;
|
|
199
|
+
throw new PubSubError('REAUTH_REQUIRED');
|
|
200
|
+
} }
|
|
201
|
+
async context(grant, deadline) {
|
|
202
|
+
const manager = this.sdk._getCredentialRenewal?.();
|
|
203
|
+
if (typeof manager?.statusFresh !== 'function')
|
|
204
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
205
|
+
const certificates = new Map();
|
|
206
|
+
const proofs = new Map();
|
|
207
|
+
for (const document of [grant, ...(Array.isArray(grant.proof_chain) ? grant.proof_chain : [])]) {
|
|
208
|
+
const proof = {};
|
|
209
|
+
await this.statusFresh(document, undefined, proof, deadline);
|
|
210
|
+
proofs.set(String(document.cid), proof);
|
|
211
|
+
const signature = document.signature;
|
|
212
|
+
const fingerprint = String(signature.cert_fingerprint);
|
|
213
|
+
certificates.set(fingerprint, await this.certificate(String(document.iss), fingerprint, deadline));
|
|
214
|
+
}
|
|
215
|
+
return { resolveCertificate: fingerprint => certificates.get(fingerprint) ?? null, resolveStatusProof: cid => proofs.get(cid) ?? null };
|
|
216
|
+
}
|
|
217
|
+
async revoke(cid, requestId) {
|
|
218
|
+
return this.serial(async () => {
|
|
219
|
+
await this.load();
|
|
220
|
+
try {
|
|
221
|
+
let record = this.records.revokes[requestId];
|
|
222
|
+
if (record && record.cid !== cid)
|
|
223
|
+
throw new PubSubError('REQUEST_CONFLICT');
|
|
224
|
+
this.revoked.add(cid);
|
|
225
|
+
if (!record) {
|
|
226
|
+
record = { cid, request: this.request('credential.revoke', cid, requestId, { credential_cid: cid, registrar_aid: this.serviceAid, reason_code: 'grant_withdrawn', cascade: true }) };
|
|
227
|
+
this.records.revokes[requestId] = record;
|
|
228
|
+
}
|
|
229
|
+
await this.save();
|
|
230
|
+
if (record.result)
|
|
231
|
+
return structuredClone(record.result);
|
|
232
|
+
const revoke = this.sdk.credential?.revoke;
|
|
233
|
+
if (typeof revoke !== 'function')
|
|
234
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
235
|
+
const result = await revoke.call(this.sdk.credential, structuredClone(record.request));
|
|
236
|
+
if (!result || result.credentialCid !== cid || result.status !== 'revoked')
|
|
237
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
238
|
+
record.result = structuredClone(result);
|
|
239
|
+
await this.save();
|
|
240
|
+
this.sdk._getCredentialRenewal?.().invalidateQueries?.();
|
|
241
|
+
return structuredClone(result);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
if (error instanceof PubSubError)
|
|
245
|
+
throw error;
|
|
246
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE', String(error));
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
get authority() { return 'credential.' + this.serviceAid.split('.').slice(1).join('.'); }
|
|
251
|
+
serial(operation) { const result = this.tail.then(operation); this.tail = result.catch(() => { }); return result; }
|
|
252
|
+
load() {
|
|
253
|
+
return this.loaded ??= (async () => {
|
|
254
|
+
const store = this.sdk._tokenStore;
|
|
255
|
+
let saved;
|
|
256
|
+
if (this.options.state?.load)
|
|
257
|
+
saved = await this.options.state.load();
|
|
258
|
+
else if (typeof store?._getMetadataStrict === 'function' || typeof store?.getMetadata === 'function') {
|
|
259
|
+
const value = await (store._getMetadataStrict?.(this.serviceAid, 'pubsub_credentials_v1') ?? store.getMetadata?.(this.serviceAid, 'pubsub_credentials_v1'));
|
|
260
|
+
saved = typeof value === 'string' && value !== '' ? JSON.parse(value) : value;
|
|
261
|
+
}
|
|
262
|
+
else
|
|
263
|
+
saved = (store?._loadMetadataStrict?.(this.serviceAid) ?? store?.loadMetadata?.(this.serviceAid))?.pubsub_credentials_v1;
|
|
264
|
+
if (saved) {
|
|
265
|
+
if (saved.version !== 1 || saved.service_aid !== this.serviceAid || !saved.issues || !saved.revokes)
|
|
266
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
267
|
+
this.records = structuredClone(saved);
|
|
268
|
+
}
|
|
269
|
+
for (const record of Object.values(this.records.revokes))
|
|
270
|
+
this.revoked.add(record.cid);
|
|
271
|
+
})().catch(error => { throw error instanceof PubSubError ? error : new PubSubError('CREDENTIAL_UNAVAILABLE', String(error)); });
|
|
272
|
+
}
|
|
273
|
+
async save() {
|
|
274
|
+
const value = structuredClone(this.records);
|
|
275
|
+
const store = this.sdk._tokenStore;
|
|
276
|
+
if (this.options.state?.save)
|
|
277
|
+
await this.options.state.save(value);
|
|
278
|
+
else if (typeof store?.setMetadata === 'function')
|
|
279
|
+
await store.setMetadata(this.serviceAid, 'pubsub_credentials_v1', JSON.stringify(value));
|
|
280
|
+
else
|
|
281
|
+
await store?.saveMetadata?.(this.serviceAid, { pubsub_credentials_v1: value });
|
|
282
|
+
}
|
|
283
|
+
async certificate(aid, fingerprint, deadline) {
|
|
284
|
+
const resolve = this.sdk._fetchServiceEventCertificate ?? this.sdk._resolveServiceEventCertificate;
|
|
285
|
+
if (typeof resolve !== 'function')
|
|
286
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
287
|
+
return this.beforeDeadline(deadline, () => resolve.call(this.sdk, aid, fingerprint));
|
|
288
|
+
}
|
|
289
|
+
async register(record) {
|
|
290
|
+
const pipeline = this.sdk._rpcPipeline;
|
|
291
|
+
if (typeof pipeline?._callWithSent === 'function')
|
|
292
|
+
return pipeline._callWithSent('credential.register', structuredClone(record.request), async () => {
|
|
293
|
+
const now = Math.floor(Date.now() / 1000), binding = record.request.request_binding;
|
|
294
|
+
if (now < Number(binding.iat) || now >= Number(binding.exp))
|
|
295
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
296
|
+
if (record.submitted_at === undefined) {
|
|
297
|
+
record.submitted_at = now;
|
|
298
|
+
record.submission_hash = digest(record.request);
|
|
299
|
+
await this.save();
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
if (typeof this.sdk.credential?.register !== 'function')
|
|
303
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
304
|
+
return this.sdk.credential.register(structuredClone(record.request));
|
|
305
|
+
}
|
|
306
|
+
async recoverRegistration(record) {
|
|
307
|
+
const binding = record.request.request_binding;
|
|
308
|
+
if (!Number.isInteger(record.submitted_at) || record.submitted_at < Number(binding.iat) || record.submitted_at >= Number(binding.exp) || record.submission_hash !== digest(record.request))
|
|
309
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
310
|
+
const signature = record.grant.signature;
|
|
311
|
+
const certificate = await this.certificate(String(record.grant.iss), String(signature.cert_fingerprint));
|
|
312
|
+
await verifyCredentialSignature(record.grant, () => certificate, Math.floor(Date.now() / 1000), this.serviceAid);
|
|
313
|
+
const proof = {};
|
|
314
|
+
await this.statusFresh(record.grant, record.submitted_at, proof);
|
|
315
|
+
if (proof.credentialStatus !== 'active' || Number(proof.proofExpiresAt) * 1000 <= Date.now() || Number(record.grant.exp) * 1000 <= Date.now())
|
|
316
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
317
|
+
return proof;
|
|
318
|
+
}
|
|
319
|
+
async statusFresh(grant, submittedAt, proof, deadline) {
|
|
320
|
+
this.checkDeadline(deadline);
|
|
321
|
+
const manager = this.sdk._getCredentialRenewal?.();
|
|
322
|
+
if (typeof manager?.statusFresh !== 'function')
|
|
323
|
+
throw new PubSubError('CREDENTIAL_UNAVAILABLE');
|
|
324
|
+
const scoped = Object.create(manager);
|
|
325
|
+
if (manager.ports?.call)
|
|
326
|
+
scoped.ports = { ...manager.ports,
|
|
327
|
+
call: async (method, params, onSent) => { this.checkDeadline(deadline); const result = await manager.ports.call(method, { ...params, _rpc_background_kind: 'event', _rpc_background: 'event', ...(deadline !== undefined ? { _rpc_deadline: deadline } : {}) }, onSent); this.checkDeadline(deadline); return result; },
|
|
328
|
+
certificate: (aid, fingerprint) => this.beforeDeadline(deadline, () => manager.ports.certificate(aid, fingerprint)) };
|
|
329
|
+
await manager.statusFresh.call(scoped, grant, this.serviceAid, false, submittedAt, proof);
|
|
330
|
+
this.checkDeadline(deadline);
|
|
331
|
+
}
|
|
332
|
+
checkDeadline(deadline) { if (deadline !== undefined && deadline <= Date.now())
|
|
333
|
+
throw new PubSubError('TIMEOUT'); }
|
|
334
|
+
async beforeDeadline(deadline, operation) {
|
|
335
|
+
this.checkDeadline(deadline);
|
|
336
|
+
if (deadline === undefined)
|
|
337
|
+
return operation();
|
|
338
|
+
let timer;
|
|
339
|
+
try {
|
|
340
|
+
const result = await Promise.race([operation(), new Promise((_, reject) => { timer = setTimeout(() => reject(new PubSubError('TIMEOUT')), Math.max(0, deadline - Date.now())); })]);
|
|
341
|
+
this.checkDeadline(deadline);
|
|
342
|
+
return result;
|
|
343
|
+
}
|
|
344
|
+
finally {
|
|
345
|
+
if (timer)
|
|
346
|
+
clearTimeout(timer);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
isRevoked(grant) { if (typeof grant === 'string')
|
|
350
|
+
return this.revoked.has(grant); return [grant, ...(Array.isArray(grant.proof_chain) ? grant.proof_chain : [])].some(document => this.revoked.has(String(document.cid ?? ''))); }
|
|
351
|
+
async getIssuedScope(cid) { await this.load(); const record = Object.values(this.records.issues).find(item => item.grant.cid === cid); return record ? structuredClone(record.input.scope) : null; }
|
|
352
|
+
request(method, cid, requestId, fields) {
|
|
353
|
+
const params = { ...fields, request_id: requestId, nonce: identifier() };
|
|
354
|
+
const now = Math.floor(Date.now() / 1000);
|
|
355
|
+
params.request_binding = buildRequestBinding(method, 'credential.' + this.serviceAid.split('.').slice(1).join('.'), params, cid, String(params.nonce), requestId, now, now + 300);
|
|
356
|
+
return params;
|
|
357
|
+
}
|
|
358
|
+
async refreshRevocations() { await this.load(); this.sdk._getCredentialRenewal?.().invalidateQueries?.(); }
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/pubsub/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pubsub/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAAY,IAAI,CAAS;IAAU,OAAO,CAAW;IAAC,YAAY,IAAY,EAAE,OAAgB,EAAE,OAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CAAE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EventService as EventBusCore } from './service.js';
|
|
2
|
+
import { type EventServiceBindingOptions } from './binding.js';
|
|
3
|
+
import { PubSubClient, type PublishOptions } from './client.js';
|
|
4
|
+
import { type SDKCredentialsOptions } from './credentials.js';
|
|
5
|
+
import { type PubSubSDK } from './channel.js';
|
|
6
|
+
import type { CredentialProvider, EventAllowlist, EventCatalog, EventServiceLimits, EventServiceOptions, JsonMap } from './types.js';
|
|
7
|
+
export { PubSubError } from './errors.js';
|
|
8
|
+
export type * from './types.js';
|
|
9
|
+
export type { PublishOptions } from './client.js';
|
|
10
|
+
export type EventRole = 'pub' | 'sub' | 'bus';
|
|
11
|
+
export interface EventServiceStartOptions {
|
|
12
|
+
catalog?: EventCatalog;
|
|
13
|
+
allowlist?: EventAllowlist;
|
|
14
|
+
credentials?: CredentialProvider;
|
|
15
|
+
credentialOptions?: SDKCredentialsOptions;
|
|
16
|
+
state?: EventServiceOptions['state'];
|
|
17
|
+
clock?: () => number;
|
|
18
|
+
limits?: EventServiceLimits;
|
|
19
|
+
bindingOptions?: EventServiceBindingOptions;
|
|
20
|
+
}
|
|
21
|
+
export declare class EventService {
|
|
22
|
+
readonly sdk: PubSubSDK;
|
|
23
|
+
private readonly buses;
|
|
24
|
+
constructor(sdk: PubSubSDK);
|
|
25
|
+
private bindBus;
|
|
26
|
+
private bound;
|
|
27
|
+
private client;
|
|
28
|
+
private serialize;
|
|
29
|
+
start(bus_aid: string, options?: EventServiceStartOptions): Promise<this>;
|
|
30
|
+
drain(bus_aid: string): Promise<void>;
|
|
31
|
+
close(bus_aid: string): Promise<void>;
|
|
32
|
+
private _closeAll;
|
|
33
|
+
updateConfig(bus_aid: string, config: Parameters<EventBusCore['updateConfig']>[0]): Promise<void>;
|
|
34
|
+
authorize(bus_aid: string, role: 'pub' | 'sub', authMode: 'allowlist' | 'credential', events: string[], credential?: JsonMap): Promise<JsonMap>;
|
|
35
|
+
renew(bus_aid: string): Promise<JsonMap>;
|
|
36
|
+
publish(bus_aid: string, eventName: string, data: JsonMap, options?: PublishOptions): Promise<string>;
|
|
37
|
+
waitPublished(bus_aid: string, eventId: string): Promise<JsonMap>;
|
|
38
|
+
onPublish(bus_aid: string, handler: Parameters<PubSubClient['onPublish']>[0]): () => boolean;
|
|
39
|
+
subscribe(bus_aid: string, events: string[]): Promise<JsonMap>;
|
|
40
|
+
unsubscribe(bus_aid: string, events: string[]): Promise<JsonMap>;
|
|
41
|
+
nextEvent(bus_aid: string, timeout?: number): Promise<JsonMap>;
|
|
42
|
+
onEvent(bus_aid: string, handler: Parameters<PubSubClient['onEvent']>[0]): () => boolean;
|
|
43
|
+
catalog(bus_aid: string, params?: JsonMap): Promise<JsonMap>;
|
|
44
|
+
stats(bus_aid: string, params?: JsonMap): Promise<JsonMap>;
|
|
45
|
+
issueGrant(bus_aid: string, params: JsonMap): Promise<JsonMap>;
|
|
46
|
+
revokeGrant(bus_aid: string, params: JsonMap): Promise<JsonMap>;
|
|
47
|
+
private manage;
|
|
48
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { EventService as EventBusCore } from './service.js';
|
|
2
|
+
import { EventServiceBinding } from './binding.js';
|
|
3
|
+
import { PubSubClient } from './client.js';
|
|
4
|
+
import { SDKCredentials } from './credentials.js';
|
|
5
|
+
import { PubSubError } from './errors.js';
|
|
6
|
+
import { identifier } from './channel.js';
|
|
7
|
+
export { PubSubError } from './errors.js';
|
|
8
|
+
const bindings = new WeakMap();
|
|
9
|
+
function jsonValue(value, parents = new Set()) {
|
|
10
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
11
|
+
return true;
|
|
12
|
+
if (typeof value === 'number')
|
|
13
|
+
return Number.isFinite(value);
|
|
14
|
+
if (typeof value !== 'object' || parents.has(value))
|
|
15
|
+
return false;
|
|
16
|
+
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
|
|
17
|
+
return false;
|
|
18
|
+
if (Object.getOwnPropertySymbols(value).length)
|
|
19
|
+
return false;
|
|
20
|
+
parents.add(value);
|
|
21
|
+
const valid = Array.isArray(value) ? Array.from(value).every(item => jsonValue(item, parents)) : Object.values(value).every(item => jsonValue(item, parents));
|
|
22
|
+
parents.delete(value);
|
|
23
|
+
return valid;
|
|
24
|
+
}
|
|
25
|
+
export class EventService {
|
|
26
|
+
sdk;
|
|
27
|
+
buses;
|
|
28
|
+
constructor(sdk) {
|
|
29
|
+
this.sdk = sdk;
|
|
30
|
+
let buses = bindings.get(sdk);
|
|
31
|
+
if (!buses) {
|
|
32
|
+
buses = new Map();
|
|
33
|
+
bindings.set(sdk, buses);
|
|
34
|
+
}
|
|
35
|
+
this.buses = buses;
|
|
36
|
+
}
|
|
37
|
+
bindBus(bus_aid, role, options = {}) {
|
|
38
|
+
if (this.sdk._closing)
|
|
39
|
+
throw new PubSubError('CLOSED');
|
|
40
|
+
if (!['pub', 'sub', 'bus'].includes(role))
|
|
41
|
+
throw new PubSubError('INVALID_ROLE');
|
|
42
|
+
const previous = this.buses.get(bus_aid);
|
|
43
|
+
if (previous) {
|
|
44
|
+
if (previous.role !== role)
|
|
45
|
+
throw new PubSubError('BUS_ROLE_CONFLICT');
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
if (role === 'bus') {
|
|
49
|
+
if (bus_aid !== this.sdk.aid)
|
|
50
|
+
throw new PubSubError('SERVICE_IDENTITY_MISMATCH');
|
|
51
|
+
const service = new EventBusCore(bus_aid, options.catalog ?? {}, options.allowlist ?? {}, {
|
|
52
|
+
send: async () => ({}), credentials: options.credentials ?? new SDKCredentials(this.sdk, bus_aid, options.credentialOptions),
|
|
53
|
+
clock: options.clock, state: options.state, limits: options.limits,
|
|
54
|
+
});
|
|
55
|
+
this.buses.set(bus_aid, { role, service, binding: new EventServiceBinding(service, this.sdk, options.bindingOptions), running: false, lifecycle: Promise.resolve() });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.buses.set(bus_aid, { role, client: new PubSubClient(this.sdk, bus_aid, { clock: options.clock, limits: options.limits }), lifecycle: Promise.resolve() });
|
|
59
|
+
}
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
bound(bus_aid, roles = ['pub', 'sub', 'bus']) {
|
|
63
|
+
const bound = this.buses.get(bus_aid);
|
|
64
|
+
if (!bound)
|
|
65
|
+
throw new PubSubError('BUS_NOT_BOUND');
|
|
66
|
+
if (!roles.includes(bound.role))
|
|
67
|
+
throw new PubSubError('ROLE_MISMATCH');
|
|
68
|
+
return bound;
|
|
69
|
+
}
|
|
70
|
+
client(bus_aid, role) { return this.bound(bus_aid, role ? [role] : ['pub', 'sub']).client; }
|
|
71
|
+
serialize(bound, action) { const result = bound.lifecycle.then(action); bound.lifecycle = result.catch(() => { }); return result; }
|
|
72
|
+
async start(bus_aid, options = {}) {
|
|
73
|
+
if (this.sdk._closing)
|
|
74
|
+
throw new PubSubError('CLOSED');
|
|
75
|
+
const created = !this.buses.has(bus_aid);
|
|
76
|
+
if (created)
|
|
77
|
+
this.bindBus(bus_aid, 'bus', options);
|
|
78
|
+
const bound = this.bound(bus_aid);
|
|
79
|
+
await this.serialize(bound, async () => {
|
|
80
|
+
if (this.sdk._closing)
|
|
81
|
+
throw new PubSubError('CLOSED');
|
|
82
|
+
if (bound.role !== 'bus') {
|
|
83
|
+
await bound.client.start();
|
|
84
|
+
bound.closed = false;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
await bound.binding.start();
|
|
89
|
+
bound.running = true;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (created && this.buses.get(bus_aid) === bound) {
|
|
93
|
+
await bound.binding.close().catch(() => { });
|
|
94
|
+
this.buses.delete(bus_aid);
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
async drain(bus_aid) { const bound = this.bound(bus_aid); await bound.lifecycle; if (bound.role === 'bus')
|
|
102
|
+
await bound.binding.drain();
|
|
103
|
+
else
|
|
104
|
+
await bound.client.drain(); }
|
|
105
|
+
async close(bus_aid) { const bound = this.bound(bus_aid); await this.serialize(bound, async () => { if (bound.role === 'bus') {
|
|
106
|
+
bound.running = false;
|
|
107
|
+
await bound.binding.close();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
bound.closed = true;
|
|
111
|
+
await bound.client.close();
|
|
112
|
+
} }); }
|
|
113
|
+
async _closeAll() { await Promise.allSettled([...this.buses.keys()].map(bus_aid => this.close(bus_aid))); }
|
|
114
|
+
async updateConfig(bus_aid, config) { await this.bound(bus_aid, ['bus']).service.updateConfig(config); }
|
|
115
|
+
async authorize(bus_aid, role, authMode, events, credential) {
|
|
116
|
+
if (role !== 'pub' && role !== 'sub')
|
|
117
|
+
throw new PubSubError('INVALID_ROLE');
|
|
118
|
+
this.bindBus(bus_aid, role);
|
|
119
|
+
await this.start(bus_aid);
|
|
120
|
+
const bound = this.bound(bus_aid, ['pub', 'sub']);
|
|
121
|
+
return bound.client.authorize(authMode, events, [role === 'pub' ? 'publish' : 'subscribe'], credential);
|
|
122
|
+
}
|
|
123
|
+
async renew(bus_aid) { return this.client(bus_aid).renew(); }
|
|
124
|
+
async publish(bus_aid, eventName, data, options = {}) { const client = this.client(bus_aid, 'pub'); if (data === null || Array.isArray(data) || typeof data !== 'object' || !jsonValue(data))
|
|
125
|
+
throw new PubSubError('INVALID_CONTENT'); return client.publish(eventName, data, options); }
|
|
126
|
+
async waitPublished(bus_aid, eventId) { return this.client(bus_aid, 'pub').waitPublished(eventId); }
|
|
127
|
+
onPublish(bus_aid, handler) { return this.client(bus_aid, 'pub').onPublish(handler); }
|
|
128
|
+
async subscribe(bus_aid, events) { return this.client(bus_aid, 'sub').subscribe(events); }
|
|
129
|
+
async unsubscribe(bus_aid, events) { return this.client(bus_aid, 'sub').unsubscribe(events); }
|
|
130
|
+
async nextEvent(bus_aid, timeout) { return { ...await this.client(bus_aid, 'sub').nextEvent(timeout), bus_aid }; }
|
|
131
|
+
onEvent(bus_aid, handler) { return this.client(bus_aid, 'sub').onEvent(event => handler({ ...event, bus_aid })); }
|
|
132
|
+
async catalog(bus_aid, params = {}) { if (this.sdk._closing)
|
|
133
|
+
throw new PubSubError('CLOSED'); const bound = this.bound(bus_aid); return bound.role !== 'bus' ? bound.client.catalog(params) : this.manage(bus_aid, 'catalog', params); }
|
|
134
|
+
async stats(bus_aid, params = {}) { return this.manage(bus_aid, 'stats', params); }
|
|
135
|
+
async issueGrant(bus_aid, params) { return this.manage(bus_aid, 'issue_grant', params); }
|
|
136
|
+
async revokeGrant(bus_aid, params) { return this.manage(bus_aid, 'revoke_grant', params); }
|
|
137
|
+
async manage(bus_aid, op, params) {
|
|
138
|
+
if (this.sdk._closing)
|
|
139
|
+
throw new PubSubError('CLOSED');
|
|
140
|
+
const bound = this.bound(bus_aid, ['bus']);
|
|
141
|
+
await bound.lifecycle;
|
|
142
|
+
if (!bound.running)
|
|
143
|
+
throw new PubSubError('CLOSED');
|
|
144
|
+
const now = bound.service.clock();
|
|
145
|
+
const request = { ...structuredClone(params), type: 'app.pubsub.v1', op, service_aid: bus_aid, request_id: typeof params.request_id === 'string' ? params.request_id : identifier(), nonce: typeof params.nonce === 'string' ? params.nonce : identifier(), issued_at: now, expires_at: Number(params.expires_at ?? now + 60_000) };
|
|
146
|
+
const result = await bound.service._handleLocal(request);
|
|
147
|
+
if (op === 'catalog' && Array.isArray(result.items) && result.events === undefined)
|
|
148
|
+
result.events = structuredClone(result.items);
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=index.js.map
|