@tinycloudlabs/sdk-core 1.0.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/LICENSE.md +320 -0
- package/dist/TinyCloud.d.ts +206 -0
- package/dist/TinyCloud.d.ts.map +1 -0
- package/dist/TinyCloud.js +244 -0
- package/dist/TinyCloud.js.map +1 -0
- package/dist/TinyCloud.schema.d.ts +173 -0
- package/dist/TinyCloud.schema.d.ts.map +1 -0
- package/dist/TinyCloud.schema.js +136 -0
- package/dist/TinyCloud.schema.js.map +1 -0
- package/dist/TinyCloud.schema.test.d.ts +5 -0
- package/dist/TinyCloud.schema.test.d.ts.map +1 -0
- package/dist/TinyCloud.schema.test.js +286 -0
- package/dist/TinyCloud.schema.test.js.map +1 -0
- package/dist/authorization/CapabilityKeyRegistry.d.ts +317 -0
- package/dist/authorization/CapabilityKeyRegistry.d.ts.map +1 -0
- package/dist/authorization/CapabilityKeyRegistry.js +509 -0
- package/dist/authorization/CapabilityKeyRegistry.js.map +1 -0
- package/dist/authorization/authorization.schema.d.ts +233 -0
- package/dist/authorization/authorization.schema.d.ts.map +1 -0
- package/dist/authorization/authorization.schema.js +220 -0
- package/dist/authorization/authorization.schema.js.map +1 -0
- package/dist/authorization/authorization.schema.test.d.ts +5 -0
- package/dist/authorization/authorization.schema.test.d.ts.map +1 -0
- package/dist/authorization/authorization.schema.test.js +618 -0
- package/dist/authorization/authorization.schema.test.js.map +1 -0
- package/dist/authorization/index.d.ts +38 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +52 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/spaceCreation.d.ts +96 -0
- package/dist/authorization/spaceCreation.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.js +35 -0
- package/dist/authorization/spaceCreation.js.map +1 -0
- package/dist/authorization/spaceCreation.schema.d.ts +67 -0
- package/dist/authorization/spaceCreation.schema.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.schema.js +95 -0
- package/dist/authorization/spaceCreation.schema.js.map +1 -0
- package/dist/authorization/spaceCreation.schema.test.d.ts +5 -0
- package/dist/authorization/spaceCreation.schema.test.d.ts.map +1 -0
- package/dist/authorization/spaceCreation.schema.test.js +168 -0
- package/dist/authorization/spaceCreation.schema.test.js.map +1 -0
- package/dist/authorization/strategies.d.ts +134 -0
- package/dist/authorization/strategies.d.ts.map +1 -0
- package/dist/authorization/strategies.js +15 -0
- package/dist/authorization/strategies.js.map +1 -0
- package/dist/authorization/strategies.schema.d.ts +185 -0
- package/dist/authorization/strategies.schema.d.ts.map +1 -0
- package/dist/authorization/strategies.schema.js +147 -0
- package/dist/authorization/strategies.schema.js.map +1 -0
- package/dist/authorization/strategies.schema.test.d.ts +5 -0
- package/dist/authorization/strategies.schema.test.d.ts.map +1 -0
- package/dist/authorization/strategies.schema.test.js +253 -0
- package/dist/authorization/strategies.schema.test.js.map +1 -0
- package/dist/delegations/DelegationManager.d.ts +164 -0
- package/dist/delegations/DelegationManager.d.ts.map +1 -0
- package/dist/delegations/DelegationManager.js +428 -0
- package/dist/delegations/DelegationManager.js.map +1 -0
- package/dist/delegations/SharingService.d.ts +279 -0
- package/dist/delegations/SharingService.d.ts.map +1 -0
- package/dist/delegations/SharingService.js +558 -0
- package/dist/delegations/SharingService.js.map +1 -0
- package/dist/delegations/SharingService.schema.d.ts +401 -0
- package/dist/delegations/SharingService.schema.d.ts.map +1 -0
- package/dist/delegations/SharingService.schema.js +211 -0
- package/dist/delegations/SharingService.schema.js.map +1 -0
- package/dist/delegations/index.d.ts +38 -0
- package/dist/delegations/index.d.ts.map +1 -0
- package/dist/delegations/index.js +42 -0
- package/dist/delegations/index.js.map +1 -0
- package/dist/delegations/types.d.ts +13 -0
- package/dist/delegations/types.d.ts.map +1 -0
- package/dist/delegations/types.js +42 -0
- package/dist/delegations/types.js.map +1 -0
- package/dist/delegations/types.schema.d.ts +1641 -0
- package/dist/delegations/types.schema.d.ts.map +1 -0
- package/dist/delegations/types.schema.js +535 -0
- package/dist/delegations/types.schema.js.map +1 -0
- package/dist/delegations/types.schema.test.d.ts +5 -0
- package/dist/delegations/types.schema.test.d.ts.map +1 -0
- package/dist/delegations/types.schema.test.js +627 -0
- package/dist/delegations/types.schema.test.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schema.d.ts +327 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +703 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/json-schema.test.d.ts +7 -0
- package/dist/json-schema.test.d.ts.map +1 -0
- package/dist/json-schema.test.js +365 -0
- package/dist/json-schema.test.js.map +1 -0
- package/dist/signer.d.ts +28 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +2 -0
- package/dist/signer.js.map +1 -0
- package/dist/space.d.ts +53 -0
- package/dist/space.d.ts.map +1 -0
- package/dist/space.js +67 -0
- package/dist/space.js.map +1 -0
- package/dist/space.schema.d.ts +65 -0
- package/dist/space.schema.d.ts.map +1 -0
- package/dist/space.schema.js +65 -0
- package/dist/space.schema.js.map +1 -0
- package/dist/space.schema.test.d.ts +5 -0
- package/dist/space.schema.test.d.ts.map +1 -0
- package/dist/space.schema.test.js +148 -0
- package/dist/space.schema.test.js.map +1 -0
- package/dist/spaces/Space.d.ts +175 -0
- package/dist/spaces/Space.d.ts.map +1 -0
- package/dist/spaces/Space.js +84 -0
- package/dist/spaces/Space.js.map +1 -0
- package/dist/spaces/SpaceService.d.ts +271 -0
- package/dist/spaces/SpaceService.d.ts.map +1 -0
- package/dist/spaces/SpaceService.js +715 -0
- package/dist/spaces/SpaceService.js.map +1 -0
- package/dist/spaces/index.d.ts +11 -0
- package/dist/spaces/index.d.ts.map +1 -0
- package/dist/spaces/index.js +20 -0
- package/dist/spaces/index.js.map +1 -0
- package/dist/spaces/spaces.schema.d.ts +421 -0
- package/dist/spaces/spaces.schema.d.ts.map +1 -0
- package/dist/spaces/spaces.schema.js +342 -0
- package/dist/spaces/spaces.schema.js.map +1 -0
- package/dist/spaces/spaces.schema.test.d.ts +5 -0
- package/dist/spaces/spaces.schema.test.d.ts.map +1 -0
- package/dist/spaces/spaces.schema.test.js +471 -0
- package/dist/spaces/spaces.schema.test.js.map +1 -0
- package/dist/storage.d.ts +47 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +14 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.schema.d.ts +277 -0
- package/dist/storage.schema.d.ts.map +1 -0
- package/dist/storage.schema.js +185 -0
- package/dist/storage.schema.js.map +1 -0
- package/dist/storage.schema.test.d.ts +5 -0
- package/dist/storage.schema.test.d.ts.map +1 -0
- package/dist/storage.schema.test.js +346 -0
- package/dist/storage.schema.test.js.map +1 -0
- package/dist/userAuthorization.d.ts +99 -0
- package/dist/userAuthorization.d.ts.map +1 -0
- package/dist/userAuthorization.js +3 -0
- package/dist/userAuthorization.js.map +1 -0
- package/dist/userAuthorization.schema.d.ts +259 -0
- package/dist/userAuthorization.schema.d.ts.map +1 -0
- package/dist/userAuthorization.schema.js +175 -0
- package/dist/userAuthorization.schema.js.map +1 -0
- package/dist/userAuthorization.schema.test.d.ts +5 -0
- package/dist/userAuthorization.schema.test.d.ts.map +1 -0
- package/dist/userAuthorization.schema.test.js +356 -0
- package/dist/userAuthorization.schema.test.js.map +1 -0
- package/dist/version.d.ts +30 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +54 -0
- package/dist/version.js.map +1 -0
- package/dist/wasm-validation.d.ts +287 -0
- package/dist/wasm-validation.d.ts.map +1 -0
- package/dist/wasm-validation.js +219 -0
- package/dist/wasm-validation.js.map +1 -0
- package/dist/wasm-validation.test.d.ts +5 -0
- package/dist/wasm-validation.test.d.ts.map +1 -0
- package/dist/wasm-validation.test.js +233 -0
- package/dist/wasm-validation.test.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SharingService - v2 sharing link service with embedded private keys.
|
|
3
|
+
*
|
|
4
|
+
* This service implements the v2 sharing specification, which embeds private keys
|
|
5
|
+
* directly in sharing links. This allows recipients to exercise delegations
|
|
6
|
+
* without requiring prior session setup.
|
|
7
|
+
*
|
|
8
|
+
* Key differences from v1 SharingLinks:
|
|
9
|
+
* - Private keys are embedded in the link (not just tokens)
|
|
10
|
+
* - Recipients can optionally sub-delegate to their own session key
|
|
11
|
+
* - Pre-configured KV service returned for immediate use
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
import { DelegationErrorCodes } from "./types";
|
|
16
|
+
import { validateEncodedShareData } from "./SharingService.schema.js";
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Default actions for read-only sharing links.
|
|
22
|
+
*/
|
|
23
|
+
const DEFAULT_READ_ACTIONS = ["tinycloud.kv/get", "tinycloud.kv/metadata"];
|
|
24
|
+
/**
|
|
25
|
+
* Default expiry for sharing links (24 hours).
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_EXPIRY_MS = 24 * 60 * 60 * 1000;
|
|
28
|
+
/**
|
|
29
|
+
* Prefix for the base64 schema.
|
|
30
|
+
*/
|
|
31
|
+
const BASE64_PREFIX = "tc1:";
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Helper Functions
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Creates a DelegationError with the given parameters.
|
|
37
|
+
*/
|
|
38
|
+
function createError(code, message, cause, meta) {
|
|
39
|
+
return {
|
|
40
|
+
code,
|
|
41
|
+
message,
|
|
42
|
+
service: "delegation",
|
|
43
|
+
cause,
|
|
44
|
+
meta,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Base64 encode for URLs (URL-safe base64).
|
|
49
|
+
*/
|
|
50
|
+
function base64UrlEncode(data) {
|
|
51
|
+
// Use btoa for browser, Buffer for Node.js
|
|
52
|
+
let base64;
|
|
53
|
+
if (typeof btoa !== "undefined") {
|
|
54
|
+
base64 = btoa(unescape(encodeURIComponent(data)));
|
|
55
|
+
}
|
|
56
|
+
else if (typeof Buffer !== "undefined") {
|
|
57
|
+
base64 = Buffer.from(data, "utf-8").toString("base64");
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error("No base64 encoding available");
|
|
61
|
+
}
|
|
62
|
+
// Make URL-safe
|
|
63
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Base64 decode for URLs (URL-safe base64).
|
|
67
|
+
*/
|
|
68
|
+
function base64UrlDecode(encoded) {
|
|
69
|
+
// Restore standard base64
|
|
70
|
+
let base64 = encoded.replace(/-/g, "+").replace(/_/g, "/");
|
|
71
|
+
// Add padding if needed
|
|
72
|
+
while (base64.length % 4) {
|
|
73
|
+
base64 += "=";
|
|
74
|
+
}
|
|
75
|
+
// Decode
|
|
76
|
+
if (typeof atob !== "undefined") {
|
|
77
|
+
return decodeURIComponent(escape(atob(base64)));
|
|
78
|
+
}
|
|
79
|
+
else if (typeof Buffer !== "undefined") {
|
|
80
|
+
return Buffer.from(base64, "base64").toString("utf-8");
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
throw new Error("No base64 decoding available");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// =============================================================================
|
|
87
|
+
// Implementation
|
|
88
|
+
// =============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* SharingService - v2 sharing link service with embedded private keys.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* import { SharingService } from "@tinycloudlabs/sdk-core/delegations";
|
|
95
|
+
*
|
|
96
|
+
* const sharing = new SharingService({
|
|
97
|
+
* hosts: ["https://node.tinycloud.xyz"],
|
|
98
|
+
* session,
|
|
99
|
+
* invoke,
|
|
100
|
+
* keyProvider,
|
|
101
|
+
* registry,
|
|
102
|
+
* delegationManager,
|
|
103
|
+
* createKVService,
|
|
104
|
+
* baseUrl: "https://share.myapp.com"
|
|
105
|
+
* });
|
|
106
|
+
*
|
|
107
|
+
* // Generate a sharing link
|
|
108
|
+
* const result = await sharing.generate({
|
|
109
|
+
* path: "/kv/documents/report.pdf",
|
|
110
|
+
* actions: ["tinycloud.kv/get"],
|
|
111
|
+
* expiry: new Date("2024-12-31")
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* if (result.ok) {
|
|
115
|
+
* console.log("Share this URL:", result.data.url);
|
|
116
|
+
* }
|
|
117
|
+
*
|
|
118
|
+
* // Receive a sharing link
|
|
119
|
+
* const receiveResult = await sharing.receive(shareUrl);
|
|
120
|
+
* if (receiveResult.ok) {
|
|
121
|
+
* // Use the pre-configured KV service
|
|
122
|
+
* const data = await receiveResult.data.kv.get("report.pdf");
|
|
123
|
+
* }
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export class SharingService {
|
|
127
|
+
/**
|
|
128
|
+
* Creates a new SharingService instance.
|
|
129
|
+
*/
|
|
130
|
+
constructor(config) {
|
|
131
|
+
this.hosts = config.hosts;
|
|
132
|
+
this.session = config.session;
|
|
133
|
+
this.invoke = config.invoke;
|
|
134
|
+
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
135
|
+
this.keyProvider = config.keyProvider;
|
|
136
|
+
this.registry = config.registry;
|
|
137
|
+
this.delegationManager = config.delegationManager;
|
|
138
|
+
this.createKVService = config.createKVService;
|
|
139
|
+
this.baseUrl = (config.baseUrl ?? "").replace(/\/$/, ""); // Remove trailing slash
|
|
140
|
+
this.createDelegationFn = config.createDelegation;
|
|
141
|
+
this.createDelegationWasmFn = config.createDelegationWasm;
|
|
142
|
+
this.pathPrefix = config.pathPrefix ?? "";
|
|
143
|
+
this.sessionExpiry = config.sessionExpiry;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Gets the primary host URL.
|
|
147
|
+
*/
|
|
148
|
+
get host() {
|
|
149
|
+
return this.hosts[0];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Updates the session (e.g., after re-authentication).
|
|
153
|
+
*/
|
|
154
|
+
updateSession(session) {
|
|
155
|
+
this.session = session;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Updates the service configuration.
|
|
159
|
+
* Used to add full capabilities (session, delegationManager, createDelegation, createDelegationWasm) after signIn.
|
|
160
|
+
*/
|
|
161
|
+
updateConfig(config) {
|
|
162
|
+
if (config.session !== undefined) {
|
|
163
|
+
this.session = config.session;
|
|
164
|
+
}
|
|
165
|
+
if (config.delegationManager !== undefined) {
|
|
166
|
+
this.delegationManager = config.delegationManager;
|
|
167
|
+
}
|
|
168
|
+
if (config.createDelegation !== undefined) {
|
|
169
|
+
this.createDelegationFn = config.createDelegation;
|
|
170
|
+
}
|
|
171
|
+
if (config.createDelegationWasm !== undefined) {
|
|
172
|
+
this.createDelegationWasmFn = config.createDelegationWasm;
|
|
173
|
+
}
|
|
174
|
+
if (config.sessionExpiry !== undefined) {
|
|
175
|
+
this.sessionExpiry = config.sessionExpiry;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Generate a sharing link with an embedded private key.
|
|
180
|
+
*
|
|
181
|
+
* Flow:
|
|
182
|
+
* 1. Spawn new session key (unique per share)
|
|
183
|
+
* 2. Create delegation from current session to spawned key
|
|
184
|
+
* 3. Package: { key (with private!), delegation, path, host }
|
|
185
|
+
* 4. Encode based on schema (base64 for now)
|
|
186
|
+
* 5. Return link string
|
|
187
|
+
*/
|
|
188
|
+
async generate(params) {
|
|
189
|
+
// Require session for generating (not for receiving)
|
|
190
|
+
if (!this.session) {
|
|
191
|
+
return {
|
|
192
|
+
ok: false,
|
|
193
|
+
error: createError(DelegationErrorCodes.NOT_INITIALIZED, "Session required for generating sharing links. Call signIn() first."),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// Require delegation capability
|
|
197
|
+
if (!this.createDelegationWasmFn && !this.createDelegationFn && !this.delegationManager) {
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
error: createError(DelegationErrorCodes.NOT_INITIALIZED, "DelegationManager, createDelegation, or createDelegationWasm function required for generating sharing links."),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Validate path
|
|
204
|
+
if (!params.path) {
|
|
205
|
+
return {
|
|
206
|
+
ok: false,
|
|
207
|
+
error: createError(DelegationErrorCodes.INVALID_INPUT, "path is required"),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const actions = params.actions ?? DEFAULT_READ_ACTIONS;
|
|
211
|
+
const requestedExpiry = params.expiry ?? new Date(Date.now() + DEFAULT_EXPIRY_MS);
|
|
212
|
+
// Clamp expiry to session expiry if set
|
|
213
|
+
const expiry = this.sessionExpiry && requestedExpiry > this.sessionExpiry
|
|
214
|
+
? this.sessionExpiry
|
|
215
|
+
: requestedExpiry;
|
|
216
|
+
const schema = params.schema ?? "base64";
|
|
217
|
+
// Build full path with prefix (matches how KVService stores data)
|
|
218
|
+
// If pathPrefix is "demo-app" and path is "hello", fullPath is "demo-app/hello"
|
|
219
|
+
const fullPath = this.pathPrefix
|
|
220
|
+
? `${this.pathPrefix}/${params.path}`.replace(/\/+/g, "/") // Normalize slashes
|
|
221
|
+
: params.path;
|
|
222
|
+
// Only base64 schema is implemented in v1
|
|
223
|
+
if (schema !== "base64") {
|
|
224
|
+
return {
|
|
225
|
+
ok: false,
|
|
226
|
+
error: createError(DelegationErrorCodes.INVALID_INPUT, `Schema '${schema}' not implemented. Only 'base64' is supported.`),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// Step 1: Spawn a new session key unique to this share
|
|
230
|
+
let keyId;
|
|
231
|
+
let keyDid;
|
|
232
|
+
let keyJwk;
|
|
233
|
+
try {
|
|
234
|
+
const shareKeyName = `share:${Date.now()}:${Math.random().toString(36).substring(2, 10)}`;
|
|
235
|
+
keyId = await this.keyProvider.createSessionKey(shareKeyName);
|
|
236
|
+
keyDid = await this.keyProvider.getDID(keyId);
|
|
237
|
+
keyJwk = this.keyProvider.getJWK(keyId);
|
|
238
|
+
// Ensure the private key is included
|
|
239
|
+
if (!keyJwk.d) {
|
|
240
|
+
return {
|
|
241
|
+
ok: false,
|
|
242
|
+
error: createError(DelegationErrorCodes.CREATION_FAILED, "KeyProvider did not return private key (d parameter) in JWK"),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
return {
|
|
248
|
+
ok: false,
|
|
249
|
+
error: createError(DelegationErrorCodes.CREATION_FAILED, `Failed to generate session key for share: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// Step 2: Create delegation from current session to spawned key
|
|
253
|
+
// Prefer client-side WASM creation, fall back to server-side
|
|
254
|
+
let delegation;
|
|
255
|
+
if (this.createDelegationWasmFn) {
|
|
256
|
+
// Client-side delegation creation via WASM
|
|
257
|
+
try {
|
|
258
|
+
// Strip fragment from DID URL to get plain DID for UCAN audience
|
|
259
|
+
// getDID() returns "did:key:z6Mk...#z6Mk..." but audience needs "did:key:z6Mk..."
|
|
260
|
+
const plainDID = keyDid.split('#')[0];
|
|
261
|
+
const wasmResult = this.createDelegationWasmFn({
|
|
262
|
+
session: this.session,
|
|
263
|
+
delegateDID: plainDID,
|
|
264
|
+
spaceId: this.session.spaceId,
|
|
265
|
+
path: fullPath,
|
|
266
|
+
actions,
|
|
267
|
+
expirationSecs: Math.floor(expiry.getTime() / 1000),
|
|
268
|
+
});
|
|
269
|
+
// Register the delegation with the server
|
|
270
|
+
// The server needs to know about this delegation for proof chain validation
|
|
271
|
+
const registerRes = await this.fetchFn(`${this.host}/delegate`, {
|
|
272
|
+
method: "POST",
|
|
273
|
+
headers: {
|
|
274
|
+
Authorization: wasmResult.delegation, // The UCAN JWT
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
if (!registerRes.ok) {
|
|
278
|
+
const errorText = await registerRes.text();
|
|
279
|
+
return {
|
|
280
|
+
ok: false,
|
|
281
|
+
error: createError(DelegationErrorCodes.CREATION_FAILED, `Failed to register delegation with server: ${registerRes.status} ${errorText}`),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
delegation = {
|
|
285
|
+
cid: wasmResult.cid,
|
|
286
|
+
delegateDID: wasmResult.delegateDID,
|
|
287
|
+
spaceId: this.session.spaceId,
|
|
288
|
+
path: wasmResult.path,
|
|
289
|
+
actions: wasmResult.actions,
|
|
290
|
+
expiry: wasmResult.expiry,
|
|
291
|
+
isRevoked: false,
|
|
292
|
+
authHeader: wasmResult.delegation, // The UCAN JWT (no Bearer prefix - SDK adds it internally)
|
|
293
|
+
allowSubDelegation: true,
|
|
294
|
+
createdAt: new Date(),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
return {
|
|
299
|
+
ok: false,
|
|
300
|
+
error: createError(DelegationErrorCodes.CREATION_FAILED, `Failed to create delegation via WASM: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
// Server-side delegation creation (fallback)
|
|
306
|
+
const delegationParams = {
|
|
307
|
+
delegateDID: keyDid,
|
|
308
|
+
path: fullPath,
|
|
309
|
+
actions,
|
|
310
|
+
expiry,
|
|
311
|
+
statement: params.description ?? `Share access for ${params.path}`,
|
|
312
|
+
disableSubDelegation: false, // Allow sub-delegation for auto-subdelegate flow
|
|
313
|
+
};
|
|
314
|
+
const delegationResult = this.createDelegationFn
|
|
315
|
+
? await this.createDelegationFn(delegationParams)
|
|
316
|
+
// delegationManager is guaranteed to exist by the guard check above
|
|
317
|
+
: await this.delegationManager.create(delegationParams);
|
|
318
|
+
if (!delegationResult.ok) {
|
|
319
|
+
return {
|
|
320
|
+
ok: false,
|
|
321
|
+
error: createError(DelegationErrorCodes.CREATION_FAILED, `Failed to create delegation for share: ${delegationResult.error.message}`, delegationResult.error.cause, delegationResult.error.meta),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
delegation = delegationResult.data;
|
|
325
|
+
}
|
|
326
|
+
// Step 3: Package the share data
|
|
327
|
+
const shareData = {
|
|
328
|
+
key: keyJwk,
|
|
329
|
+
keyDid,
|
|
330
|
+
delegation,
|
|
331
|
+
path: fullPath,
|
|
332
|
+
host: this.host,
|
|
333
|
+
spaceId: this.session.spaceId,
|
|
334
|
+
version: 1,
|
|
335
|
+
};
|
|
336
|
+
// Step 4: Encode the link
|
|
337
|
+
const encodedData = this.encodeLink(shareData, schema);
|
|
338
|
+
// Step 5: Build the full URL
|
|
339
|
+
const baseUrl = params.baseUrl ?? this.baseUrl;
|
|
340
|
+
const url = baseUrl ? `${baseUrl}/share/${encodedData}` : encodedData;
|
|
341
|
+
const shareLink = {
|
|
342
|
+
token: encodedData,
|
|
343
|
+
url,
|
|
344
|
+
delegation,
|
|
345
|
+
schema,
|
|
346
|
+
expiresAt: expiry,
|
|
347
|
+
description: params.description,
|
|
348
|
+
};
|
|
349
|
+
return { ok: true, data: shareLink };
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Receive and activate a sharing link.
|
|
353
|
+
*
|
|
354
|
+
* Flow:
|
|
355
|
+
* 1. Decode link -> extract { key, delegation, path, host }
|
|
356
|
+
* 2. Ingest key into CapabilityKeyRegistry
|
|
357
|
+
* 3. If autoSubdelegate (default true) + useSessionKey:
|
|
358
|
+
* - Create sub-delegation from ingested key -> current session
|
|
359
|
+
* - Register sub-delegation capabilities
|
|
360
|
+
* 4. Return ShareAccess with pre-configured KV service
|
|
361
|
+
*/
|
|
362
|
+
async receive(link, options = {}) {
|
|
363
|
+
const { autoSubdelegate = true, useSessionKey = true, ingestOptions, } = options;
|
|
364
|
+
// Step 1: Decode and validate the link
|
|
365
|
+
const decodeResult = this.decodeLinkWithValidation(link);
|
|
366
|
+
if (!decodeResult.ok) {
|
|
367
|
+
return decodeResult;
|
|
368
|
+
}
|
|
369
|
+
const shareData = decodeResult.data;
|
|
370
|
+
// Schema validation ensures key.d and delegation exist, but we need
|
|
371
|
+
// to check business rules (expiry, revocation) separately
|
|
372
|
+
// Check delegation expiry
|
|
373
|
+
const delegationExpiry = new Date(shareData.delegation.expiry);
|
|
374
|
+
if (delegationExpiry < new Date()) {
|
|
375
|
+
return {
|
|
376
|
+
ok: false,
|
|
377
|
+
error: createError(DelegationErrorCodes.AUTH_EXPIRED, "Sharing link has expired"),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// Check delegation revocation
|
|
381
|
+
if (shareData.delegation.isRevoked) {
|
|
382
|
+
return {
|
|
383
|
+
ok: false,
|
|
384
|
+
error: createError(DelegationErrorCodes.REVOKED, "Sharing link has been revoked"),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Step 2: Create KeyInfo and ingest into registry
|
|
388
|
+
const keyInfo = {
|
|
389
|
+
id: `ingested:${shareData.keyDid}`,
|
|
390
|
+
did: shareData.keyDid,
|
|
391
|
+
type: "ingested",
|
|
392
|
+
jwk: shareData.key,
|
|
393
|
+
priority: 2, // Ingested keys have lowest priority
|
|
394
|
+
};
|
|
395
|
+
this.registry.ingestKey(keyInfo, shareData.delegation, ingestOptions);
|
|
396
|
+
// The delegation and key to use for operations
|
|
397
|
+
let activeDelegation = shareData.delegation;
|
|
398
|
+
let activeKey = keyInfo;
|
|
399
|
+
// Step 3: Auto-subdelegate if requested
|
|
400
|
+
if (autoSubdelegate && useSessionKey && this.session) {
|
|
401
|
+
try {
|
|
402
|
+
// Get current session key DID
|
|
403
|
+
// Note: We need to create a sub-delegation from the ingested key to the session key
|
|
404
|
+
// This requires the session key DID, which should be available from the session
|
|
405
|
+
// For now, we'll register the ingested key's capabilities directly
|
|
406
|
+
// The auto-subdelegation would require additional infrastructure to sign with the ingested key
|
|
407
|
+
// This is a simplification - full implementation would sign a new delegation with the ingested key
|
|
408
|
+
// TODO: Implement full auto-subdelegation when signing infrastructure is available
|
|
409
|
+
// For now, the ingested key can be used directly via the registry
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
// Log but don't fail - can still use the ingested key directly
|
|
413
|
+
console.warn("Auto-subdelegation failed, using ingested key directly:", err);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// Step 4: Create pre-configured KV service for the shared path
|
|
417
|
+
// Construct session from share data - no need for existing session
|
|
418
|
+
// Use the authHeader if available, otherwise fall back to constructing from CID
|
|
419
|
+
const authHeader = shareData.delegation.authHeader ?? `Bearer ${shareData.delegation.cid}`;
|
|
420
|
+
const shareSession = {
|
|
421
|
+
delegationHeader: { Authorization: authHeader },
|
|
422
|
+
delegationCid: shareData.delegation.cid,
|
|
423
|
+
spaceId: shareData.spaceId,
|
|
424
|
+
verificationMethod: shareData.keyDid,
|
|
425
|
+
jwk: shareData.key,
|
|
426
|
+
};
|
|
427
|
+
const kvService = this.createKVService({
|
|
428
|
+
hosts: [shareData.host],
|
|
429
|
+
session: shareSession,
|
|
430
|
+
invoke: this.invoke,
|
|
431
|
+
fetch: this.fetchFn,
|
|
432
|
+
pathPrefix: shareData.path,
|
|
433
|
+
});
|
|
434
|
+
const shareAccess = {
|
|
435
|
+
delegation: activeDelegation,
|
|
436
|
+
key: activeKey,
|
|
437
|
+
kv: kvService,
|
|
438
|
+
spaceId: shareData.spaceId,
|
|
439
|
+
path: shareData.path,
|
|
440
|
+
};
|
|
441
|
+
return { ok: true, data: shareAccess };
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Encode sharing data into a link string.
|
|
445
|
+
*
|
|
446
|
+
* @param data - The share data to encode
|
|
447
|
+
* @param schema - The encoding schema (default: "base64")
|
|
448
|
+
* @returns Encoded link string
|
|
449
|
+
*/
|
|
450
|
+
encodeLink(data, schema = "base64") {
|
|
451
|
+
if (schema !== "base64") {
|
|
452
|
+
throw new Error(`Schema '${schema}' not implemented. Only 'base64' is supported.`);
|
|
453
|
+
}
|
|
454
|
+
const jsonString = JSON.stringify(data);
|
|
455
|
+
const encoded = base64UrlEncode(jsonString);
|
|
456
|
+
return `${BASE64_PREFIX}${encoded}`;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Decode a link string into sharing data.
|
|
460
|
+
*
|
|
461
|
+
* @param link - The encoded link string (may include URL prefix)
|
|
462
|
+
* @returns Decoded share data
|
|
463
|
+
* @throws Error if link format is invalid or data fails validation
|
|
464
|
+
*/
|
|
465
|
+
decodeLink(link) {
|
|
466
|
+
const result = this.decodeLinkWithValidation(link);
|
|
467
|
+
if (!result.ok) {
|
|
468
|
+
throw new Error(result.error.message);
|
|
469
|
+
}
|
|
470
|
+
return result.data;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Decode and validate a link string into sharing data.
|
|
474
|
+
*
|
|
475
|
+
* Internal method that returns a Result instead of throwing.
|
|
476
|
+
* Used by receive() for proper error handling.
|
|
477
|
+
*
|
|
478
|
+
* @param link - The encoded link string (may include URL prefix)
|
|
479
|
+
* @returns Result with decoded share data or validation error
|
|
480
|
+
*/
|
|
481
|
+
decodeLinkWithValidation(link) {
|
|
482
|
+
// Extract the encoded data from the link
|
|
483
|
+
let encoded = link;
|
|
484
|
+
// Handle full URL format: https://share.example.com/share/tc1:...
|
|
485
|
+
if (link.includes("/share/")) {
|
|
486
|
+
const parts = link.split("/share/");
|
|
487
|
+
encoded = parts[parts.length - 1];
|
|
488
|
+
}
|
|
489
|
+
// Handle query parameter format: ?share=tc1:...
|
|
490
|
+
if (link.includes("?share=")) {
|
|
491
|
+
try {
|
|
492
|
+
const url = new URL(link);
|
|
493
|
+
encoded = url.searchParams.get("share") ?? encoded;
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
return {
|
|
497
|
+
ok: false,
|
|
498
|
+
error: createError(DelegationErrorCodes.INVALID_TOKEN, "Invalid URL format in sharing link"),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Remove the schema prefix
|
|
503
|
+
if (!encoded.startsWith(BASE64_PREFIX)) {
|
|
504
|
+
return {
|
|
505
|
+
ok: false,
|
|
506
|
+
error: createError(DelegationErrorCodes.INVALID_TOKEN, `Invalid sharing link format. Expected prefix '${BASE64_PREFIX}'`),
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
const base64Data = encoded.slice(BASE64_PREFIX.length);
|
|
510
|
+
let jsonString;
|
|
511
|
+
try {
|
|
512
|
+
jsonString = base64UrlDecode(base64Data);
|
|
513
|
+
}
|
|
514
|
+
catch (err) {
|
|
515
|
+
return {
|
|
516
|
+
ok: false,
|
|
517
|
+
error: createError(DelegationErrorCodes.INVALID_TOKEN, `Failed to decode base64 data: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined),
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
let parsed;
|
|
521
|
+
try {
|
|
522
|
+
parsed = JSON.parse(jsonString);
|
|
523
|
+
}
|
|
524
|
+
catch (err) {
|
|
525
|
+
return {
|
|
526
|
+
ok: false,
|
|
527
|
+
error: createError(DelegationErrorCodes.INVALID_TOKEN, `Failed to parse share data JSON: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined),
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
// Convert delegation expiry to Date before validation if it's a string
|
|
531
|
+
// This is needed because JSON.parse doesn't restore Date objects
|
|
532
|
+
if (parsed &&
|
|
533
|
+
typeof parsed === "object" &&
|
|
534
|
+
"delegation" in parsed &&
|
|
535
|
+
parsed.delegation &&
|
|
536
|
+
typeof parsed.delegation === "object" &&
|
|
537
|
+
"expiry" in parsed.delegation &&
|
|
538
|
+
typeof parsed.delegation.expiry === "string") {
|
|
539
|
+
parsed.delegation.expiry = new Date(parsed.delegation.expiry);
|
|
540
|
+
}
|
|
541
|
+
// Validate against schema
|
|
542
|
+
const validationResult = validateEncodedShareData(parsed);
|
|
543
|
+
if (!validationResult.ok) {
|
|
544
|
+
return {
|
|
545
|
+
ok: false,
|
|
546
|
+
error: createError(DelegationErrorCodes.INVALID_TOKEN, validationResult.error.message, undefined, validationResult.error.meta),
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
return { ok: true, data: validationResult.data };
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Create a new SharingService instance.
|
|
554
|
+
*/
|
|
555
|
+
export function createSharingService(config) {
|
|
556
|
+
return new SharingService(config);
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=SharingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharingService.js","sourceRoot":"","sources":["../../src/delegations/SharingService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;GAEG;AACH,SAAS,WAAW,CAClB,IAAY,EACZ,OAAe,EACf,KAAa,EACb,IAA8B;IAE9B,OAAO;QACL,IAAI;QACJ,OAAO;QACP,OAAO,EAAE,YAAY;QACrB,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,2CAA2C;IAC3C,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,gBAAgB;IAChB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,0BAA0B;IAC1B,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,wBAAwB;IACxB,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC;IAChB,CAAC;IACD,SAAS;IACT,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAwJD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,OAAO,cAAc;IAezB;;OAEG;IACH,YAAY,MAA4B;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAClF,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC1D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAY,IAAI;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,OAAuB;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,MAA4I;QAC9J,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC3C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,CAAC,MAA2B;QACxC,qDAAqD;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,qEAAqE,CACtE;aACF,CAAC;QACJ,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxF,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,8GAA8G,CAC/G;aACF,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,kBAAkB,CACnB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,oBAAoB,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC,CAAC;QAClF,wCAAwC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,eAAe,GAAG,IAAI,CAAC,aAAa;YACvE,CAAC,CAAC,IAAI,CAAC,aAAa;YACpB,CAAC,CAAC,eAAe,CAAC;QACpB,MAAM,MAAM,GAAgB,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;QAEtD,kEAAkE;QAClE,gFAAgF;QAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;YAC9B,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,oBAAoB;YAC/E,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAEhB,0CAA0C;QAC1C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,WAAW,MAAM,gDAAgD,CAClE;aACF,CAAC;QACJ,CAAC;QAED,uDAAuD;QACvD,IAAI,KAAa,CAAC;QAClB,IAAI,MAAc,CAAC;QACnB,IAAI,MAAW,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1F,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAQ,CAAC;YAE/C,qCAAqC;YACrC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACd,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,6DAA6D,CAC9D;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC/F,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC;aACF,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,6DAA6D;QAC7D,IAAI,UAAsB,CAAC;QAE3B,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,2CAA2C;YAC3C,IAAI,CAAC;gBACH,iEAAiE;gBACjE,kFAAkF;gBAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC;oBAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,QAAQ;oBACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;oBAC7B,IAAI,EAAE,QAAQ;oBACd,OAAO;oBACP,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;iBACpD,CAAC,CAAC;gBAEH,0CAA0C;gBAC1C,4EAA4E;gBAC5E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,WAAW,EAAE;oBAC9D,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,eAAe;qBACtD;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;oBAC3C,OAAO;wBACL,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,8CAA8C,WAAW,CAAC,MAAM,IAAI,SAAS,EAAE,CAChF;qBACF,CAAC;gBACJ,CAAC;gBAED,UAAU,GAAG;oBACX,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;oBAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,KAAK;oBAChB,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,2DAA2D;oBAC9F,kBAAkB,EAAE,IAAI;oBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,yCAAyC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3F,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,MAAM,gBAAgB,GAA2B;gBAC/C,WAAW,EAAE,MAAM;gBACnB,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,MAAM;gBACN,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,oBAAoB,MAAM,CAAC,IAAI,EAAE;gBAClE,oBAAoB,EAAE,KAAK,EAAE,iDAAiD;aAC/E,CAAC;YAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB;gBAC9C,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;gBACjD,oEAAoE;gBACpE,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAkB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAE3D,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBACzB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,eAAe,EACpC,0CAA0C,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,EAC1E,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAC5B,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAC5B;iBACF,CAAC;YACJ,CAAC;YAED,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC;QACrC,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAqB;YAClC,GAAG,EAAE,MAAM;YACX,MAAM;YACN,UAAU;YACV,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,OAAO,EAAE,CAAC;SACX,CAAC;QAEF,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEvD,6BAA6B;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAEtE,MAAM,SAAS,GAAc;YAC3B,KAAK,EAAE,WAAW;YAClB,GAAG;YACH,UAAU;YACV,MAAM;YACN,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACvC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,UAA0B,EAAE;QAE5B,MAAM,EACJ,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,IAAI,EACpB,aAAa,GACd,GAAG,OAAO,CAAC;QAEZ,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC;QAEpC,oEAAoE;QACpE,0DAA0D;QAE1D,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,gBAAgB,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAClC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,YAAY,EACjC,0BAA0B,CAC3B;aACF,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,OAAO,EAC5B,+BAA+B,CAChC;aACF,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,YAAY,SAAS,CAAC,MAAM,EAAE;YAClC,GAAG,EAAE,SAAS,CAAC,MAAM;YACrB,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,QAAQ,EAAE,CAAC,EAAE,qCAAqC;SACnD,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAEtE,+CAA+C;QAC/C,IAAI,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;QAC5C,IAAI,SAAS,GAAG,OAAO,CAAC;QAExB,wCAAwC;QACxC,IAAI,eAAe,IAAI,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,oFAAoF;gBACpF,gFAAgF;gBAEhF,mEAAmE;gBACnE,+FAA+F;gBAC/F,mGAAmG;gBAEnG,mFAAmF;gBACnF,kEAAkE;YAEpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,+DAA+D;gBAC/D,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,mEAAmE;QACnE,gFAAgF;QAChF,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC3F,MAAM,YAAY,GAAmB;YACnC,gBAAgB,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE;YAC/C,aAAa,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG;YACvC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,kBAAkB,EAAE,SAAS,CAAC,MAAM;YACpC,GAAG,EAAE,SAAS,CAAC,GAAG;SACnB,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;YACrC,KAAK,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,UAAU,EAAE,SAAS,CAAC,IAAI;SAC3B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAgB;YAC/B,UAAU,EAAE,gBAAgB;YAC5B,GAAG,EAAE,SAAS;YACd,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,IAAsB,EAAE,SAAsB,QAAQ;QAC/D,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,gDAAgD,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,GAAG,aAAa,GAAG,OAAO,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED;;;;;;;;OAQG;IACK,wBAAwB,CAAC,IAAY;QAC3C,yCAAyC;QACzC,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,kEAAkE;QAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACpC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,oCAAoC,CACrC;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,iDAAiD,aAAa,GAAG,CAClE;aACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACnF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC;aACF,CAAC;QACJ,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC;aACF,CAAC;QACJ,CAAC;QAED,uEAAuE;QACvE,iEAAiE;QACjE,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,YAAY,IAAI,MAAM;YACtB,MAAM,CAAC,UAAU;YACjB,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACrC,QAAQ,IAAI,MAAM,CAAC,UAAU;YAC7B,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,QAAQ,EAC5C,CAAC;YACA,MAAM,CAAC,UAA+B,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC;QAED,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;YACzB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,WAAW,CAChB,oBAAoB,CAAC,aAAa,EAClC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAC9B,SAAS,EACT,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAC5B;aACF,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|