@keyneom/sync-kit 0.2.0-rc.1 → 0.2.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sharing/appdata-identity-store.d.ts +36 -0
- package/dist/sharing/appdata-identity-store.d.ts.map +1 -0
- package/dist/sharing/appdata-identity-store.js +49 -0
- package/dist/sharing/appdata-identity-store.js.map +1 -0
- package/dist/sharing/controller.d.ts +58 -3
- package/dist/sharing/controller.d.ts.map +1 -1
- package/dist/sharing/controller.js +316 -117
- package/dist/sharing/controller.js.map +1 -1
- package/dist/sharing/index.d.ts +1 -0
- package/dist/sharing/index.d.ts.map +1 -1
- package/dist/sharing/index.js +1 -0
- package/dist/sharing/index.js.map +1 -1
- package/dist/sharing/link-exchange.d.ts +51 -0
- package/dist/sharing/link-exchange.d.ts.map +1 -0
- package/dist/sharing/link-exchange.js +131 -0
- package/dist/sharing/link-exchange.js.map +1 -0
- package/dist/sharing/migrating-identity-store.d.ts +29 -0
- package/dist/sharing/migrating-identity-store.d.ts.map +1 -0
- package/dist/sharing/migrating-identity-store.js +37 -0
- package/dist/sharing/migrating-identity-store.js.map +1 -0
- package/dist/sharing/transport.d.ts +2 -0
- package/dist/sharing/transport.d.ts.map +1 -1
- package/dist/stores/google-drive/index.d.ts +20 -0
- package/dist/stores/google-drive/index.d.ts.map +1 -1
- package/dist/stores/google-drive/index.js +64 -0
- package/dist/stores/google-drive/index.js.map +1 -1
- package/dist/stores/google-drive/picker.d.ts +20 -0
- package/dist/stores/google-drive/picker.d.ts.map +1 -1
- package/dist/stores/google-drive/picker.js +64 -0
- package/dist/stores/google-drive/picker.js.map +1 -1
- package/dist/stores/google-drive/sharing.d.ts +2 -0
- package/dist/stores/google-drive/sharing.d.ts.map +1 -1
- package/dist/stores/google-drive/sharing.js +83 -6
- package/dist/stores/google-drive/sharing.js.map +1 -1
- package/package.json +15 -3
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Authorization } from "../core/types.js";
|
|
2
|
+
import { GoogleDriveAppDataStore } from "../stores/google-drive/index.js";
|
|
3
|
+
import { type ProtectedSharingIdentityStore, type ProtectedSharingIdentityV1 } from "./web-passkey.js";
|
|
4
|
+
export type DriveAppDataProtectedSharingIdentityStoreOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* Supplies a Drive authorization scoped to `drive.appdata`. The same Google
|
|
7
|
+
* account on any device returns the same private app-data folder, which is
|
|
8
|
+
* how a single sharing identity follows the user across devices.
|
|
9
|
+
*/
|
|
10
|
+
authorization(): Promise<Authorization>;
|
|
11
|
+
/** Overrides the app-data filename derived from the app id. */
|
|
12
|
+
filename?(appId: string): string;
|
|
13
|
+
drive?: GoogleDriveAppDataStore;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Hosts the passkey-wrapped sharing identity in the signed-in Google account's
|
|
17
|
+
* private `drive.appdata` folder instead of device-local storage. Because the
|
|
18
|
+
* record is already AES-GCM-encrypted with the passkey PRF secret, app-data is
|
|
19
|
+
* a plaintext-safe transport: Drive only ever sees an opaque JSON blob whose
|
|
20
|
+
* `encryptedPrivateKeys` field it cannot read.
|
|
21
|
+
*
|
|
22
|
+
* The single-user, multi-device continuity this restores is deliberately
|
|
23
|
+
* distinct from the sharing (multi-user) protocol: the identity here is one
|
|
24
|
+
* account's own key, replicated to its own devices, never granted to another
|
|
25
|
+
* participant.
|
|
26
|
+
*/
|
|
27
|
+
export declare class DriveAppDataProtectedSharingIdentityStore implements ProtectedSharingIdentityStore {
|
|
28
|
+
private readonly options;
|
|
29
|
+
private readonly drive;
|
|
30
|
+
constructor(options: DriveAppDataProtectedSharingIdentityStoreOptions);
|
|
31
|
+
load(appId: string): Promise<ProtectedSharingIdentityV1 | null>;
|
|
32
|
+
save(record: ProtectedSharingIdentityV1): Promise<void>;
|
|
33
|
+
delete(appId: string): Promise<void>;
|
|
34
|
+
private filename;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=appdata-identity-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appdata-identity-store.d.ts","sourceRoot":"","sources":["../../src/sharing/appdata-identity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAChC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,gDAAgD,GAAG;IAC7D;;;;OAIG;IACH,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,+DAA+D;IAC/D,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,uBAAuB,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,qBAAa,yCACX,YAAW,6BAA6B;IAKtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAG7B,OAAO,EAAE,gDAAgD;IAKtE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAQ/D,IAAI,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,OAAO,CAAC,QAAQ;CAKjB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { GoogleDriveAppDataStore } from "../stores/google-drive/index.js";
|
|
2
|
+
import { parseProtectedSharingIdentityV1, } from "./web-passkey.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hosts the passkey-wrapped sharing identity in the signed-in Google account's
|
|
5
|
+
* private `drive.appdata` folder instead of device-local storage. Because the
|
|
6
|
+
* record is already AES-GCM-encrypted with the passkey PRF secret, app-data is
|
|
7
|
+
* a plaintext-safe transport: Drive only ever sees an opaque JSON blob whose
|
|
8
|
+
* `encryptedPrivateKeys` field it cannot read.
|
|
9
|
+
*
|
|
10
|
+
* The single-user, multi-device continuity this restores is deliberately
|
|
11
|
+
* distinct from the sharing (multi-user) protocol: the identity here is one
|
|
12
|
+
* account's own key, replicated to its own devices, never granted to another
|
|
13
|
+
* participant.
|
|
14
|
+
*/
|
|
15
|
+
export class DriveAppDataProtectedSharingIdentityStore {
|
|
16
|
+
options;
|
|
17
|
+
drive;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.drive = options.drive ?? new GoogleDriveAppDataStore();
|
|
21
|
+
}
|
|
22
|
+
async load(appId) {
|
|
23
|
+
const authorization = await this.options.authorization();
|
|
24
|
+
const found = await this.drive.find(this.filename(appId), authorization);
|
|
25
|
+
if (!found)
|
|
26
|
+
return null;
|
|
27
|
+
const text = await this.drive.readText(found.fileId, authorization);
|
|
28
|
+
return parseProtectedSharingIdentityV1(text);
|
|
29
|
+
}
|
|
30
|
+
async save(record) {
|
|
31
|
+
const authorization = await this.options.authorization();
|
|
32
|
+
const name = this.filename(record.appId);
|
|
33
|
+
const found = await this.drive.find(name, authorization);
|
|
34
|
+
await this.drive.write(name, JSON.stringify(record), authorization, {
|
|
35
|
+
...(found ? { existingId: found.fileId } : {}),
|
|
36
|
+
contentType: "application/json",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async delete(appId) {
|
|
40
|
+
const authorization = await this.options.authorization();
|
|
41
|
+
const found = await this.drive.find(this.filename(appId), authorization);
|
|
42
|
+
if (found)
|
|
43
|
+
await this.drive.delete(found.fileId, authorization);
|
|
44
|
+
}
|
|
45
|
+
filename(appId) {
|
|
46
|
+
return (this.options.filename?.(appId) ?? `sync-kit-sharing-identity-${appId}.json`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=appdata-identity-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appdata-identity-store.js","sourceRoot":"","sources":["../../src/sharing/appdata-identity-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,+BAA+B,GAGhC,MAAM,kBAAkB,CAAC;AAc1B;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,yCAAyC;IAMjC;IAHF,KAAK,CAA0B;IAEhD,YACmB,OAAyD;QAAzD,YAAO,GAAP,OAAO,CAAkD;QAE1E,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,uBAAuB,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa;QACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACpE,OAAO,+BAA+B,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkC;QAC3C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE;YAClE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;QACzE,IAAI,KAAK;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClE,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC5B,OAAO,CACL,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,6BAA6B,KAAK,OAAO,CAC5E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type SharedBackupCodec, type SharingAccountBindingV1, type SharingDatasetGrantV1, type SharingInvitationV1, type SharingRole } from "./index.js";
|
|
1
|
+
import { type SharedBackupCodec, type SharingAccountBindingV1, type SharingDatasetGrantV1, type SharingInvitationV1, type SharingPublicKeyResponseV1, type SharingRole } from "./index.js";
|
|
2
|
+
import type { SharingDatasetFileV1 } from "./link-exchange.js";
|
|
2
3
|
import type { SharedBackupStorage, SharedBackupTransport, SharedDatasetFile, SharedExchangeFile } from "./transport.js";
|
|
3
4
|
import { type WebCryptoSharingIdentity } from "./web-crypto.js";
|
|
4
5
|
export { IndexedDbSharedBackupRegistry } from "./registry-indexeddb.js";
|
|
@@ -30,7 +31,7 @@ export type SharedDatasetResult<T> = {
|
|
|
30
31
|
fileId: string;
|
|
31
32
|
revisionId: string;
|
|
32
33
|
value: T;
|
|
33
|
-
outcome: "created" | "loaded" | "updated" | "unchanged";
|
|
34
|
+
outcome: "created" | "adopted" | "loaded" | "updated" | "unchanged";
|
|
34
35
|
};
|
|
35
36
|
export type SharingInvitationResult = {
|
|
36
37
|
invitation: SharingInvitationV1;
|
|
@@ -113,6 +114,19 @@ export declare class SharedBackupController<T> {
|
|
|
113
114
|
ensureStorage(): Promise<SharedBackupStorage>;
|
|
114
115
|
listDatasets(): Promise<SharedDatasetFile[]>;
|
|
115
116
|
createDataset(datasetId: string, value: T): Promise<SharedDatasetResult<T>>;
|
|
117
|
+
/**
|
|
118
|
+
* Reconnect to an existing dataset this identity can already decrypt —
|
|
119
|
+
* e.g. after a reinstall, or when an interrupted setup left the remote
|
|
120
|
+
* file without a local registry record. The owner key is pinned from the
|
|
121
|
+
* envelope itself (trust-on-first-use), so callers recovering their own
|
|
122
|
+
* dataset should pass `requireOwned` to insist this identity is the
|
|
123
|
+
* dataset's owner.
|
|
124
|
+
*/
|
|
125
|
+
adoptDataset(datasetId: string, options?: {
|
|
126
|
+
requireOwned?: boolean;
|
|
127
|
+
}): Promise<SharedDatasetResult<T>>;
|
|
128
|
+
/** Delete a dataset file from the transport and forget its local record. */
|
|
129
|
+
deleteDataset(datasetId: string): Promise<void>;
|
|
116
130
|
loadDataset(datasetId: string): Promise<SharedDatasetResult<T>>;
|
|
117
131
|
syncDataset(datasetId: string, localValue: T): Promise<SharedDatasetResult<T>>;
|
|
118
132
|
inviteParticipant(input: {
|
|
@@ -140,6 +154,46 @@ export declare class SharedBackupController<T> {
|
|
|
140
154
|
responseFileId: string;
|
|
141
155
|
recipientEmailAddress: string;
|
|
142
156
|
}): Promise<AcceptedDatasetResult[]>;
|
|
157
|
+
/**
|
|
158
|
+
* Applies verified acceptance grants to each dataset: add the participant,
|
|
159
|
+
* re-encrypt, write, and per-email-share the dataset file. Shared by the
|
|
160
|
+
* Drive-file accept path and the link-payload accept path.
|
|
161
|
+
*/
|
|
162
|
+
private applyAcceptedGrants;
|
|
163
|
+
/**
|
|
164
|
+
* Owner side of the link-carried exchange. Shares each granted dataset file
|
|
165
|
+
* with the recipient's email (so it lands in their Picker) and returns the
|
|
166
|
+
* signed invitation plus the file list to embed in the join link. Unlike
|
|
167
|
+
* {@link inviteParticipant} it writes no Drive `exchanges/` invitation file.
|
|
168
|
+
*/
|
|
169
|
+
inviteParticipantForLink(input: {
|
|
170
|
+
emailAddress: string;
|
|
171
|
+
requestedGrants: SharingDatasetGrantV1[];
|
|
172
|
+
expiresAt?: string;
|
|
173
|
+
}): Promise<{
|
|
174
|
+
invitation: SharingInvitationV1;
|
|
175
|
+
files: SharingDatasetFileV1[];
|
|
176
|
+
}>;
|
|
177
|
+
/**
|
|
178
|
+
* Recipient side of the link-carried exchange. Verifies the invitation carried
|
|
179
|
+
* in the join link, registers the granted datasets with their file ids (so
|
|
180
|
+
* later reads/writes resolve without listing the owner's folder), and returns
|
|
181
|
+
* a signed key response to send back to the owner. Reads/writes no Drive
|
|
182
|
+
* `exchanges/` file.
|
|
183
|
+
*/
|
|
184
|
+
submitKeyResponseFromInvitation(invitation: SharingInvitationV1, datasetFiles: SharingDatasetFileV1[]): Promise<SharingPublicKeyResponseV1>;
|
|
185
|
+
/**
|
|
186
|
+
* Owner side. Accepts a key response carried in a response link (no Drive
|
|
187
|
+
* `exchanges/` read), adds the recipient to each granted dataset, and
|
|
188
|
+
* per-email shares the dataset files (re-affirming the invite-time share).
|
|
189
|
+
* The invitation must be supplied by the caller (persisted at invite time,
|
|
190
|
+
* keyed by exchange id).
|
|
191
|
+
*/
|
|
192
|
+
acceptKeyResponseFromPayload(input: {
|
|
193
|
+
invitation: SharingInvitationV1;
|
|
194
|
+
response: SharingPublicKeyResponseV1;
|
|
195
|
+
recipientEmailAddress: string;
|
|
196
|
+
}): Promise<AcceptedDatasetResult[]>;
|
|
143
197
|
setDatasetRole(input: {
|
|
144
198
|
datasetId: string;
|
|
145
199
|
keyId: string;
|
|
@@ -149,13 +203,14 @@ export declare class SharedBackupController<T> {
|
|
|
149
203
|
revokeDatasetKey(input: {
|
|
150
204
|
datasetId: string;
|
|
151
205
|
keyId: string;
|
|
206
|
+
emailAddress?: string;
|
|
152
207
|
}): Promise<SharedDatasetResult<T>>;
|
|
208
|
+
private findDirectDatasetPermission;
|
|
153
209
|
rotateLocalKey(replacementIdentity: WebCryptoSharingIdentity, datasetIds: string[]): Promise<RotatedDatasetResult[]>;
|
|
154
210
|
reconcileDrivePermissions(input: {
|
|
155
211
|
datasetId: string;
|
|
156
212
|
participantEmails: Record<string, string>;
|
|
157
213
|
}): Promise<DrivePermissionReconciliationResult>;
|
|
158
|
-
private changeParticipants;
|
|
159
214
|
private readDatasetById;
|
|
160
215
|
private requiredRegistry;
|
|
161
216
|
private verifyHead;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/sharing/controller.ts"],"names":[],"mappings":"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"}
|