@keyneom/sync-kit 0.2.0-rc.0 → 0.2.0-rc.1
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.md +15 -11
- package/dist/auth/google-web/cache.d.ts +46 -0
- package/dist/auth/google-web/cache.d.ts.map +1 -0
- package/dist/auth/google-web/cache.js +111 -0
- package/dist/auth/google-web/cache.js.map +1 -0
- package/dist/sharing/change-detector.d.ts +40 -0
- package/dist/sharing/change-detector.d.ts.map +1 -0
- package/dist/sharing/change-detector.js +96 -0
- package/dist/sharing/change-detector.js.map +1 -0
- package/dist/sharing/checkpoint.d.ts +32 -0
- package/dist/sharing/checkpoint.d.ts.map +1 -0
- package/dist/sharing/checkpoint.js +2 -0
- package/dist/sharing/checkpoint.js.map +1 -0
- package/dist/sharing/controller.d.ts +30 -0
- package/dist/sharing/controller.d.ts.map +1 -1
- package/dist/sharing/controller.js +145 -1
- package/dist/sharing/controller.js.map +1 -1
- package/dist/sharing/index.d.ts +4 -1
- package/dist/sharing/index.d.ts.map +1 -1
- package/dist/sharing/index.js +2 -0
- package/dist/sharing/index.js.map +1 -1
- package/dist/sharing/join.d.ts +56 -0
- package/dist/sharing/join.d.ts.map +1 -0
- package/dist/sharing/join.js +153 -0
- package/dist/sharing/join.js.map +1 -0
- package/dist/sharing/lifecycle.d.ts +20 -0
- package/dist/sharing/lifecycle.d.ts.map +1 -0
- package/dist/sharing/lifecycle.js +55 -0
- package/dist/sharing/lifecycle.js.map +1 -0
- package/dist/sharing/registry-indexeddb.d.ts +21 -0
- package/dist/sharing/registry-indexeddb.d.ts.map +1 -0
- package/dist/sharing/registry-indexeddb.js +60 -0
- package/dist/sharing/registry-indexeddb.js.map +1 -0
- package/dist/sharing/transport.d.ts +10 -0
- package/dist/sharing/transport.d.ts.map +1 -1
- package/dist/stores/google-drive/app-folders.d.ts +19 -0
- package/dist/stores/google-drive/app-folders.d.ts.map +1 -0
- package/dist/stores/google-drive/app-folders.js +38 -0
- package/dist/stores/google-drive/app-folders.js.map +1 -0
- package/dist/stores/google-drive/folder-name.d.ts +16 -0
- package/dist/stores/google-drive/folder-name.d.ts.map +1 -0
- package/dist/stores/google-drive/folder-name.js +37 -0
- package/dist/stores/google-drive/folder-name.js.map +1 -0
- package/dist/stores/google-drive/index.d.ts +2 -0
- package/dist/stores/google-drive/index.d.ts.map +1 -1
- package/dist/stores/google-drive/index.js +2 -0
- package/dist/stores/google-drive/index.js.map +1 -1
- package/dist/stores/google-drive/sharing.d.ts +3 -1
- package/dist/stores/google-drive/sharing.d.ts.map +1 -1
- package/dist/stores/google-drive/sharing.js +30 -0
- package/dist/stores/google-drive/sharing.js.map +1 -1
- package/package.json +13 -2
package/README.md
CHANGED
|
@@ -36,9 +36,9 @@ Version `0.1.1` was published to npm on 2026-06-30. It removes the
|
|
|
36
36
|
application-specific runtime presets from `0.1.0` and keeps compatibility
|
|
37
37
|
profiles consumer-owned.
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
external consumer integration.
|
|
39
|
+
Version `0.2.0-rc.1` publishes shared encrypted backups, Tier A background
|
|
40
|
+
detection helpers, and the Android sharing port. Live Google validation and
|
|
41
|
+
one external consumer integration remain release gates for a stable `0.2.0`.
|
|
42
42
|
|
|
43
43
|
The tests in this repository cover frozen compatibility vectors, mocked
|
|
44
44
|
browser providers, package orchestration, and installation/imports from the
|
|
@@ -115,11 +115,12 @@ Available exports:
|
|
|
115
115
|
- `/snapshot` — serialized snapshot synchronization
|
|
116
116
|
- `/snapshot/lifecycle` — opt-in browser lifecycle binding
|
|
117
117
|
- `/sharing` — browser-independent shared-backup protocol types, validation,
|
|
118
|
-
roles, invitations,
|
|
118
|
+
roles, invitations, signed multi-recipient envelopes, and join-link helpers
|
|
119
119
|
- `/sharing/web-crypto` — P-256 identities, ECDH key grants, signed revisions,
|
|
120
120
|
invitation/key-response proofs, and decryption
|
|
121
121
|
- `/sharing/controller` — headless multi-dataset orchestration, owner pinning,
|
|
122
|
-
serialized writes, exchange processing, roles,
|
|
122
|
+
serialized writes, exchange processing, roles, revocation, Drive permission
|
|
123
|
+
reconciliation, and optional IndexedDB registry persistence
|
|
123
124
|
- `/sharing/web-passkey` — passkey-encrypted sharing identities with
|
|
124
125
|
non-extractable runtime keys and optional IndexedDB ciphertext storage
|
|
125
126
|
- `/sharing/account-binding` — backendless Google ID-token and WebAuthn
|
|
@@ -131,7 +132,8 @@ Available exports:
|
|
|
131
132
|
- `/auth/google-web/identity` — uncached nonce-bound Google ID tokens for
|
|
132
133
|
account-binding exchanges
|
|
133
134
|
- `/stores/google-drive` — low-level `appDataFolder` objects, a typed snapshot
|
|
134
|
-
wrapper,
|
|
135
|
+
wrapper, normal-Drive folder/per-file stores, folder-name helpers, and
|
|
136
|
+
accessible app-folder discovery
|
|
135
137
|
- `/stores/google-drive/sharing` — managed app/exchange folders, conditional
|
|
136
138
|
dataset writes, provenance checks, and per-dataset permissions
|
|
137
139
|
- `/stores/google-drive/picker` — explicit folder Picker and Drive Open-with
|
|
@@ -182,7 +184,8 @@ not.
|
|
|
182
184
|
- **Android:** `com.keyneom:sync-kit-android` (module `android/synckit`) provides
|
|
183
185
|
private v1 snapshot crypto, `SnapshotSyncController`, Drive `appDataFolder`
|
|
184
186
|
storage, and Credential Manager passkey PRF — the same contracts as the npm
|
|
185
|
-
`/crypto`, `/snapshot`, and appData store paths.
|
|
187
|
+
`/crypto`, `/snapshot`, and appData store paths. Published to
|
|
188
|
+
[GitHub Packages](https://github.com/keyneom/sync-kit/packages). See
|
|
186
189
|
[android-library.md](docs/android-library.md).
|
|
187
190
|
- Shared backups (`/sharing`) are TypeScript-only for now.
|
|
188
191
|
- React Native and other JavaScript-native runtimes can inject a
|
|
@@ -229,10 +232,11 @@ metadata, and ciphertext to app participants while cryptographic grants control
|
|
|
229
232
|
decryption. Applications needing metadata isolation can instead use direct file
|
|
230
233
|
sharing or limited-access subfolders.
|
|
231
234
|
|
|
232
|
-
See the [protocol and threat model](docs/shared-backups.md)
|
|
233
|
-
[authoritative implementation handoff](docs/sharing-implementation-handoff.md)
|
|
234
|
-
|
|
235
|
-
[
|
|
235
|
+
See the [protocol and threat model](docs/shared-backups.md),
|
|
236
|
+
[authoritative implementation handoff](docs/sharing-implementation-handoff.md),
|
|
237
|
+
[consumer responsibilities](docs/consumer-responsibilities.md), and
|
|
238
|
+
[background notifications](docs/background-notifications.md). The phased gates
|
|
239
|
+
remain in the [sharing execution plan](docs/sharing-execution-plan.md). The crypto and
|
|
236
240
|
per-file transport, Picker, protected identity, account binding, signed
|
|
237
241
|
ancestry/fork policy, key rotation, and controller primitives are implemented.
|
|
238
242
|
The same sharing fixture is consumed by Java, and the packed package completes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Authorization, AuthorizationProvider } from "../../core/types.js";
|
|
2
|
+
export type CachedAuthorizationRecord = {
|
|
3
|
+
profileId: string;
|
|
4
|
+
accessToken: string;
|
|
5
|
+
expiresAt: number;
|
|
6
|
+
accountHint?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Opt-in persistence for short-lived Google access tokens used by Tier A
|
|
10
|
+
* background polling. Not enabled by default; memory-only auth remains the
|
|
11
|
+
* default policy.
|
|
12
|
+
*/
|
|
13
|
+
export declare class IndexedDbAuthorizationCache {
|
|
14
|
+
private readonly options;
|
|
15
|
+
constructor(options?: {
|
|
16
|
+
databaseName?: string;
|
|
17
|
+
storeName?: string;
|
|
18
|
+
indexedDB?: IDBFactory;
|
|
19
|
+
});
|
|
20
|
+
load(profileId: string): Promise<CachedAuthorizationRecord | null>;
|
|
21
|
+
save(record: CachedAuthorizationRecord): Promise<void>;
|
|
22
|
+
delete(profileId: string): Promise<void>;
|
|
23
|
+
private transaction;
|
|
24
|
+
private open;
|
|
25
|
+
private storeName;
|
|
26
|
+
}
|
|
27
|
+
export type CachingAuthorizationProviderOptions = {
|
|
28
|
+
profileId: string;
|
|
29
|
+
inner: AuthorizationProvider<Authorization>;
|
|
30
|
+
cache: IndexedDbAuthorizationCache;
|
|
31
|
+
accountHint?: string;
|
|
32
|
+
expirySkewMs?: number;
|
|
33
|
+
now?: () => number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Wraps an authorization provider and mirrors valid access tokens into the
|
|
37
|
+
* opt-in IndexedDB cache for service-worker polling.
|
|
38
|
+
*/
|
|
39
|
+
export declare class CachingAuthorizationProvider implements AuthorizationProvider<Authorization> {
|
|
40
|
+
private readonly options;
|
|
41
|
+
constructor(options: CachingAuthorizationProviderOptions);
|
|
42
|
+
authorize(): Promise<Authorization>;
|
|
43
|
+
authorizeFromCache(): Promise<Authorization | null>;
|
|
44
|
+
clear(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/auth/google-web/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,UAAU,CAAC;KACnB;IAGF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAelE,IAAI,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIhC,WAAW;IAoBzB,OAAO,CAAC,IAAI;IAoCZ,OAAO,CAAC,SAAS;CAGlB;AAED,MAAM,MAAM,mCAAmC,GAAG;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC5C,KAAK,EAAE,2BAA2B,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,qBAAa,4BACX,YAAW,qBAAqB,CAAC,aAAa,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,mCAAmC;IAEnE,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAmBnC,kBAAkB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAezD,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { SyncKitError } from "../../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Opt-in persistence for short-lived Google access tokens used by Tier A
|
|
4
|
+
* background polling. Not enabled by default; memory-only auth remains the
|
|
5
|
+
* default policy.
|
|
6
|
+
*/
|
|
7
|
+
export class IndexedDbAuthorizationCache {
|
|
8
|
+
options;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
async load(profileId) {
|
|
13
|
+
const stored = await this.transaction("readonly", (store) => store.get(profileId));
|
|
14
|
+
if (!stored || typeof stored !== "object")
|
|
15
|
+
return null;
|
|
16
|
+
const record = stored;
|
|
17
|
+
if (typeof record.accessToken !== "string" ||
|
|
18
|
+
typeof record.expiresAt !== "number") {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return structuredClone(record);
|
|
22
|
+
}
|
|
23
|
+
async save(record) {
|
|
24
|
+
await this.transaction("readwrite", (store) => store.put(structuredClone(record)));
|
|
25
|
+
}
|
|
26
|
+
async delete(profileId) {
|
|
27
|
+
await this.transaction("readwrite", (store) => store.delete(profileId));
|
|
28
|
+
}
|
|
29
|
+
async transaction(mode, operation) {
|
|
30
|
+
const database = await this.open();
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
const transaction = database.transaction(this.storeName(), mode);
|
|
33
|
+
const request = operation(transaction.objectStore(this.storeName()));
|
|
34
|
+
request.onsuccess = () => resolve(request.result);
|
|
35
|
+
request.onerror = () => reject(new SyncKitError("state", "IndexedDB authorization cache failed.", {
|
|
36
|
+
cause: request.error,
|
|
37
|
+
}));
|
|
38
|
+
transaction.oncomplete = () => database.close();
|
|
39
|
+
transaction.onabort = () => database.close();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
open() {
|
|
43
|
+
const indexedDBImplementation = this.options.indexedDB ??
|
|
44
|
+
(typeof indexedDB === "undefined" ? undefined : indexedDB);
|
|
45
|
+
if (!indexedDBImplementation) {
|
|
46
|
+
return Promise.reject(new SyncKitError("configuration", "IndexedDB is required for authorization cache storage."));
|
|
47
|
+
}
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const request = indexedDBImplementation.open(this.options.databaseName ?? "sync-kit-auth-cache", 1);
|
|
50
|
+
request.onupgradeneeded = () => {
|
|
51
|
+
if (!request.result.objectStoreNames.contains(this.storeName())) {
|
|
52
|
+
request.result.createObjectStore(this.storeName(), {
|
|
53
|
+
keyPath: "profileId",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
request.onsuccess = () => resolve(request.result);
|
|
58
|
+
request.onerror = () => reject(new SyncKitError("state", "IndexedDB authorization cache could not be opened.", { cause: request.error }));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
storeName() {
|
|
62
|
+
return this.options.storeName ?? "google-authorization";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wraps an authorization provider and mirrors valid access tokens into the
|
|
67
|
+
* opt-in IndexedDB cache for service-worker polling.
|
|
68
|
+
*/
|
|
69
|
+
export class CachingAuthorizationProvider {
|
|
70
|
+
options;
|
|
71
|
+
constructor(options) {
|
|
72
|
+
this.options = options;
|
|
73
|
+
}
|
|
74
|
+
async authorize() {
|
|
75
|
+
const authorization = await this.options.inner.authorize();
|
|
76
|
+
const now = this.options.now?.() ?? Date.now();
|
|
77
|
+
const skew = this.options.expirySkewMs ?? 60_000;
|
|
78
|
+
const expiresAt = authorization.expiresAt ?? now + 3_600_000;
|
|
79
|
+
if (expiresAt > now + skew) {
|
|
80
|
+
await this.options.cache.save({
|
|
81
|
+
profileId: this.options.profileId,
|
|
82
|
+
accessToken: authorization.accessToken,
|
|
83
|
+
expiresAt,
|
|
84
|
+
...(this.options.accountHint
|
|
85
|
+
? { accountHint: this.options.accountHint }
|
|
86
|
+
: {}),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return authorization;
|
|
90
|
+
}
|
|
91
|
+
async authorizeFromCache() {
|
|
92
|
+
const record = await this.options.cache.load(this.options.profileId);
|
|
93
|
+
if (!record)
|
|
94
|
+
return null;
|
|
95
|
+
const now = this.options.now?.() ?? Date.now();
|
|
96
|
+
const skew = this.options.expirySkewMs ?? 60_000;
|
|
97
|
+
if (record.expiresAt <= now + skew) {
|
|
98
|
+
await this.options.cache.delete(this.options.profileId);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
accessToken: record.accessToken,
|
|
103
|
+
expiresAt: record.expiresAt,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
clear() {
|
|
107
|
+
this.options.inner.clear();
|
|
108
|
+
void this.options.cache.delete(this.options.profileId);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/auth/google-web/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SharingChangeDetectionResult, SharingSyncCheckpoint, SharedDatasetHead } from "./checkpoint.js";
|
|
2
|
+
export type { SharedDatasetHead, SharingChangeDetectionResult, SharingNotificationEvent, SharingSyncCheckpoint, } from "./checkpoint.js";
|
|
3
|
+
export type SharingChangeDetectorOptions = {
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
tokenExpiresAt?: number;
|
|
6
|
+
tokenExpiringSoonMs?: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Metadata-only poll for Tier A notifications. Does not decrypt, sign, or
|
|
10
|
+
* mutate Drive state.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectSharingChanges(listKeyResponses: () => Promise<readonly {
|
|
13
|
+
fileId: string;
|
|
14
|
+
exchangeId: string;
|
|
15
|
+
}[]>, listDatasetHeads: () => Promise<readonly SharedDatasetHead[]>, checkpoint: SharingSyncCheckpoint, options?: SharingChangeDetectorOptions): Promise<SharingChangeDetectionResult>;
|
|
16
|
+
export declare class SharingChangeDetector {
|
|
17
|
+
private readonly options;
|
|
18
|
+
constructor(options: {
|
|
19
|
+
listKeyResponses: () => Promise<readonly {
|
|
20
|
+
fileId: string;
|
|
21
|
+
exchangeId: string;
|
|
22
|
+
}[]>;
|
|
23
|
+
listDatasetHeads: () => Promise<readonly SharedDatasetHead[]>;
|
|
24
|
+
tokenExpiresAt?: () => number | undefined;
|
|
25
|
+
now?: () => Date;
|
|
26
|
+
tokenExpiringSoonMs?: number;
|
|
27
|
+
});
|
|
28
|
+
detect(checkpoint: SharingSyncCheckpoint): Promise<SharingChangeDetectionResult>;
|
|
29
|
+
}
|
|
30
|
+
export declare function createSharingChangeDetectorFromTransport(transport: {
|
|
31
|
+
listExchanges(options?: {
|
|
32
|
+
kind?: "invitation" | "key-response";
|
|
33
|
+
}): Promise<readonly {
|
|
34
|
+
fileId: string;
|
|
35
|
+
exchangeId: string;
|
|
36
|
+
kind: string;
|
|
37
|
+
}[]>;
|
|
38
|
+
listDatasetHeads(): Promise<readonly SharedDatasetHead[]>;
|
|
39
|
+
}, options?: Omit<ConstructorParameters<typeof SharingChangeDetector>[0], "listKeyResponses" | "listDatasetHeads">): SharingChangeDetector;
|
|
40
|
+
//# sourceMappingURL=change-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-detector.d.ts","sourceRoot":"","sources":["../../src/sharing/change-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAE5B,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAWzB,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,OAAO,CAC7B,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAClD,EACD,gBAAgB,EAAE,MAAM,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAC7D,UAAU,EAAE,qBAAqB,EACjC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAuDvC;AAED,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE;QACxB,gBAAgB,EAAE,MAAM,OAAO,CAC7B,SAAS;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAClD,CAAC;QACF,gBAAgB,EAAE,MAAM,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;QAC9D,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;QAC1C,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B;IAGH,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,OAAO,CAAC,4BAA4B,CAAC;CAejF;AAED,wBAAgB,wCAAwC,CACtD,SAAS,EAAE;IACT,aAAa,CAAC,OAAO,CAAC,EAAE;QACtB,IAAI,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC;KACtC,GAAG,OAAO,CACT,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAChE,CAAC;IACF,gBAAgB,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CAC3D,EACD,OAAO,GAAE,IAAI,CACX,qBAAqB,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,EACtD,kBAAkB,GAAG,kBAAkB,CACnC,GACL,qBAAqB,CAYvB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
function datasetHeadSignature(head) {
|
|
2
|
+
return [
|
|
3
|
+
head.etag ?? "",
|
|
4
|
+
head.version ?? "",
|
|
5
|
+
head.headRevisionId ?? "",
|
|
6
|
+
head.modifiedTime ?? "",
|
|
7
|
+
].join("|");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Metadata-only poll for Tier A notifications. Does not decrypt, sign, or
|
|
11
|
+
* mutate Drive state.
|
|
12
|
+
*/
|
|
13
|
+
export async function detectSharingChanges(listKeyResponses, listDatasetHeads, checkpoint, options = {}) {
|
|
14
|
+
const now = options.now ?? (() => new Date());
|
|
15
|
+
const events = [];
|
|
16
|
+
const tokenExpiringSoonMs = options.tokenExpiringSoonMs ?? 5 * 60_000;
|
|
17
|
+
if (options.tokenExpiresAt !== undefined) {
|
|
18
|
+
if (options.tokenExpiresAt <= now().getTime()) {
|
|
19
|
+
events.push({ kind: "token-expired" });
|
|
20
|
+
return {
|
|
21
|
+
checkpoint: { ...checkpoint, lastPollAt: now().toISOString() },
|
|
22
|
+
events,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (options.tokenExpiresAt - now().getTime() <= tokenExpiringSoonMs) {
|
|
26
|
+
events.push({
|
|
27
|
+
kind: "token-expiring-soon",
|
|
28
|
+
expiresAt: new Date(options.tokenExpiresAt).toISOString(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const seenResponses = new Set(checkpoint.lastSeenKeyResponseFileIds ?? []);
|
|
33
|
+
const responses = await listKeyResponses();
|
|
34
|
+
for (const response of responses) {
|
|
35
|
+
if (!seenResponses.has(response.fileId)) {
|
|
36
|
+
events.push({
|
|
37
|
+
kind: "pending-key-response",
|
|
38
|
+
exchangeId: response.exchangeId,
|
|
39
|
+
fileId: response.fileId,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const previousHeads = checkpoint.datasetHeads ?? {};
|
|
44
|
+
const nextHeads = {};
|
|
45
|
+
const heads = await listDatasetHeads();
|
|
46
|
+
for (const head of heads) {
|
|
47
|
+
nextHeads[head.datasetId] = head;
|
|
48
|
+
const previous = previousHeads[head.datasetId];
|
|
49
|
+
if (previous &&
|
|
50
|
+
datasetHeadSignature(previous) !== datasetHeadSignature(head)) {
|
|
51
|
+
events.push({
|
|
52
|
+
kind: "shared-dataset-changed",
|
|
53
|
+
datasetId: head.datasetId,
|
|
54
|
+
fileId: head.fileId,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
checkpoint: {
|
|
60
|
+
lastPollAt: now().toISOString(),
|
|
61
|
+
lastSeenKeyResponseFileIds: responses.map((response) => response.fileId),
|
|
62
|
+
datasetHeads: nextHeads,
|
|
63
|
+
},
|
|
64
|
+
events,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export class SharingChangeDetector {
|
|
68
|
+
options;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this.options = options;
|
|
71
|
+
}
|
|
72
|
+
detect(checkpoint) {
|
|
73
|
+
const tokenExpiresAt = this.options.tokenExpiresAt?.();
|
|
74
|
+
return detectSharingChanges(this.options.listKeyResponses, this.options.listDatasetHeads, checkpoint, {
|
|
75
|
+
...(this.options.now ? { now: this.options.now } : {}),
|
|
76
|
+
...(tokenExpiresAt !== undefined ? { tokenExpiresAt } : {}),
|
|
77
|
+
...(this.options.tokenExpiringSoonMs !== undefined
|
|
78
|
+
? { tokenExpiringSoonMs: this.options.tokenExpiringSoonMs }
|
|
79
|
+
: {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function createSharingChangeDetectorFromTransport(transport, options = {}) {
|
|
84
|
+
return new SharingChangeDetector({
|
|
85
|
+
listKeyResponses: async () => {
|
|
86
|
+
const exchanges = await transport.listExchanges({ kind: "key-response" });
|
|
87
|
+
return exchanges.map((exchange) => ({
|
|
88
|
+
fileId: exchange.fileId,
|
|
89
|
+
exchangeId: exchange.exchangeId,
|
|
90
|
+
}));
|
|
91
|
+
},
|
|
92
|
+
listDatasetHeads: () => transport.listDatasetHeads(),
|
|
93
|
+
...options,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=change-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-detector.js","sourceRoot":"","sources":["../../src/sharing/change-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type SharedDatasetHead = {
|
|
2
|
+
datasetId: string;
|
|
3
|
+
fileId: string;
|
|
4
|
+
modifiedTime?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
headRevisionId?: string;
|
|
7
|
+
etag?: string;
|
|
8
|
+
};
|
|
9
|
+
export type SharingSyncCheckpoint = {
|
|
10
|
+
lastPollAt?: string;
|
|
11
|
+
lastSeenKeyResponseFileIds?: string[];
|
|
12
|
+
datasetHeads?: Record<string, SharedDatasetHead>;
|
|
13
|
+
};
|
|
14
|
+
export type SharingNotificationEvent = {
|
|
15
|
+
kind: "pending-key-response";
|
|
16
|
+
exchangeId: string;
|
|
17
|
+
fileId: string;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "shared-dataset-changed";
|
|
20
|
+
datasetId: string;
|
|
21
|
+
fileId: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "token-expiring-soon";
|
|
24
|
+
expiresAt: string;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "token-expired";
|
|
27
|
+
};
|
|
28
|
+
export type SharingChangeDetectionResult = {
|
|
29
|
+
checkpoint: SharingSyncCheckpoint;
|
|
30
|
+
events: SharingNotificationEvent[];
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/sharing/checkpoint.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,IAAI,EAAE,wBAAwB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,qBAAqB,CAAC;IAClC,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/sharing/checkpoint.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type SharedBackupCodec, type SharingAccountBindingV1, type SharingDatasetGrantV1, type SharingInvitationV1, type SharingRole } from "./index.js";
|
|
2
2
|
import type { SharedBackupStorage, SharedBackupTransport, SharedDatasetFile, SharedExchangeFile } from "./transport.js";
|
|
3
3
|
import { type WebCryptoSharingIdentity } from "./web-crypto.js";
|
|
4
|
+
export { IndexedDbSharedBackupRegistry } from "./registry-indexeddb.js";
|
|
4
5
|
export type SharedBackupControllerCodec<T> = SharedBackupCodec<T> & {
|
|
5
6
|
merge(local: T, remote: T): T;
|
|
6
7
|
fingerprint(value: T): string;
|
|
@@ -50,6 +51,26 @@ export type RotatedDatasetResult = {
|
|
|
50
51
|
revisionId?: string;
|
|
51
52
|
error?: unknown;
|
|
52
53
|
};
|
|
54
|
+
export type DrivePermissionReconciliationAction = {
|
|
55
|
+
kind: "granted" | "updated";
|
|
56
|
+
keyId: string;
|
|
57
|
+
permissionId: string;
|
|
58
|
+
role: "reader" | "writer";
|
|
59
|
+
} | {
|
|
60
|
+
kind: "removed";
|
|
61
|
+
permissionId: string;
|
|
62
|
+
} | {
|
|
63
|
+
kind: "unchanged";
|
|
64
|
+
keyId: string;
|
|
65
|
+
} | {
|
|
66
|
+
kind: "skipped";
|
|
67
|
+
keyId: string;
|
|
68
|
+
reason: string;
|
|
69
|
+
};
|
|
70
|
+
export type DrivePermissionReconciliationResult = {
|
|
71
|
+
datasetId: string;
|
|
72
|
+
actions: DrivePermissionReconciliationAction[];
|
|
73
|
+
};
|
|
53
74
|
export type SharedBackupControllerOptions<T> = {
|
|
54
75
|
appId: string;
|
|
55
76
|
codec: SharedBackupControllerCodec<T>;
|
|
@@ -100,6 +121,11 @@ export declare class SharedBackupController<T> {
|
|
|
100
121
|
expiresAt?: string;
|
|
101
122
|
sendNotificationEmail?: boolean;
|
|
102
123
|
emailMessage?: string;
|
|
124
|
+
/** Consumer landing URL; folder ID is appended before the Drive notification. */
|
|
125
|
+
joinLandingUrl?: string;
|
|
126
|
+
/** Fully built join URL; must already include the app folder ID when used. */
|
|
127
|
+
joinUrl?: string;
|
|
128
|
+
appDisplayName?: string;
|
|
103
129
|
}): Promise<SharingInvitationResult>;
|
|
104
130
|
listExchanges(options?: {
|
|
105
131
|
exchangeId?: string;
|
|
@@ -125,6 +151,10 @@ export declare class SharedBackupController<T> {
|
|
|
125
151
|
keyId: string;
|
|
126
152
|
}): Promise<SharedDatasetResult<T>>;
|
|
127
153
|
rotateLocalKey(replacementIdentity: WebCryptoSharingIdentity, datasetIds: string[]): Promise<RotatedDatasetResult[]>;
|
|
154
|
+
reconcileDrivePermissions(input: {
|
|
155
|
+
datasetId: string;
|
|
156
|
+
participantEmails: Record<string, string>;
|
|
157
|
+
}): Promise<DrivePermissionReconciliationResult>;
|
|
128
158
|
private changeParticipants;
|
|
129
159
|
private readDatasetById;
|
|
130
160
|
private requiredRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/sharing/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EASL,KAAK,wBAAwB,EAE9B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG;IAClE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;IACpE,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAE1E,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAKnE,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC;IACtC,QAAQ,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC9C,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,oBAAoB,CAAC,CAAC,OAAO,EAAE;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,oBAAoB,CAAC,CACnB,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,CAAC,OAAO,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,CAAC,CAAC;QACd,WAAW,EAAE,CAAC,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,qBAAa,sBAAsB,CAAC,CAAC;IAGvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,KAAK,CAAoC;gBAEpB,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAItE,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI7C,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI5C,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAmClC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAiB/D,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,GACZ,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAsDlC,iBAAiB,CAAC,KAAK,EAAE;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,qBAAqB,EAAE,CAAC;QACzC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/sharing/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EASL,KAAK,wBAAwB,EAE9B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG;IAClE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;IACpE,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,qBAAa,0BAA2B,YAAW,oBAAoB;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkD;IAE1E,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAKnE,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAC3C;IACE,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC3B,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,mCAAmC,GAAG;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mCAAmC,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC;IACtC,QAAQ,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC9C,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IAC1B,oBAAoB,CAAC,CAAC,OAAO,EAAE;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,oBAAoB,CAAC,CACnB,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,CAAC,OAAO,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,CAAC,CAAC;QACd,WAAW,EAAE,CAAC,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,qBAAa,sBAAsB,CAAC,CAAC;IAGvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,KAAK,CAAoC;gBAEpB,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAItE,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI7C,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI5C,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAmClC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAiB/D,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,CAAC,GACZ,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAsDlC,iBAAiB,CAAC,KAAK,EAAE;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,qBAAqB,EAAE,CAAC;QACzC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC;QACxB,iFAAiF;QAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,8EAA8E;QAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoFpC,aAAa,CAAC,OAAO,CAAC,EAAE;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;KACnC,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAIjC,iBAAiB,CACf,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA6E1D,iBAAiB,CAAC,KAAK,EAAE;QACvB,UAAU,EAAE,mBAAmB,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC;QACvB,qBAAqB,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAqIpC,cAAc,CAAC,KAAK,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpC,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAiDnC,gBAAgB,CAAC,KAAK,EAAE;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IA2CnC,cAAc,CACZ,mBAAmB,EAAE,wBAAwB,EAC7C,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAwFlC,yBAAyB,CAAC,KAAK,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC3C,GAAG,OAAO,CAAC,mCAAmC,CAAC;IAqKhD,OAAO,CAAC,kBAAkB;YA4DZ,eAAe;YAmBf,gBAAgB;YAahB,UAAU;IAgCxB,OAAO,CAAC,kBAAkB;YAmBZ,WAAW;IAyBzB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;CAQnB;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAC5C,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACxC,sBAAsB,CAAC,CAAC,CAAC,CAE3B"}
|