@keyneom/sync-kit 0.2.0-rc.0 → 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/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/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/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 +88 -3
- package/dist/sharing/controller.d.ts.map +1 -1
- package/dist/sharing/controller.js +453 -110
- package/dist/sharing/controller.js.map +1 -1
- package/dist/sharing/index.d.ts +5 -1
- package/dist/sharing/index.d.ts.map +1 -1
- package/dist/sharing/index.js +3 -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/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/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 +12 -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 +22 -0
- package/dist/stores/google-drive/index.d.ts.map +1 -1
- package/dist/stores/google-drive/index.js +66 -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 +5 -1
- package/dist/stores/google-drive/sharing.d.ts.map +1 -1
- package/dist/stores/google-drive/sharing.js +113 -6
- package/dist/stores/google-drive/sharing.js.map +1 -1
- package/package.json +27 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-exchange.d.ts","sourceRoot":"","sources":["../../src/sharing/link-exchange.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAOpB;;;;;;;;GAQG;AAEH,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,6BAA6B,WAAW,CAAC;AACtD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AACnD,eAAO,MAAM,6BAA6B,YAAY,CAAC;AACvD,eAAO,MAAM,8BAA8B,UAAU,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,mBAAmB,CAAC;IAChC,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,0BAA0B,CAAC;CACtC,CAAC;AAIF,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,GAC9B,MAAM,CAER;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAE9E;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,0BAA0B,GACnC,MAAM,CAER;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,GACd,0BAA0B,CAE5B;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,EAAE,GAC5B,MAAM,CAKR;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,oBAAoB,EAAE,CAMxB;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,mBAAmB,CAAC;IAChC,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B,GAAG,MAAM,CAcT;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,eAAe,GAC9B,iBAAiB,GAAG,IAAI,CAS1B;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,0BAA0B,CAAC;CACtC,GAAG,MAAM,CAST;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,GAAG,eAAe,GAC9B,qBAAqB,GAAG,IAAI,CAM9B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { SyncKitError } from "../core/errors.js";
|
|
2
|
+
import { base64UrlToBytes, bytesToBase64Url } from "../crypto/index.js";
|
|
3
|
+
import { parseSharingInvitationV1, parseSharingPublicKeyResponseV1, } from "./index.js";
|
|
4
|
+
import { SHARING_JOIN_EXCHANGE_PARAM, SHARING_JOIN_FOLDER_PARAM, SHARING_JOIN_MARKER_PARAM, } from "./join.js";
|
|
5
|
+
export const SHARING_JOIN_INVITATION_PARAM = "sk-inv";
|
|
6
|
+
export const SHARING_JOIN_FILES_PARAM = "sk-files";
|
|
7
|
+
export const SHARING_RESPONSE_MARKER_PARAM = "sk-resp";
|
|
8
|
+
export const SHARING_RESPONSE_PAYLOAD_PARAM = "sk-kr";
|
|
9
|
+
// --- payload encode/decode (signed structs are unchanged; only transported) ---
|
|
10
|
+
export function encodeSharingInvitationV1(invitation) {
|
|
11
|
+
return encodeJson(parseSharingInvitationV1(invitation));
|
|
12
|
+
}
|
|
13
|
+
export function decodeSharingInvitationV1(encoded) {
|
|
14
|
+
return parseSharingInvitationV1(decodeJson(encoded, "invitation"));
|
|
15
|
+
}
|
|
16
|
+
export function encodeSharingPublicKeyResponseV1(response) {
|
|
17
|
+
return encodeJson(parseSharingPublicKeyResponseV1(response));
|
|
18
|
+
}
|
|
19
|
+
export function decodeSharingPublicKeyResponseV1(encoded) {
|
|
20
|
+
return parseSharingPublicKeyResponseV1(decodeJson(encoded, "key response"));
|
|
21
|
+
}
|
|
22
|
+
export function encodeSharingDatasetFilesV1(files) {
|
|
23
|
+
if (files.length === 0) {
|
|
24
|
+
throw new SyncKitError("compatibility", "A join link needs at least one dataset file.");
|
|
25
|
+
}
|
|
26
|
+
return encodeJson(files.map(normalizeDatasetFile));
|
|
27
|
+
}
|
|
28
|
+
export function decodeSharingDatasetFilesV1(encoded) {
|
|
29
|
+
const value = decodeJson(encoded, "dataset files");
|
|
30
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
31
|
+
throw new SyncKitError("compatibility", "The join link dataset file list is malformed.");
|
|
32
|
+
}
|
|
33
|
+
return value.map(normalizeDatasetFile);
|
|
34
|
+
}
|
|
35
|
+
// --- link builders / parsers ---
|
|
36
|
+
/**
|
|
37
|
+
* Builds a join link carrying the signed invitation and the recipient's granted
|
|
38
|
+
* dataset files. Keeps the legacy folder/exchange/marker params so existing
|
|
39
|
+
* deep-link handlers still recognize it as a join link.
|
|
40
|
+
*/
|
|
41
|
+
export function buildSharingJoinLinkV1(input) {
|
|
42
|
+
const url = new URL(input.landingUrl);
|
|
43
|
+
url.searchParams.set(SHARING_JOIN_MARKER_PARAM, "1");
|
|
44
|
+
url.searchParams.set(SHARING_JOIN_FOLDER_PARAM, input.invitation.appFolderId);
|
|
45
|
+
url.searchParams.set(SHARING_JOIN_EXCHANGE_PARAM, input.invitation.exchangeId);
|
|
46
|
+
url.searchParams.set(SHARING_JOIN_INVITATION_PARAM, encodeSharingInvitationV1(input.invitation));
|
|
47
|
+
url.searchParams.set(SHARING_JOIN_FILES_PARAM, encodeSharingDatasetFilesV1(input.files));
|
|
48
|
+
return url.toString();
|
|
49
|
+
}
|
|
50
|
+
export function parseSharingJoinLinkV1(input) {
|
|
51
|
+
const params = toSearchParams(input);
|
|
52
|
+
const invitation = params.get(SHARING_JOIN_INVITATION_PARAM);
|
|
53
|
+
const files = params.get(SHARING_JOIN_FILES_PARAM);
|
|
54
|
+
if (!invitation || !files)
|
|
55
|
+
return null;
|
|
56
|
+
return {
|
|
57
|
+
invitation: decodeSharingInvitationV1(invitation),
|
|
58
|
+
files: decodeSharingDatasetFilesV1(files),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Builds a response link the recipient sends back to the owner to finish join. */
|
|
62
|
+
export function buildSharingResponseLinkV1(input) {
|
|
63
|
+
const url = new URL(input.landingUrl);
|
|
64
|
+
url.searchParams.set(SHARING_RESPONSE_MARKER_PARAM, "1");
|
|
65
|
+
url.searchParams.set(SHARING_JOIN_EXCHANGE_PARAM, input.response.exchangeId);
|
|
66
|
+
url.searchParams.set(SHARING_RESPONSE_PAYLOAD_PARAM, encodeSharingPublicKeyResponseV1(input.response));
|
|
67
|
+
return url.toString();
|
|
68
|
+
}
|
|
69
|
+
export function parseSharingResponseLinkV1(input) {
|
|
70
|
+
const params = toSearchParams(input);
|
|
71
|
+
if (params.get(SHARING_RESPONSE_MARKER_PARAM) !== "1")
|
|
72
|
+
return null;
|
|
73
|
+
const response = params.get(SHARING_RESPONSE_PAYLOAD_PARAM);
|
|
74
|
+
if (!response)
|
|
75
|
+
return null;
|
|
76
|
+
return { response: decodeSharingPublicKeyResponseV1(response) };
|
|
77
|
+
}
|
|
78
|
+
// --- internals ---
|
|
79
|
+
function encodeJson(value) {
|
|
80
|
+
return bytesToBase64Url(new TextEncoder().encode(JSON.stringify(value)));
|
|
81
|
+
}
|
|
82
|
+
function decodeJson(encoded, label) {
|
|
83
|
+
let text;
|
|
84
|
+
try {
|
|
85
|
+
text = new TextDecoder().decode(base64UrlToBytes(encoded));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new SyncKitError("compatibility", `The ${label} payload is not valid base64url.`, {
|
|
89
|
+
cause: error,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
return JSON.parse(text);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new SyncKitError("compatibility", `The ${label} payload is not valid JSON.`, {
|
|
97
|
+
cause: error,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function normalizeDatasetFile(value) {
|
|
102
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
103
|
+
throw new SyncKitError("compatibility", "A dataset file entry must be an object.");
|
|
104
|
+
}
|
|
105
|
+
const entry = value;
|
|
106
|
+
for (const field of ["datasetId", "fileId", "role"]) {
|
|
107
|
+
const fieldValue = entry[field];
|
|
108
|
+
if (typeof fieldValue !== "string" || fieldValue.length === 0) {
|
|
109
|
+
throw new SyncKitError("compatibility", `A dataset file ${field} must be a non-empty string.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const role = entry.role;
|
|
113
|
+
if (role !== "admin" && role !== "writer" && role !== "viewer") {
|
|
114
|
+
throw new SyncKitError("compatibility", `A dataset file has an unsupported role: ${role}.`);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
datasetId: entry.datasetId,
|
|
118
|
+
fileId: entry.fileId,
|
|
119
|
+
role,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function toSearchParams(input) {
|
|
123
|
+
if (input instanceof URLSearchParams)
|
|
124
|
+
return input;
|
|
125
|
+
if (input.startsWith("?"))
|
|
126
|
+
return new URLSearchParams(input.slice(1));
|
|
127
|
+
if (input.includes("://"))
|
|
128
|
+
return new URL(input).searchParams;
|
|
129
|
+
return new URLSearchParams(input);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=link-exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-exchange.js","sourceRoot":"","sources":["../../src/sharing/link-exchange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ProtectedSharingIdentityStore, type ProtectedSharingIdentityV1 } from "./web-passkey.js";
|
|
2
|
+
export type MigratingProtectedSharingIdentityStoreOptions = {
|
|
3
|
+
/** Authoritative store (e.g. `drive.appdata`), read first and always written. */
|
|
4
|
+
primary: ProtectedSharingIdentityStore;
|
|
5
|
+
/**
|
|
6
|
+
* Pre-existing device-local store (e.g. IndexedDB / EncryptedSharedPreferences).
|
|
7
|
+
* Read only as a fallback; its blob is promoted to `primary` on first hit.
|
|
8
|
+
*/
|
|
9
|
+
legacy: ProtectedSharingIdentityStore;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Bridges a device that already holds a passkey-wrapped identity in local
|
|
13
|
+
* storage to the app-data-hosted substrate without regenerating it. On the
|
|
14
|
+
* first load after upgrade the legacy blob is promoted to the primary store,
|
|
15
|
+
* after which the primary store is authoritative and local storage is only a
|
|
16
|
+
* cache the consumer may keep for a hot path.
|
|
17
|
+
*
|
|
18
|
+
* Promotion is best-effort: if the primary write fails (offline, revoked
|
|
19
|
+
* scope) the legacy identity is still returned, so a returning user never
|
|
20
|
+
* silently generates a fresh identity and loses access to their dataset.
|
|
21
|
+
*/
|
|
22
|
+
export declare class MigratingProtectedSharingIdentityStore implements ProtectedSharingIdentityStore {
|
|
23
|
+
private readonly options;
|
|
24
|
+
constructor(options: MigratingProtectedSharingIdentityStoreOptions);
|
|
25
|
+
load(appId: string): Promise<ProtectedSharingIdentityV1 | null>;
|
|
26
|
+
save(record: ProtectedSharingIdentityV1): Promise<void>;
|
|
27
|
+
delete(appId: string): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=migrating-identity-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrating-identity-store.d.ts","sourceRoot":"","sources":["../../src/sharing/migrating-identity-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAChC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,6CAA6C,GAAG;IAC1D,iFAAiF;IACjF,OAAO,EAAE,6BAA6B,CAAC;IACvC;;;OAGG;IACH,MAAM,EAAE,6BAA6B,CAAC;CACvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,qBAAa,sCACX,YAAW,6BAA6B;IAGtC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,6CAA6C;IAGnE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAU/D,IAAI,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI3C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { parseProtectedSharingIdentityV1, } from "./web-passkey.js";
|
|
2
|
+
/**
|
|
3
|
+
* Bridges a device that already holds a passkey-wrapped identity in local
|
|
4
|
+
* storage to the app-data-hosted substrate without regenerating it. On the
|
|
5
|
+
* first load after upgrade the legacy blob is promoted to the primary store,
|
|
6
|
+
* after which the primary store is authoritative and local storage is only a
|
|
7
|
+
* cache the consumer may keep for a hot path.
|
|
8
|
+
*
|
|
9
|
+
* Promotion is best-effort: if the primary write fails (offline, revoked
|
|
10
|
+
* scope) the legacy identity is still returned, so a returning user never
|
|
11
|
+
* silently generates a fresh identity and loses access to their dataset.
|
|
12
|
+
*/
|
|
13
|
+
export class MigratingProtectedSharingIdentityStore {
|
|
14
|
+
options;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
async load(appId) {
|
|
19
|
+
const primary = await this.options.primary.load(appId);
|
|
20
|
+
if (primary)
|
|
21
|
+
return parseProtectedSharingIdentityV1(primary);
|
|
22
|
+
const legacy = await this.options.legacy.load(appId);
|
|
23
|
+
if (!legacy)
|
|
24
|
+
return null;
|
|
25
|
+
const record = parseProtectedSharingIdentityV1(legacy);
|
|
26
|
+
await this.options.primary.save(record).catch(() => undefined);
|
|
27
|
+
return record;
|
|
28
|
+
}
|
|
29
|
+
async save(record) {
|
|
30
|
+
await this.options.primary.save(record);
|
|
31
|
+
}
|
|
32
|
+
async delete(appId) {
|
|
33
|
+
await this.options.primary.delete(appId);
|
|
34
|
+
await this.options.legacy.delete(appId).catch(() => undefined);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=migrating-identity-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrating-identity-store.js","sourceRoot":"","sources":["../../src/sharing/migrating-identity-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAGhC,MAAM,kBAAkB,CAAC;AAY1B;;;;;;;;;;GAUG;AACH,MAAM,OAAO,sCAAsC;IAI9B;IADnB,YACmB,OAAsD;QAAtD,YAAO,GAAP,OAAO,CAA+C;IACtE,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,KAAa;QACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,OAAO;YAAE,OAAO,+BAA+B,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkC;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SharedBackupRegistry, SharedDatasetRegistryRecord } from "./controller.js";
|
|
2
|
+
/**
|
|
3
|
+
* Optional browser persistence for the protocol dataset registry. Application
|
|
4
|
+
* profile metadata such as display names and switcher labels remain outside
|
|
5
|
+
* sync-kit.
|
|
6
|
+
*/
|
|
7
|
+
export declare class IndexedDbSharedBackupRegistry implements SharedBackupRegistry {
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(options?: {
|
|
10
|
+
databaseName?: string;
|
|
11
|
+
storeName?: string;
|
|
12
|
+
indexedDB?: IDBFactory;
|
|
13
|
+
});
|
|
14
|
+
get(datasetId: string): Promise<SharedDatasetRegistryRecord | null>;
|
|
15
|
+
set(record: SharedDatasetRegistryRecord): Promise<void>;
|
|
16
|
+
delete(datasetId: string): Promise<void>;
|
|
17
|
+
private transaction;
|
|
18
|
+
private open;
|
|
19
|
+
private storeName;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=registry-indexeddb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-indexeddb.d.ts","sourceRoot":"","sources":["../../src/sharing/registry-indexeddb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,oBAAoB;IAEtE,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,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAQnE,GAAG,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIhC,WAAW;IAoBzB,OAAO,CAAC,IAAI;IAoCZ,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SyncKitError } from "../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Optional browser persistence for the protocol dataset registry. Application
|
|
4
|
+
* profile metadata such as display names and switcher labels remain outside
|
|
5
|
+
* sync-kit.
|
|
6
|
+
*/
|
|
7
|
+
export class IndexedDbSharedBackupRegistry {
|
|
8
|
+
options;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
async get(datasetId) {
|
|
13
|
+
const stored = await this.transaction("readonly", (store) => store.get(datasetId));
|
|
14
|
+
if (!stored || typeof stored !== "object")
|
|
15
|
+
return null;
|
|
16
|
+
return structuredClone(stored);
|
|
17
|
+
}
|
|
18
|
+
async set(record) {
|
|
19
|
+
await this.transaction("readwrite", (store) => store.put(structuredClone(record)));
|
|
20
|
+
}
|
|
21
|
+
async delete(datasetId) {
|
|
22
|
+
await this.transaction("readwrite", (store) => store.delete(datasetId));
|
|
23
|
+
}
|
|
24
|
+
async transaction(mode, operation) {
|
|
25
|
+
const database = await this.open();
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const transaction = database.transaction(this.storeName(), mode);
|
|
28
|
+
const request = operation(transaction.objectStore(this.storeName()));
|
|
29
|
+
request.onsuccess = () => resolve(request.result);
|
|
30
|
+
request.onerror = () => reject(new SyncKitError("state", "IndexedDB shared-backup registry failed.", {
|
|
31
|
+
cause: request.error,
|
|
32
|
+
}));
|
|
33
|
+
transaction.oncomplete = () => database.close();
|
|
34
|
+
transaction.onabort = () => database.close();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
open() {
|
|
38
|
+
const indexedDBImplementation = this.options.indexedDB ??
|
|
39
|
+
(typeof indexedDB === "undefined" ? undefined : indexedDB);
|
|
40
|
+
if (!indexedDBImplementation) {
|
|
41
|
+
return Promise.reject(new SyncKitError("configuration", "IndexedDB is required for shared-backup registry storage."));
|
|
42
|
+
}
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
const request = indexedDBImplementation.open(this.options.databaseName ?? "sync-kit-shared-backups", 1);
|
|
45
|
+
request.onupgradeneeded = () => {
|
|
46
|
+
if (!request.result.objectStoreNames.contains(this.storeName())) {
|
|
47
|
+
request.result.createObjectStore(this.storeName(), {
|
|
48
|
+
keyPath: "datasetId",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
request.onsuccess = () => resolve(request.result);
|
|
53
|
+
request.onerror = () => reject(new SyncKitError("state", "IndexedDB shared-backup registry could not be opened.", { cause: request.error }));
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
storeName() {
|
|
57
|
+
return this.options.storeName ?? "registry";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=registry-indexeddb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-indexeddb.js","sourceRoot":"","sources":["../../src/sharing/registry-indexeddb.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { SharedBackupEnvelopeV1, SharingInvitationV1, SharingPublicKeyResponseV1, SharingRole } from "./index.js";
|
|
2
|
+
import type { SharedDatasetHead } from "./checkpoint.js";
|
|
3
|
+
export type { SharedDatasetHead } from "./checkpoint.js";
|
|
2
4
|
export type SharedBackupStorage = {
|
|
3
5
|
appFolderId: string;
|
|
4
6
|
exchangesFolderId: string;
|
|
@@ -29,6 +31,12 @@ export type SharedDatasetPermission = {
|
|
|
29
31
|
permissionId?: string;
|
|
30
32
|
role: "reader" | "writer";
|
|
31
33
|
};
|
|
34
|
+
export type SharedDatasetDrivePermission = {
|
|
35
|
+
permissionId: string;
|
|
36
|
+
role: "reader" | "writer";
|
|
37
|
+
emailAddress?: string;
|
|
38
|
+
inherited: boolean;
|
|
39
|
+
};
|
|
32
40
|
/**
|
|
33
41
|
* Client-side transport required by the sharing controller. Implementations
|
|
34
42
|
* may use Google Drive or another provider, but cannot depend on a trusted app
|
|
@@ -40,6 +48,8 @@ export interface SharedBackupTransport {
|
|
|
40
48
|
readDataset(fileId: string): Promise<VersionedSharedDataset>;
|
|
41
49
|
createDataset(datasetId: string, envelope: SharedBackupEnvelopeV1): Promise<VersionedSharedDataset>;
|
|
42
50
|
writeDataset(current: VersionedSharedDataset, envelope: SharedBackupEnvelopeV1): Promise<VersionedSharedDataset>;
|
|
51
|
+
/** Optional: delete a dataset file. Required for controller.deleteDataset. */
|
|
52
|
+
deleteDataset?(fileId: string): Promise<void>;
|
|
43
53
|
grantExchangeAccess(emailAddress: string, options?: {
|
|
44
54
|
sendNotificationEmail?: boolean;
|
|
45
55
|
emailMessage?: string;
|
|
@@ -61,5 +71,7 @@ export interface SharedBackupTransport {
|
|
|
61
71
|
hasInheritedReadAccess?: boolean;
|
|
62
72
|
}): Promise<SharedDatasetPermission>;
|
|
63
73
|
removeDatasetPermission(fileId: string, permissionId: string): Promise<void>;
|
|
74
|
+
listDatasetPermissions(fileId: string): Promise<SharedDatasetDrivePermission[]>;
|
|
75
|
+
listDatasetHeads(): Promise<SharedDatasetHead[]>;
|
|
64
76
|
}
|
|
65
77
|
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/sharing/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,EAC1B,WAAW,EACZ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/sharing/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Authorization } from "../../core/types.js";
|
|
2
|
+
import { GoogleDriveFileStore } from "./index.js";
|
|
3
|
+
export type SyncKitAppFolder = {
|
|
4
|
+
appFolderId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
modifiedTime?: string;
|
|
7
|
+
};
|
|
8
|
+
export type ListAccessibleSyncKitAppFoldersOptions = {
|
|
9
|
+
appId: string;
|
|
10
|
+
authorization: Authorization;
|
|
11
|
+
drive?: GoogleDriveFileStore;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Lists sync-kit app-root folders the signed-in user can access for one
|
|
15
|
+
* application ID. Useful when a recipient has several shared folders with
|
|
16
|
+
* similar titles and needs to pick or disambiguate them in app UI.
|
|
17
|
+
*/
|
|
18
|
+
export declare function listAccessibleSyncKitAppFolders(options: ListAccessibleSyncKitAppFoldersOptions): Promise<SyncKitAppFolder[]>;
|
|
19
|
+
//# sourceMappingURL=app-folders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-folders.d.ts","sourceRoot":"","sources":["../../../src/stores/google-drive/app-folders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyB7B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { GoogleDriveFileStore, SYNC_KIT_APP_ID_PROPERTY, SYNC_KIT_KIND_PROPERTY, } from "./index.js";
|
|
2
|
+
const DRIVE_FOLDER_MIME_TYPE = "application/vnd.google-apps.folder";
|
|
3
|
+
/**
|
|
4
|
+
* Lists sync-kit app-root folders the signed-in user can access for one
|
|
5
|
+
* application ID. Useful when a recipient has several shared folders with
|
|
6
|
+
* similar titles and needs to pick or disambiguate them in app UI.
|
|
7
|
+
*/
|
|
8
|
+
export async function listAccessibleSyncKitAppFolders(options) {
|
|
9
|
+
if (!options.appId.trim())
|
|
10
|
+
throw new TypeError("appId must not be empty.");
|
|
11
|
+
const drive = options.drive ?? new GoogleDriveFileStore();
|
|
12
|
+
const folders = [];
|
|
13
|
+
let pageToken;
|
|
14
|
+
do {
|
|
15
|
+
const page = await drive.list(options.authorization, {
|
|
16
|
+
appProperties: {
|
|
17
|
+
[SYNC_KIT_APP_ID_PROPERTY]: options.appId,
|
|
18
|
+
[SYNC_KIT_KIND_PROPERTY]: "app-root",
|
|
19
|
+
},
|
|
20
|
+
...(pageToken ? { pageToken } : {}),
|
|
21
|
+
});
|
|
22
|
+
for (const file of page.files) {
|
|
23
|
+
if (isAppRootFolder(file)) {
|
|
24
|
+
folders.push({
|
|
25
|
+
appFolderId: file.fileId,
|
|
26
|
+
name: file.name,
|
|
27
|
+
...(file.modifiedTime ? { modifiedTime: file.modifiedTime } : {}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
pageToken = page.nextPageToken;
|
|
32
|
+
} while (pageToken);
|
|
33
|
+
return folders.sort((left, right) => left.name.localeCompare(right.name));
|
|
34
|
+
}
|
|
35
|
+
function isAppRootFolder(file) {
|
|
36
|
+
return file.mimeType === DRIVE_FOLDER_MIME_TYPE;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=app-folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-folders.js","sourceRoot":"","sources":["../../../src/stores/google-drive/app-folders.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAcpE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,OAA+C;IAE/C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,oBAAoB,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,IAAI,SAA6B,CAAC;IAClC,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACnD,aAAa,EAAE;gBACb,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC,KAAK;gBACzC,CAAC,sBAAsB,CAAC,EAAE,UAAU;aACrC;YACD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC;oBACX,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;IACjC,CAAC,QAAQ,SAAS,EAAE;IACpB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,eAAe,CAAC,IAAuB;IAC9C,OAAO,IAAI,CAAC,QAAQ,KAAK,sBAAsB,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type SyncKitFolderNameInput = {
|
|
2
|
+
appDisplayName: string;
|
|
3
|
+
profileLabel: string;
|
|
4
|
+
ownerLabel?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Sanitizes a human-readable Google Drive folder title. Names are presentation
|
|
8
|
+
* metadata only; protocol identity uses folder IDs and app properties.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizeDriveFolderName(name: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Builds a consumer-facing app-folder title from app branding, a user-chosen
|
|
13
|
+
* profile label, and optional owner disambiguation for shared views.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildSyncKitFolderName(input: SyncKitFolderNameInput): string;
|
|
16
|
+
//# sourceMappingURL=folder-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-name.d.ts","sourceRoot":"","sources":["../../../src/stores/google-drive/folder-name.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAY5E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const DRIVE_FOLDER_NAME_MAX_LENGTH = 200;
|
|
2
|
+
const INVALID_DRIVE_FOLDER_CHARS = /[\u0000-\u001f\\/]/g;
|
|
3
|
+
/**
|
|
4
|
+
* Sanitizes a human-readable Google Drive folder title. Names are presentation
|
|
5
|
+
* metadata only; protocol identity uses folder IDs and app properties.
|
|
6
|
+
*/
|
|
7
|
+
export function sanitizeDriveFolderName(name) {
|
|
8
|
+
const collapsed = name
|
|
9
|
+
.replace(INVALID_DRIVE_FOLDER_CHARS, " ")
|
|
10
|
+
.replace(/\s+/g, " ")
|
|
11
|
+
.trim();
|
|
12
|
+
if (collapsed.length === 0) {
|
|
13
|
+
throw new TypeError("The Drive folder name must not be empty.");
|
|
14
|
+
}
|
|
15
|
+
if (collapsed.length <= DRIVE_FOLDER_NAME_MAX_LENGTH) {
|
|
16
|
+
return collapsed;
|
|
17
|
+
}
|
|
18
|
+
return collapsed.slice(0, DRIVE_FOLDER_NAME_MAX_LENGTH).trimEnd();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Builds a consumer-facing app-folder title from app branding, a user-chosen
|
|
22
|
+
* profile label, and optional owner disambiguation for shared views.
|
|
23
|
+
*/
|
|
24
|
+
export function buildSyncKitFolderName(input) {
|
|
25
|
+
if (!input.appDisplayName.trim()) {
|
|
26
|
+
throw new TypeError("appDisplayName must not be empty.");
|
|
27
|
+
}
|
|
28
|
+
if (!input.profileLabel.trim()) {
|
|
29
|
+
throw new TypeError("profileLabel must not be empty.");
|
|
30
|
+
}
|
|
31
|
+
const base = `${input.appDisplayName.trim()} — ${input.profileLabel.trim()}`;
|
|
32
|
+
const withOwner = input.ownerLabel?.trim()
|
|
33
|
+
? `${base} (${input.ownerLabel.trim()})`
|
|
34
|
+
: base;
|
|
35
|
+
return sanitizeDriveFolderName(withOwner);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=folder-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-name.js","sourceRoot":"","sources":["../../../src/stores/google-drive/folder-name.ts"],"names":[],"mappings":"AAAA,MAAM,4BAA4B,GAAG,GAAG,CAAC;AACzC,MAAM,0BAA0B,GAAG,qBAAqB,CAAC;AAQzD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,SAAS,GAAG,IAAI;SACnB,OAAO,CAAC,0BAA0B,EAAE,GAAG,CAAC;SACxC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,IAAI,4BAA4B,EAAE,CAAC;QACrD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,OAAO,EAAE,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;QACxC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG;QACxC,CAAC,CAAC,IAAI,CAAC;IACT,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Authorization, CloudStore, StoredEnvelope } from "../../core/types.js";
|
|
2
|
+
import { SyncKitError } from "../../core/errors.js";
|
|
2
3
|
export declare const SYNC_KIT_APP_ID_PROPERTY = "sync-kit-app-id";
|
|
3
4
|
export declare const SYNC_KIT_KIND_PROPERTY = "sync-kit-kind";
|
|
4
5
|
export declare const SYNC_KIT_DATASET_ID_PROPERTY = "sync-kit-dataset-id";
|
|
@@ -108,6 +109,20 @@ export type DriveFileWriteResult = {
|
|
|
108
109
|
fileId: string;
|
|
109
110
|
etag?: string;
|
|
110
111
|
};
|
|
112
|
+
export type DriveV2WriteHead = {
|
|
113
|
+
etag: string;
|
|
114
|
+
headRevisionId?: string;
|
|
115
|
+
};
|
|
116
|
+
export type DriveV2WriteResult = {
|
|
117
|
+
fileId: string;
|
|
118
|
+
etag: string;
|
|
119
|
+
headRevisionId?: string;
|
|
120
|
+
};
|
|
121
|
+
/** Thrown when Drive v2 endpoints are gone; callers may fall back to v3. */
|
|
122
|
+
export declare class DriveV2UnavailableError extends SyncKitError {
|
|
123
|
+
constructor(options?: ErrorOptions);
|
|
124
|
+
}
|
|
125
|
+
export declare function isDriveV2UnavailableError(value: unknown): value is DriveV2UnavailableError;
|
|
111
126
|
export type DrivePermission = {
|
|
112
127
|
permissionId: string;
|
|
113
128
|
type: "user" | "group" | "domain" | "anyone";
|
|
@@ -138,6 +153,11 @@ export declare class GoogleDriveFileStore {
|
|
|
138
153
|
create(name: string, content: DriveContent, authorization: Authorization, options?: GoogleDriveFileCreateOptions): Promise<string>;
|
|
139
154
|
createFolder(name: string, authorization: Authorization, options?: Omit<GoogleDriveFileCreateOptions, "contentType">): Promise<string>;
|
|
140
155
|
write(fileId: string, content: DriveContent, authorization: Authorization, options?: string | GoogleDriveFileWriteOptions): Promise<DriveFileWriteResult>;
|
|
156
|
+
getV2WriteHead(fileId: string, authorization: Authorization): Promise<DriveV2WriteHead>;
|
|
157
|
+
writeV2Media(fileId: string, content: DriveContent, authorization: Authorization, options: {
|
|
158
|
+
ifMatch: string;
|
|
159
|
+
contentType?: string;
|
|
160
|
+
}): Promise<DriveV2WriteResult>;
|
|
141
161
|
share(fileId: string, emailAddress: string, role: DriveFileRole, authorization: Authorization, options?: {
|
|
142
162
|
sendNotificationEmail?: boolean;
|
|
143
163
|
emailMessage?: string;
|
|
@@ -186,4 +206,6 @@ export declare class GoogleDriveFileSnapshotStore<E> implements CloudStore<E, Au
|
|
|
186
206
|
private fileProperties;
|
|
187
207
|
private assertAppId;
|
|
188
208
|
}
|
|
209
|
+
export { buildSyncKitFolderName, sanitizeDriveFolderName, type SyncKitFolderNameInput, } from "./folder-name.js";
|
|
210
|
+
export { listAccessibleSyncKitAppFolders, type ListAccessibleSyncKitAppFoldersOptions, type SyncKitAppFolder, } from "./app-folders.js";
|
|
189
211
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stores/google-drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACf,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stores/google-drive/index.ts"],"names":[],"mappings":"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"}
|