sealbridge 0.2.1 → 0.3.0
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/README.ja.md +499 -31
- package/README.md +529 -110
- package/dist/cli/dist/accept.d.ts +13 -0
- package/dist/cli/dist/accept.js +115 -0
- package/dist/cli/dist/accept.js.map +1 -0
- package/dist/cli/dist/approval-summary.d.ts +1 -1
- package/dist/cli/dist/board.d.ts +10 -9
- package/dist/cli/dist/board.js +62 -31
- package/dist/cli/dist/board.js.map +1 -1
- package/dist/cli/dist/command-identity.d.ts +6 -0
- package/dist/cli/dist/command-identity.js +13 -0
- package/dist/cli/dist/command-identity.js.map +1 -0
- package/dist/cli/dist/config.d.ts +3 -0
- package/dist/cli/dist/config.js +29 -0
- package/dist/cli/dist/config.js.map +1 -0
- package/dist/cli/dist/connections.d.ts +15 -0
- package/dist/cli/dist/connections.js +191 -0
- package/dist/cli/dist/connections.js.map +1 -0
- package/dist/cli/dist/contacts.d.ts +4 -3
- package/dist/cli/dist/contacts.js +39 -28
- package/dist/cli/dist/contacts.js.map +1 -1
- package/dist/cli/dist/doctor.d.ts +9 -0
- package/dist/cli/dist/doctor.js +46 -5
- package/dist/cli/dist/doctor.js.map +1 -1
- package/dist/cli/dist/error-messages.js +24 -0
- package/dist/cli/dist/error-messages.js.map +1 -1
- package/dist/cli/dist/index.js +54 -6
- package/dist/cli/dist/index.js.map +1 -1
- package/dist/cli/dist/invite-output.d.ts +14 -0
- package/dist/cli/dist/invite-output.js +66 -0
- package/dist/cli/dist/invite-output.js.map +1 -0
- package/dist/cli/dist/invite-share.d.ts +6 -3
- package/dist/cli/dist/invite-share.js +40 -15
- package/dist/cli/dist/invite-share.js.map +1 -1
- package/dist/cli/dist/invites-migrate.d.ts +3 -0
- package/dist/cli/dist/invites-migrate.js +33 -0
- package/dist/cli/dist/invites-migrate.js.map +1 -0
- package/dist/cli/dist/mcp.d.ts +7 -5
- package/dist/cli/dist/mcp.js +23 -18
- package/dist/cli/dist/mcp.js.map +1 -1
- package/dist/cli/dist/network.d.ts +11 -1
- package/dist/cli/dist/network.js +150 -87
- package/dist/cli/dist/network.js.map +1 -1
- package/dist/cli/dist/pending.d.ts +8 -0
- package/dist/cli/dist/pending.js +50 -0
- package/dist/cli/dist/pending.js.map +1 -0
- package/dist/cli/dist/public-settings.d.ts +5 -4
- package/dist/cli/dist/public-settings.js +13 -15
- package/dist/cli/dist/public-settings.js.map +1 -1
- package/dist/cli/dist/receipt.d.ts +1 -1
- package/dist/cli/dist/relay-auth.d.ts +3 -0
- package/dist/cli/dist/relay-auth.js +23 -0
- package/dist/cli/dist/relay-auth.js.map +1 -0
- package/dist/cli/dist/requests.d.ts +10 -0
- package/dist/cli/dist/requests.js +91 -0
- package/dist/cli/dist/requests.js.map +1 -0
- package/dist/cli/dist/sdk.d.ts +10 -0
- package/dist/cli/dist/sdk.js +7 -0
- package/dist/cli/dist/sdk.js.map +1 -0
- package/dist/cli/dist/setup-files.d.ts +24 -0
- package/dist/cli/dist/setup-files.js +190 -0
- package/dist/cli/dist/setup-files.js.map +1 -0
- package/dist/cli/dist/setup-hosts.d.ts +29 -0
- package/dist/cli/dist/setup-hosts.js +75 -0
- package/dist/cli/dist/setup-hosts.js.map +1 -0
- package/dist/cli/dist/setup.d.ts +61 -0
- package/dist/cli/dist/setup.js +243 -0
- package/dist/cli/dist/setup.js.map +1 -0
- package/dist/cli/dist/task-input.d.ts +1 -1
- package/dist/cli/dist/wake-hook.d.ts +1 -1
- package/dist/cli/dist/worker-json.d.ts +4 -0
- package/dist/cli/dist/worker-json.js +87 -0
- package/dist/cli/dist/worker-json.js.map +1 -0
- package/dist/examples/two-owner-demo/dist/run-demo.d.ts +13 -13
- package/dist/package.json +1 -1
- package/dist/packages/adapters/dist/codex-config.d.ts +15 -0
- package/dist/packages/adapters/dist/codex-config.js +171 -0
- package/dist/packages/adapters/dist/codex-config.js.map +1 -0
- package/dist/packages/adapters/dist/command.d.ts +7 -3
- package/dist/packages/adapters/dist/command.js +74 -24
- package/dist/packages/adapters/dist/command.js.map +1 -1
- package/dist/packages/adapters/dist/credential-proxy.d.ts +4 -2
- package/dist/packages/adapters/dist/credential-proxy.js +5 -0
- package/dist/packages/adapters/dist/credential-proxy.js.map +1 -1
- package/dist/packages/adapters/dist/index.d.ts +1 -1
- package/dist/packages/adapters/dist/mcp.d.ts +2 -2
- package/dist/packages/adapters/dist/openai.d.ts +2 -2
- package/dist/packages/adapters/dist/sandbox.d.ts +2 -2
- package/dist/packages/adapters/dist/windows-command.d.ts +6 -0
- package/dist/packages/adapters/dist/windows-command.js +37 -0
- package/dist/packages/adapters/dist/windows-command.js.map +1 -0
- package/dist/packages/core/dist/connection.d.ts +58 -0
- package/dist/packages/core/dist/connection.js +132 -0
- package/dist/packages/core/dist/connection.js.map +1 -0
- package/dist/packages/core/dist/delivery-status.d.ts +22 -0
- package/dist/packages/core/dist/delivery-status.js +53 -0
- package/dist/packages/core/dist/delivery-status.js.map +1 -0
- package/dist/packages/core/dist/discovery.d.ts +7 -6
- package/dist/packages/core/dist/discovery.js +19 -20
- package/dist/packages/core/dist/discovery.js.map +1 -1
- package/dist/packages/core/dist/edge.d.ts +1 -0
- package/dist/packages/core/dist/edge.js +1 -0
- package/dist/packages/core/dist/edge.js.map +1 -1
- package/dist/packages/core/dist/index.d.ts +3 -0
- package/dist/packages/core/dist/index.js +3 -0
- package/dist/packages/core/dist/index.js.map +1 -1
- package/dist/packages/core/dist/protocol.d.ts +24 -0
- package/dist/packages/core/dist/protocol.js +54 -0
- package/dist/packages/core/dist/protocol.js.map +1 -0
- package/dist/packages/core/dist/receipts.d.ts +1 -0
- package/dist/packages/core/dist/receipts.js +1 -1
- package/dist/packages/core/dist/receipts.js.map +1 -1
- package/dist/packages/core/dist/schema.d.ts +1 -0
- package/dist/packages/core/dist/schema.js +13 -2
- package/dist/packages/core/dist/schema.js.map +1 -1
- package/dist/packages/ledger/dist/index.d.ts +1 -1
- package/dist/packages/relay/dist/admission.d.ts +14 -0
- package/dist/packages/relay/dist/admission.js +70 -0
- package/dist/packages/relay/dist/admission.js.map +1 -0
- package/dist/packages/relay/dist/fetch.d.ts +8 -2
- package/dist/packages/relay/dist/fetch.js +41 -12
- package/dist/packages/relay/dist/fetch.js.map +1 -1
- package/dist/packages/relay/dist/index.d.ts +23 -12
- package/dist/packages/relay/dist/index.js +130 -78
- package/dist/packages/relay/dist/index.js.map +1 -1
- package/dist/packages/relay/dist/journal.d.ts +1 -1
- package/dist/packages/relay/dist/notifications.d.ts +1 -1
- package/dist/packages/relay/dist/retry.d.ts +23 -0
- package/dist/packages/relay/dist/retry.js +43 -1
- package/dist/packages/relay/dist/retry.js.map +1 -1
- package/dist/packages/relay/dist/ssrf.d.ts +3 -2
- package/dist/packages/relay/dist/ssrf.js.map +1 -1
- package/dist/packages/relay/dist/worker.js +1 -1
- package/dist/packages/relay/dist/worker.js.map +1 -1
- package/dist/packages/runtime/dist/a2a.d.ts +1 -1
- package/dist/packages/runtime/dist/a2a.js +1 -1
- package/dist/packages/runtime/dist/adapter.d.ts +2 -2
- package/dist/packages/runtime/dist/application-config.d.ts +20 -0
- package/dist/packages/runtime/dist/application-config.js +222 -0
- package/dist/packages/runtime/dist/application-config.js.map +1 -0
- package/dist/packages/runtime/dist/approval-providers.d.ts +24 -3
- package/dist/packages/runtime/dist/approval-providers.js +79 -3
- package/dist/packages/runtime/dist/approval-providers.js.map +1 -1
- package/dist/packages/runtime/dist/connection-admission-review.d.ts +39 -0
- package/dist/packages/runtime/dist/connection-admission-review.js +86 -0
- package/dist/packages/runtime/dist/connection-admission-review.js.map +1 -0
- package/dist/packages/runtime/dist/connection-persistence.d.ts +35 -0
- package/dist/packages/runtime/dist/connection-persistence.js +181 -0
- package/dist/packages/runtime/dist/connection-persistence.js.map +1 -0
- package/dist/packages/runtime/dist/connection-records.d.ts +167 -0
- package/dist/packages/runtime/dist/connection-records.js +132 -0
- package/dist/packages/runtime/dist/connection-records.js.map +1 -0
- package/dist/packages/runtime/dist/connection-router.d.ts +45 -0
- package/dist/packages/runtime/dist/connection-router.js +130 -0
- package/dist/packages/runtime/dist/connection-router.js.map +1 -0
- package/dist/packages/runtime/dist/connection-service.d.ts +159 -0
- package/dist/packages/runtime/dist/connection-service.js +239 -0
- package/dist/packages/runtime/dist/connection-service.js.map +1 -0
- package/dist/packages/runtime/dist/connection-transport.d.ts +14 -0
- package/dist/packages/runtime/dist/connection-transport.js +89 -0
- package/dist/packages/runtime/dist/connection-transport.js.map +1 -0
- package/dist/packages/runtime/dist/delivery-records.d.ts +180 -0
- package/dist/packages/runtime/dist/delivery-records.js +205 -0
- package/dist/packages/runtime/dist/delivery-records.js.map +1 -0
- package/dist/packages/runtime/dist/delivery-status-router.d.ts +27 -0
- package/dist/packages/runtime/dist/delivery-status-router.js +150 -0
- package/dist/packages/runtime/dist/delivery-status-router.js.map +1 -0
- package/dist/packages/runtime/dist/delivery-status.d.ts +43 -0
- package/dist/packages/runtime/dist/delivery-status.js +193 -0
- package/dist/packages/runtime/dist/delivery-status.js.map +1 -0
- package/dist/packages/runtime/dist/delivery-store.d.ts +125 -0
- package/dist/packages/runtime/dist/delivery-store.js +1047 -0
- package/dist/packages/runtime/dist/delivery-store.js.map +1 -0
- package/dist/packages/runtime/dist/gateway.d.ts +4 -3
- package/dist/packages/runtime/dist/gateway.js.map +1 -1
- package/dist/packages/runtime/dist/held-request-review.d.ts +49 -0
- package/dist/packages/runtime/dist/held-request-review.js +122 -0
- package/dist/packages/runtime/dist/held-request-review.js.map +1 -0
- package/dist/packages/runtime/dist/held-request-store.d.ts +112 -0
- package/dist/packages/runtime/dist/held-request-store.js +290 -0
- package/dist/packages/runtime/dist/held-request-store.js.map +1 -0
- package/dist/packages/runtime/dist/idempotency-store.d.ts +53 -0
- package/dist/packages/runtime/dist/idempotency-store.js +331 -0
- package/dist/packages/runtime/dist/idempotency-store.js.map +1 -0
- package/dist/packages/runtime/dist/inbox.d.ts +1 -1
- package/dist/packages/runtime/dist/index.d.ts +27 -1
- package/dist/packages/runtime/dist/index.js +26 -0
- package/dist/packages/runtime/dist/index.js.map +1 -1
- package/dist/packages/runtime/dist/invite-store.d.ts +76 -0
- package/dist/packages/runtime/dist/invite-store.js +337 -0
- package/dist/packages/runtime/dist/invite-store.js.map +1 -0
- package/dist/packages/runtime/dist/key-store.d.ts +77 -0
- package/dist/packages/runtime/dist/key-store.js +226 -0
- package/dist/packages/runtime/dist/key-store.js.map +1 -0
- package/dist/packages/runtime/dist/local-identity.d.ts +33 -0
- package/dist/packages/runtime/dist/local-identity.js +278 -0
- package/dist/packages/runtime/dist/local-identity.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-rpc.d.ts +19 -0
- package/dist/packages/runtime/dist/mcp-rpc.js +175 -0
- package/dist/packages/runtime/dist/mcp-rpc.js.map +1 -0
- package/dist/packages/runtime/dist/mcp-server.d.ts +46 -19
- package/dist/packages/runtime/dist/mcp-server.js +427 -184
- package/dist/packages/runtime/dist/mcp-server.js.map +1 -1
- package/dist/packages/runtime/dist/mcp-tool-catalog.d.ts +1 -1
- package/dist/packages/runtime/dist/mcp-tool-catalog.js +172 -13
- package/dist/packages/runtime/dist/mcp-tool-catalog.js.map +1 -1
- package/dist/packages/runtime/dist/mcp.d.ts +2 -2
- package/dist/packages/runtime/dist/message-status.d.ts +32 -0
- package/dist/packages/runtime/dist/message-status.js +29 -0
- package/dist/packages/runtime/dist/message-status.js.map +1 -0
- package/dist/packages/runtime/dist/outbox.d.ts +91 -0
- package/dist/packages/runtime/dist/outbox.js +462 -0
- package/dist/packages/runtime/dist/outbox.js.map +1 -0
- package/dist/packages/runtime/dist/policy.d.ts +1 -1
- package/dist/packages/runtime/dist/protocol-peer-store.d.ts +40 -0
- package/dist/packages/runtime/dist/protocol-peer-store.js +176 -0
- package/dist/packages/runtime/dist/protocol-peer-store.js.map +1 -0
- package/dist/packages/runtime/dist/protocol-release.d.ts +26 -0
- package/dist/packages/runtime/dist/protocol-release.js +76 -0
- package/dist/packages/runtime/dist/protocol-release.js.map +1 -0
- package/dist/packages/runtime/dist/quota.d.ts +1 -1
- package/dist/packages/runtime/dist/relay-selection.d.ts +20 -0
- package/dist/packages/runtime/dist/relay-selection.js +34 -0
- package/dist/packages/runtime/dist/relay-selection.js.map +1 -0
- package/dist/packages/runtime/dist/requester-pending-store.d.ts +59 -0
- package/dist/packages/runtime/dist/requester-pending-store.js +266 -0
- package/dist/packages/runtime/dist/requester-pending-store.js.map +1 -0
- package/dist/packages/runtime/dist/secret-store.d.ts +19 -0
- package/dist/packages/runtime/dist/secret-store.js +51 -0
- package/dist/packages/runtime/dist/secret-store.js.map +1 -0
- package/dist/packages/runtime/dist/session-audit.d.ts +29 -7
- package/dist/packages/runtime/dist/session-audit.js +149 -29
- package/dist/packages/runtime/dist/session-audit.js.map +1 -1
- package/dist/packages/runtime/dist/session.d.ts +101 -9
- package/dist/packages/runtime/dist/session.js +696 -96
- package/dist/packages/runtime/dist/session.js.map +1 -1
- package/dist/packages/runtime/dist/task-journal.d.ts +18 -3
- package/dist/packages/runtime/dist/task-journal.js +271 -18
- package/dist/packages/runtime/dist/task-journal.js.map +1 -1
- package/dist/packages/runtime/dist/verifier.d.ts +3 -2
- package/dist/packages/runtime/dist/verifier.js +1 -0
- package/dist/packages/runtime/dist/verifier.js.map +1 -1
- package/dist/packages/runtime/dist/worker-trust-store.d.ts +111 -0
- package/dist/packages/runtime/dist/worker-trust-store.js +592 -0
- package/dist/packages/runtime/dist/worker-trust-store.js.map +1 -0
- package/dist/packages/sandbox/dist/command-environment.d.ts +2 -0
- package/dist/packages/sandbox/dist/command-environment.js +29 -0
- package/dist/packages/sandbox/dist/command-environment.js.map +1 -0
- package/dist/packages/sandbox/dist/container.d.ts +1 -1
- package/dist/packages/sandbox/dist/index.d.ts +2 -1
- package/dist/packages/sandbox/dist/index.js +1 -0
- package/dist/packages/sandbox/dist/index.js.map +1 -1
- package/dist/spec/README.ja.md +21 -1
- package/dist/spec/README.md +20 -1
- package/dist/spec/agent-card.schema.json +11 -1
- package/dist/spec/delivery-status.schema.json +106 -0
- package/dist/spec/examples/protocol-versions/sample-agent-card.json +35 -0
- package/dist/spec/examples/sample-delivery-status.json +21 -0
- package/dist/spec/examples/sample-task-manifest.0.1.0.json +173 -0
- package/dist/spec/examples/sample-task-manifest.0.2.0.json +173 -0
- package/dist/spec/task-manifest.0.1.0.schema.json +422 -0
- package/dist/spec/task-manifest.0.2.0.schema.json +422 -0
- package/dist/spec/task-manifest.schema.json +9 -418
- package/docs/sdk.ja.md +133 -0
- package/docs/sdk.md +138 -0
- package/package.json +15 -3
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { Invite, Json, Signed } from '../../core/dist/index.js';
|
|
2
|
+
export declare const CONNECTION_DAY_MS = 86400000;
|
|
3
|
+
export declare const CONNECTION_OFFER_TTL_MS: number;
|
|
4
|
+
export declare const CONNECTION_REFUSAL_TTL_MS: number;
|
|
5
|
+
export declare const CONNECTION_CAPACITY: {
|
|
6
|
+
readonly connections: 1000;
|
|
7
|
+
readonly inviteBindings: 1000;
|
|
8
|
+
readonly outbox: 100;
|
|
9
|
+
readonly priorApprovedPeers: 1000;
|
|
10
|
+
readonly refusals: 1000;
|
|
11
|
+
};
|
|
12
|
+
export type ConnectionState = 'none' | 'pending' | 'connected' | 'blocked';
|
|
13
|
+
/** Owner-local observation of the current connection or latest retained offer. */
|
|
14
|
+
export interface ConnectionStatus {
|
|
15
|
+
peerOwnerDid: string;
|
|
16
|
+
/** Informational name retained in local connection or offer metadata, when known. */
|
|
17
|
+
peerDisplayName?: string;
|
|
18
|
+
state: ConnectionState;
|
|
19
|
+
status: 'none' | 'pending_peer' | 'pending_owner' | 'connected' | 'inactive' | 'expired' | 'blocked';
|
|
20
|
+
requestId?: string;
|
|
21
|
+
direction?: 'incoming' | 'outgoing';
|
|
22
|
+
createdAt?: number;
|
|
23
|
+
expiresAt?: number;
|
|
24
|
+
connectionId?: string;
|
|
25
|
+
connectedAt?: number;
|
|
26
|
+
/** Outgoing: ACK awaits sending. Incoming: acceptance awaits the peer ACK. */
|
|
27
|
+
acknowledgementPending?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type ConnectionTrust = 'unknown' | 'limited' | 'denied';
|
|
30
|
+
export interface ConnectionIncomingOffer {
|
|
31
|
+
requestId: string;
|
|
32
|
+
requestDigest: string;
|
|
33
|
+
receivedAt: number;
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ConnectionOutgoingOffer {
|
|
37
|
+
requestId: string;
|
|
38
|
+
requestDigest: string;
|
|
39
|
+
createdAt: number;
|
|
40
|
+
expiresAt: number;
|
|
41
|
+
ownerConsentDigest: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ConnectionRecord {
|
|
44
|
+
peerOwnerDid: string;
|
|
45
|
+
peerAgentDid?: string;
|
|
46
|
+
peerDisplayName?: string;
|
|
47
|
+
relayUrl: string;
|
|
48
|
+
state: 'pending' | 'connected';
|
|
49
|
+
incoming?: ConnectionIncomingOffer;
|
|
50
|
+
outgoing?: ConnectionOutgoingOffer;
|
|
51
|
+
connectionId?: string;
|
|
52
|
+
connectedAt?: number;
|
|
53
|
+
source?: 'request' | 'invite' | 'prior-approval';
|
|
54
|
+
localConsentDigest?: string;
|
|
55
|
+
remoteAcceptanceDigest?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface InviteBindingRecord {
|
|
58
|
+
inviteDigest: string;
|
|
59
|
+
requesterOwnerDid: string;
|
|
60
|
+
boundAt: number;
|
|
61
|
+
tokenExpiresAt: number;
|
|
62
|
+
connectionId: string;
|
|
63
|
+
}
|
|
64
|
+
export interface PriorApprovedPeer {
|
|
65
|
+
peerOwnerDid: string;
|
|
66
|
+
peerDisplayName?: string;
|
|
67
|
+
lastApprovedAt?: number;
|
|
68
|
+
sourceRequestIds: string[];
|
|
69
|
+
legacyTrust: 'limited' | 'trusted';
|
|
70
|
+
}
|
|
71
|
+
/** Callers supply owner-signed control data and omit invitation tokens and task input. */
|
|
72
|
+
export interface ConnectionOutboxRecord {
|
|
73
|
+
eventId: string;
|
|
74
|
+
peerOwnerDid: string;
|
|
75
|
+
relayUrl: string;
|
|
76
|
+
signedEvent: Signed<Json>;
|
|
77
|
+
deliveryDeadline: number;
|
|
78
|
+
state: 'pending' | 'delivered';
|
|
79
|
+
}
|
|
80
|
+
export interface ConnectionData {
|
|
81
|
+
connections: ConnectionRecord[];
|
|
82
|
+
inviteBindings: InviteBindingRecord[];
|
|
83
|
+
refusals: Array<{
|
|
84
|
+
peerOwnerDid: string;
|
|
85
|
+
refuseUntil: number;
|
|
86
|
+
}>;
|
|
87
|
+
priorApprovedPeers: PriorApprovedPeer[];
|
|
88
|
+
outbox: ConnectionOutboxRecord[];
|
|
89
|
+
}
|
|
90
|
+
/** Peer names are informational; owner and agent DIDs determine identity. */
|
|
91
|
+
export interface ConnectionPeer {
|
|
92
|
+
peerOwnerDid: string;
|
|
93
|
+
peerAgentDid?: string;
|
|
94
|
+
peerDisplayName?: string;
|
|
95
|
+
relayUrl: string;
|
|
96
|
+
}
|
|
97
|
+
export interface ConnectionSummary {
|
|
98
|
+
peerOwnerDid: string;
|
|
99
|
+
peerAgentDid?: string;
|
|
100
|
+
peerDisplayName?: string;
|
|
101
|
+
relayUrl?: string;
|
|
102
|
+
state: Exclude<ConnectionState, 'none'>;
|
|
103
|
+
}
|
|
104
|
+
export interface RecordOutgoingConnection extends ConnectionPeer {
|
|
105
|
+
outgoing: ConnectionOutgoingOffer;
|
|
106
|
+
}
|
|
107
|
+
export interface RecordIncomingConnection extends ConnectionPeer {
|
|
108
|
+
incoming: ConnectionIncomingOffer;
|
|
109
|
+
}
|
|
110
|
+
export interface ApproveConnectionInput {
|
|
111
|
+
peerOwnerDid: string;
|
|
112
|
+
requestId: string;
|
|
113
|
+
requestDigest: string;
|
|
114
|
+
connectionId: string;
|
|
115
|
+
localConsentDigest: string;
|
|
116
|
+
outbox: ConnectionOutboxRecord;
|
|
117
|
+
source?: 'request' | 'prior-approval';
|
|
118
|
+
}
|
|
119
|
+
/** The exchange layer verifies remote signature and identities before calling this port. */
|
|
120
|
+
export interface ApplyConnectionAcceptedInput {
|
|
121
|
+
peerOwnerDid: string;
|
|
122
|
+
requestId: string;
|
|
123
|
+
requestDigest: string;
|
|
124
|
+
connectionId: string;
|
|
125
|
+
remoteAcceptanceDigest: string;
|
|
126
|
+
}
|
|
127
|
+
/** Pass a parsed, verified, unrevoked issuer invitation and an authenticated requester owner DID. */
|
|
128
|
+
export interface BindInviteFirstUseInput extends ConnectionPeer {
|
|
129
|
+
invite: Invite;
|
|
130
|
+
connectionId: string;
|
|
131
|
+
localConsentDigest: string;
|
|
132
|
+
outbox: ConnectionOutboxRecord;
|
|
133
|
+
}
|
|
134
|
+
/** Structural port for owner-local persistence; it has no transport or review policy. */
|
|
135
|
+
export interface ConnectionPersistence {
|
|
136
|
+
connectionState(peerOwnerDid: string): ConnectionState;
|
|
137
|
+
connectionLevel(peerOwnerDid: string): ConnectionTrust;
|
|
138
|
+
listConnections(): ConnectionSummary[];
|
|
139
|
+
listPriorApprovedPeers(): PriorApprovedPeer[];
|
|
140
|
+
recordOutgoing(input: RecordOutgoingConnection): void;
|
|
141
|
+
recordIncoming(input: RecordIncomingConnection): void;
|
|
142
|
+
approveConnection(input: ApproveConnectionInput): void;
|
|
143
|
+
applyAccepted(input: ApplyConnectionAcceptedInput): void;
|
|
144
|
+
rejectConnection(peerOwnerDid: string): void;
|
|
145
|
+
disconnect(peerOwnerDid: string): void;
|
|
146
|
+
block(peerOwnerDid: string): void;
|
|
147
|
+
unblock(peerOwnerDid: string): void;
|
|
148
|
+
bindInviteFirstUse(input: BindInviteFirstUseInput): 'first' | 'same' | 'other';
|
|
149
|
+
listConnectionOutbox(): ConnectionOutboxRecord[];
|
|
150
|
+
markConnectionEventDelivered(eventId: string): void;
|
|
151
|
+
}
|
|
152
|
+
/** Explicit adapter with no store-specific fields exposed to consumers. */
|
|
153
|
+
export declare function connectionPersistencePort(store: ConnectionPersistence): ConnectionPersistence;
|
|
154
|
+
export declare function emptyConnectionData(): ConnectionData;
|
|
155
|
+
export declare function projectConnectionState(data: ConnectionData, denials: string[], peer: string, now: number): ConnectionState;
|
|
156
|
+
export declare function projectConnectionTrust(state: ConnectionState): ConnectionTrust;
|
|
157
|
+
export declare function pruneConnectionData(data: ConnectionData, now: number): void;
|
|
158
|
+
export declare function assertConnectionCapacity(data: ConnectionData): void;
|
|
159
|
+
export declare function validConnectionPeer(p: ConnectionPeer): boolean;
|
|
160
|
+
export declare function assertConnectionOwnerDid(peerOwnerDid: string): void;
|
|
161
|
+
export declare function validConnectionOffer(o: ConnectionIncomingOffer | ConnectionOutgoingOffer, outgoing: boolean): boolean;
|
|
162
|
+
export declare function validConnectionOutbox(e: ConnectionOutboxRecord, owner: string): boolean;
|
|
163
|
+
export declare function assertConnectionCommit(connectionId: string, consentDigest: string): void;
|
|
164
|
+
/** Validate the persisted lifecycle, including uniqueness and explicit connected consent. */
|
|
165
|
+
export declare function validConnectionData(d: ConnectionData, owner: string): boolean;
|
|
166
|
+
/** Canonical parsed invitations have the same digest for each supported URI encoding. */
|
|
167
|
+
export declare function connectionInviteDigest(invite: Invite): string;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { digest, verifySigned } from '../../core/dist/index.js';
|
|
3
|
+
export const CONNECTION_DAY_MS = 86_400_000;
|
|
4
|
+
export const CONNECTION_OFFER_TTL_MS = 14 * CONNECTION_DAY_MS;
|
|
5
|
+
export const CONNECTION_REFUSAL_TTL_MS = 7 * CONNECTION_DAY_MS;
|
|
6
|
+
export const CONNECTION_CAPACITY = { connections: 1000, inviteBindings: 1000, outbox: 100,
|
|
7
|
+
priorApprovedPeers: 1000, refusals: 1000 };
|
|
8
|
+
/** Explicit adapter with no store-specific fields exposed to consumers. */
|
|
9
|
+
export function connectionPersistencePort(store) {
|
|
10
|
+
return {
|
|
11
|
+
connectionState: did => store.connectionState(did), connectionLevel: did => store.connectionLevel(did),
|
|
12
|
+
listConnections: () => store.listConnections(), listPriorApprovedPeers: () => store.listPriorApprovedPeers(),
|
|
13
|
+
recordOutgoing: input => store.recordOutgoing(input), recordIncoming: input => store.recordIncoming(input),
|
|
14
|
+
approveConnection: input => store.approveConnection(input), applyAccepted: input => store.applyAccepted(input),
|
|
15
|
+
rejectConnection: did => store.rejectConnection(did), disconnect: did => store.disconnect(did),
|
|
16
|
+
block: did => store.block(did), unblock: did => store.unblock(did),
|
|
17
|
+
bindInviteFirstUse: input => store.bindInviteFirstUse(input),
|
|
18
|
+
listConnectionOutbox: () => store.listConnectionOutbox(),
|
|
19
|
+
markConnectionEventDelivered: id => store.markConnectionEventDelivered(id),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function emptyConnectionData() {
|
|
23
|
+
return { connections: [], inviteBindings: [], refusals: [], priorApprovedPeers: [], outbox: [] };
|
|
24
|
+
}
|
|
25
|
+
export function projectConnectionState(data, denials, peer, now) {
|
|
26
|
+
if (denials.includes(peer))
|
|
27
|
+
return 'blocked';
|
|
28
|
+
const r = data.connections.find(c => c.peerOwnerDid === peer);
|
|
29
|
+
return r?.state === 'connected' ? 'connected' : r &&
|
|
30
|
+
((r.incoming?.expiresAt ?? 0) > now || (r.outgoing?.expiresAt ?? 0) > now) ? 'pending' : 'none';
|
|
31
|
+
}
|
|
32
|
+
export function projectConnectionTrust(state) {
|
|
33
|
+
return state === 'blocked' ? 'denied' : state === 'connected' ? 'limited' : 'unknown';
|
|
34
|
+
}
|
|
35
|
+
export function pruneConnectionData(data, now) {
|
|
36
|
+
data.connections = data.connections.filter(c => {
|
|
37
|
+
if (c.state === 'connected')
|
|
38
|
+
return true;
|
|
39
|
+
if (c.incoming && c.incoming.expiresAt <= now)
|
|
40
|
+
delete c.incoming;
|
|
41
|
+
if (c.outgoing && c.outgoing.expiresAt <= now)
|
|
42
|
+
delete c.outgoing;
|
|
43
|
+
return !!(c.incoming || c.outgoing);
|
|
44
|
+
});
|
|
45
|
+
data.inviteBindings = data.inviteBindings.filter(b => b.tokenExpiresAt > now);
|
|
46
|
+
data.refusals = data.refusals.filter(r => r.refuseUntil > now);
|
|
47
|
+
data.outbox = data.outbox.filter(e => e.deliveryDeadline > now);
|
|
48
|
+
}
|
|
49
|
+
export function assertConnectionCapacity(data) {
|
|
50
|
+
for (const key of Object.keys(CONNECTION_CAPACITY))
|
|
51
|
+
if (data[key].length > CONNECTION_CAPACITY[key])
|
|
52
|
+
throw new Error('CONNECTION_STORE_FULL');
|
|
53
|
+
}
|
|
54
|
+
const text = (v, max = 512) => typeof v === 'string' && v.length > 0 && v.length <= max && !/[\p{Cc}\p{Cf}]/u.test(v);
|
|
55
|
+
const did = (v) => text(v) && v.startsWith('did:');
|
|
56
|
+
const hash = (v) => typeof v === 'string' && /^sha256:[a-f0-9]{64}$/.test(v);
|
|
57
|
+
const time = (v) => typeof v === 'number' && Number.isSafeInteger(v) && v >= 0 && v <= 8_640_000_000_000_000;
|
|
58
|
+
const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
59
|
+
function keys(v, allowed) { return Object.keys(v).every(k => allowed.includes(k)); }
|
|
60
|
+
function relay(v) {
|
|
61
|
+
if (!text(v, 2048))
|
|
62
|
+
return false;
|
|
63
|
+
try {
|
|
64
|
+
const u = new URL(v);
|
|
65
|
+
return ['http:', 'https:'].includes(u.protocol) && !u.username && !u.password && !u.search && !u.hash;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export function validConnectionPeer(p) {
|
|
72
|
+
return object(p) && did(p.peerOwnerDid) && (p.peerAgentDid === undefined || did(p.peerAgentDid)) &&
|
|
73
|
+
(p.peerDisplayName === undefined || typeof p.peerDisplayName === 'string' && p.peerDisplayName.length > 0) && relay(p.relayUrl);
|
|
74
|
+
}
|
|
75
|
+
export function assertConnectionOwnerDid(peerOwnerDid) {
|
|
76
|
+
if (!did(peerOwnerDid))
|
|
77
|
+
throw new Error('INTAKE_STORE_INVALID');
|
|
78
|
+
}
|
|
79
|
+
export function validConnectionOffer(o, outgoing) {
|
|
80
|
+
if (!object(o) || !text(o.requestId, 128) || !hash(o.requestDigest) || !time(o.expiresAt))
|
|
81
|
+
return false;
|
|
82
|
+
const start = outgoing ? o.createdAt : o.receivedAt;
|
|
83
|
+
return time(start) && o.expiresAt > start && o.expiresAt - start <= CONNECTION_OFFER_TTL_MS &&
|
|
84
|
+
(outgoing ? hash(o.ownerConsentDigest) &&
|
|
85
|
+
keys(o, ['requestId', 'requestDigest', 'createdAt', 'expiresAt', 'ownerConsentDigest']) :
|
|
86
|
+
keys(o, ['requestId', 'requestDigest', 'receivedAt', 'expiresAt']));
|
|
87
|
+
}
|
|
88
|
+
export function validConnectionOutbox(e, owner) {
|
|
89
|
+
return object(e) && keys(e, ['eventId', 'peerOwnerDid', 'relayUrl', 'signedEvent', 'deliveryDeadline', 'state']) &&
|
|
90
|
+
text(e.eventId, 128) && did(e.peerOwnerDid) && relay(e.relayUrl) && time(e.deliveryDeadline) &&
|
|
91
|
+
['pending', 'delivered'].includes(e.state) && object(e.signedEvent) && verifySigned(e.signedEvent, owner) &&
|
|
92
|
+
Buffer.byteLength(JSON.stringify(e)) <= 8192;
|
|
93
|
+
}
|
|
94
|
+
export function assertConnectionCommit(connectionId, consentDigest) {
|
|
95
|
+
if (!text(connectionId, 128) || !hash(consentDigest))
|
|
96
|
+
throw new Error('INTAKE_STORE_INVALID');
|
|
97
|
+
}
|
|
98
|
+
/** Validate the persisted lifecycle, including uniqueness and explicit connected consent. */
|
|
99
|
+
export function validConnectionData(d, owner) {
|
|
100
|
+
if (!object(d) || !Object.keys(CONNECTION_CAPACITY)
|
|
101
|
+
.every(k => Array.isArray(d[k]) && d[k].length <= CONNECTION_CAPACITY[k]))
|
|
102
|
+
return false;
|
|
103
|
+
const unique = (rows, key) => new Set(rows.map(key)).size === rows.length;
|
|
104
|
+
if (d.connections.some(c => !validConnectionPeer(c) ||
|
|
105
|
+
!keys(c, ['peerOwnerDid', 'peerAgentDid', 'peerDisplayName', 'relayUrl', 'state', 'incoming', 'outgoing', 'connectionId', 'connectedAt', 'source', 'localConsentDigest', 'remoteAcceptanceDigest']) ||
|
|
106
|
+
(c.incoming !== undefined && !validConnectionOffer(c.incoming, false)) ||
|
|
107
|
+
(c.outgoing !== undefined && !validConnectionOffer(c.outgoing, true)) ||
|
|
108
|
+
(c.state === 'pending' ? !(c.incoming || c.outgoing) ||
|
|
109
|
+
['connectionId', 'connectedAt', 'source', 'localConsentDigest', 'remoteAcceptanceDigest'].some(k => Object.hasOwn(c, k)) :
|
|
110
|
+
c.state !== 'connected' || !text(c.connectionId, 128) || !time(c.connectedAt) ||
|
|
111
|
+
!['request', 'invite', 'prior-approval'].includes(c.source) || !hash(c.localConsentDigest) ||
|
|
112
|
+
(c.source !== 'invite' && !(c.incoming || c.outgoing)) ||
|
|
113
|
+
(!c.incoming && c.source !== 'invite' && !hash(c.remoteAcceptanceDigest)) ||
|
|
114
|
+
(c.remoteAcceptanceDigest !== undefined && !hash(c.remoteAcceptanceDigest)))))
|
|
115
|
+
return false;
|
|
116
|
+
if (d.inviteBindings.some(b => !object(b) || !keys(b, ['inviteDigest', 'requesterOwnerDid', 'boundAt', 'tokenExpiresAt', 'connectionId']) ||
|
|
117
|
+
!hash(b.inviteDigest) || !did(b.requesterOwnerDid) || !time(b.boundAt) || !time(b.tokenExpiresAt) ||
|
|
118
|
+
b.tokenExpiresAt <= b.boundAt || !text(b.connectionId, 128)) ||
|
|
119
|
+
d.refusals.some(r => !object(r) || !keys(r, ['peerOwnerDid', 'refuseUntil']) || !did(r.peerOwnerDid) || !time(r.refuseUntil)) ||
|
|
120
|
+
d.priorApprovedPeers.some(p => !object(p) || !keys(p, ['peerOwnerDid', 'peerDisplayName', 'lastApprovedAt', 'sourceRequestIds', 'legacyTrust']) ||
|
|
121
|
+
!did(p.peerOwnerDid) || (p.peerDisplayName !== undefined && (typeof p.peerDisplayName !== 'string' || !p.peerDisplayName)) ||
|
|
122
|
+
(p.lastApprovedAt !== undefined && !time(p.lastApprovedAt)) ||
|
|
123
|
+
!['limited', 'trusted'].includes(p.legacyTrust) || !Array.isArray(p.sourceRequestIds) || p.sourceRequestIds.length > 200 ||
|
|
124
|
+
p.sourceRequestIds.some(id => !text(id, 128)) || new Set(p.sourceRequestIds).size !== p.sourceRequestIds.length) ||
|
|
125
|
+
d.outbox.some(e => !validConnectionOutbox(e, owner)))
|
|
126
|
+
return false;
|
|
127
|
+
return unique(d.connections, c => c.peerOwnerDid) && unique(d.inviteBindings, b => b.inviteDigest) &&
|
|
128
|
+
unique(d.refusals, r => r.peerOwnerDid) && unique(d.priorApprovedPeers, p => p.peerOwnerDid) && unique(d.outbox, e => e.eventId);
|
|
129
|
+
}
|
|
130
|
+
/** Canonical parsed invitations have the same digest for each supported URI encoding. */
|
|
131
|
+
export function connectionInviteDigest(invite) { return digest(invite); }
|
|
132
|
+
//# sourceMappingURL=connection-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-records.js","sourceRoot":"","sources":["../src/connection-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { KeyPair, SignedAgentCard, SignedEnvelope, RevocationList } from '../../core/dist/index.js';
|
|
2
|
+
import type { RelayTransport } from '../../relay/dist/index.js';
|
|
3
|
+
import { ConnectionService } from './connection-service.js';
|
|
4
|
+
import type { ConnectionHumanReviewProvider } from './connection-service.js';
|
|
5
|
+
import { HeldRequestReview } from './held-request-review.js';
|
|
6
|
+
import type { WorkerTrustStore } from './worker-trust-store.js';
|
|
7
|
+
import type { ConnectionRecord } from './connection-records.js';
|
|
8
|
+
export interface ConnectedEvent {
|
|
9
|
+
event: 'connected';
|
|
10
|
+
peerOwnerDid: string;
|
|
11
|
+
peerAgentDid?: string;
|
|
12
|
+
connectionId: string;
|
|
13
|
+
source: ConnectionRecord['source'];
|
|
14
|
+
connectedAt: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ConnectionRouterOptions {
|
|
17
|
+
owner: KeyPair;
|
|
18
|
+
agentCard: SignedAgentCard;
|
|
19
|
+
relayUrl: string;
|
|
20
|
+
relay: RelayTransport;
|
|
21
|
+
store: WorkerTrustStore;
|
|
22
|
+
review: HeldRequestReview;
|
|
23
|
+
now?: () => number;
|
|
24
|
+
humanReview?: ConnectionHumanReviewProvider;
|
|
25
|
+
revocations?: RevocationList;
|
|
26
|
+
allowPrivateRelay?: boolean;
|
|
27
|
+
assertPeer?: (did: string) => void;
|
|
28
|
+
onConnectionEvent?: (event: ConnectedEvent) => void;
|
|
29
|
+
}
|
|
30
|
+
/** Control events are consumed by the existing role reader before task mailbox routing. */
|
|
31
|
+
export declare class ConnectionRouter {
|
|
32
|
+
readonly options: ConnectionRouterOptions;
|
|
33
|
+
readonly service: ConnectionService;
|
|
34
|
+
constructor(options: ConnectionRouterOptions);
|
|
35
|
+
private notify;
|
|
36
|
+
consume(envelope: SignedEnvelope): Promise<boolean>;
|
|
37
|
+
/** Hosts discard terminal control decisions locally and keep their task reader running. */
|
|
38
|
+
route(envelope: SignedEnvelope): Promise<boolean>;
|
|
39
|
+
approve(envelope: SignedEnvelope): Promise<import("./connection-service.js").ConnectionServiceResult>;
|
|
40
|
+
}
|
|
41
|
+
/** Explicit control-only sync. A task at the queue head is left for the task listener. */
|
|
42
|
+
export declare function syncConnections(router: ConnectionRouter, options?: {
|
|
43
|
+
once?: boolean;
|
|
44
|
+
signal?: AbortSignal;
|
|
45
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { digest, isConnectionEvent, openEnvelope } from '../../core/dist/index.js';
|
|
3
|
+
import { waitForRelayRetry } from '../../relay/dist/index.js';
|
|
4
|
+
import { acknowledgeRelay } from './session-audit.js';
|
|
5
|
+
import { ConnectionService } from './connection-service.js';
|
|
6
|
+
import { StoredConnectionExchange } from './connection-persistence.js';
|
|
7
|
+
import { openConnectionFrame } from './connection-transport.js';
|
|
8
|
+
import { heldContentDigest } from './held-request-review.js';
|
|
9
|
+
/** Control events are consumed by the existing role reader before task mailbox routing. */
|
|
10
|
+
export class ConnectionRouter {
|
|
11
|
+
options;
|
|
12
|
+
service;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
const { review, owner } = options;
|
|
16
|
+
const find = (contentDigest) => review.list().find(r => r.kind === 'connection' &&
|
|
17
|
+
digest(openConnectionFrame(review.store.read(r.id).envelope, owner).event) === contentDigest);
|
|
18
|
+
const inspection = {
|
|
19
|
+
async hold(envelope, context) {
|
|
20
|
+
const frame = openConnectionFrame(envelope, owner);
|
|
21
|
+
options.store.consumeAdmission(frame.event.payload.fromOwnerDid, frame.requestId);
|
|
22
|
+
const previous = find(context.contentDigest);
|
|
23
|
+
if (previous)
|
|
24
|
+
return;
|
|
25
|
+
review.hold({ kind: 'connection', senderOwnerDid: frame.event.payload.fromOwnerDid,
|
|
26
|
+
requestId: frame.requestId, contentDigest: heldContentDigest('connection', openEnvelope(envelope, owner)),
|
|
27
|
+
deadline: Date.parse(context.expiresAt), envelope });
|
|
28
|
+
},
|
|
29
|
+
async inspect(contentDigest) {
|
|
30
|
+
const held = find(contentDigest);
|
|
31
|
+
if (!held)
|
|
32
|
+
return { contentDigest, status: 'unavailable' };
|
|
33
|
+
const result = await review.inspect(held.id);
|
|
34
|
+
return { contentDigest, status: result.inspectionStatus === 'complete' ? 'complete' :
|
|
35
|
+
result.inspectionStatus === 'error' ? 'error' : 'unavailable' };
|
|
36
|
+
},
|
|
37
|
+
async discard(contentDigest) { const held = find(contentDigest); if (held)
|
|
38
|
+
review.discard(held.id); },
|
|
39
|
+
};
|
|
40
|
+
this.service = new ConnectionService({ ...options, persistence: new StoredConnectionExchange(options.store),
|
|
41
|
+
inspection, transport: { send: async (url, envelope) => {
|
|
42
|
+
if (url !== options.relayUrl)
|
|
43
|
+
throw new Error('CONNECTION_RELAY_MISMATCH');
|
|
44
|
+
options.assertPeer?.(envelope.payload.recipientDid);
|
|
45
|
+
await options.relay.send(envelope);
|
|
46
|
+
} } });
|
|
47
|
+
}
|
|
48
|
+
notify(before) {
|
|
49
|
+
for (const c of this.options.store.listConnections())
|
|
50
|
+
if ('connectionId' in c && c.state === 'connected' &&
|
|
51
|
+
!before.some(b => 'connectionId' in b && b.connectionId === c.connectionId && b.state === 'connected'))
|
|
52
|
+
this.options.onConnectionEvent?.({ event: 'connected', peerOwnerDid: c.peerOwnerDid,
|
|
53
|
+
...(c.peerAgentDid ? { peerAgentDid: c.peerAgentDid } : {}), connectionId: c.connectionId,
|
|
54
|
+
source: c.source, connectedAt: c.connectedAt });
|
|
55
|
+
}
|
|
56
|
+
async consume(envelope) {
|
|
57
|
+
if (!isConnectionEvent(envelope.payload.eventType))
|
|
58
|
+
return false;
|
|
59
|
+
// Block is silent and creates no held-content entry.
|
|
60
|
+
try {
|
|
61
|
+
this.options.assertPeer?.(envelope.payload.senderDid);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
await acknowledgeRelay(this.options.relay, envelope);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (this.options.store.connectionState(envelope.payload.senderDid) === 'blocked') {
|
|
68
|
+
await acknowledgeRelay(this.options.relay, envelope);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const before = this.options.store.listConnections();
|
|
72
|
+
await this.service.receive(envelope);
|
|
73
|
+
this.notify(before);
|
|
74
|
+
await acknowledgeRelay(this.options.relay, envelope);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/** Hosts discard terminal control decisions locally and keep their task reader running. */
|
|
78
|
+
async route(envelope) {
|
|
79
|
+
try {
|
|
80
|
+
return await this.consume(envelope);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const code = error instanceof Error ? error.message.split(':')[0] : '';
|
|
84
|
+
if (!/^(?:INVALID_CONNECTION_|INVALID_AGENT_CARD$|CONNECTION_NOT_PENDING$|CONNECTION_REQUEST_EXPIRED$|CONNECTION_ALREADY_DECIDED$|CONNECTION_REQUEST_COOLDOWN$|INVITE_EXPIRED$|INVITE_WORKER_MISMATCH$|TOKEN_REVOKED$|INTAKE_RATE_LIMITED$)/.test(code))
|
|
85
|
+
throw error;
|
|
86
|
+
await acknowledgeRelay(this.options.relay, envelope);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async approve(envelope) {
|
|
91
|
+
const before = this.options.store.listConnections();
|
|
92
|
+
const result = await this.service.approve(envelope);
|
|
93
|
+
this.notify(before);
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Explicit control-only sync. A task at the queue head is left for the task listener. */
|
|
98
|
+
export async function syncConnections(router, options = {}) {
|
|
99
|
+
await router.service.flushOutbox();
|
|
100
|
+
try {
|
|
101
|
+
do {
|
|
102
|
+
if (options.signal?.aborted)
|
|
103
|
+
return;
|
|
104
|
+
const relay = router.options.relay, ownerDid = router.options.owner.did;
|
|
105
|
+
// Known offers can receive late acceptance even when a task is at the queue head.
|
|
106
|
+
const taskIds = router.options.store.controlSnapshot().filter(r => r.active &&
|
|
107
|
+
Date.parse(r.offer.expiresAt) > (router.options.now ?? Date.now)()).map(r => 'conn_' + r.offer.requestId);
|
|
108
|
+
const known = taskIds.length ? await relay.receive(ownerDid, 0, options.signal, { taskId: taskIds, lease: true }) : undefined;
|
|
109
|
+
if (known) {
|
|
110
|
+
await router.route(known);
|
|
111
|
+
if (options.once)
|
|
112
|
+
return;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const next = await relay.receive(ownerDid, options.once ? 0 : 1000, options.signal, { role: 'worker', peek: true });
|
|
116
|
+
if (next && isConnectionEvent(next.payload.eventType)) {
|
|
117
|
+
const envelope = await relay.receive(ownerDid, 0, options.signal, { taskId: next.payload.taskId, lease: true });
|
|
118
|
+
if (envelope)
|
|
119
|
+
await router.route(envelope);
|
|
120
|
+
}
|
|
121
|
+
else if (!options.once)
|
|
122
|
+
await waitForRelayRetry(100, options.signal);
|
|
123
|
+
} while (!options.once);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (!options.signal?.aborted)
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=connection-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-router.js","sourceRoot":"","sources":["../src/connection-router.ts"],"names":[],"mappings":"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"}
|