@keyneom/sync-kit 0.1.1 → 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.
Files changed (100) hide show
  1. package/README.md +103 -8
  2. package/dist/auth/google-web/cache.d.ts +46 -0
  3. package/dist/auth/google-web/cache.d.ts.map +1 -0
  4. package/dist/auth/google-web/cache.js +111 -0
  5. package/dist/auth/google-web/cache.js.map +1 -0
  6. package/dist/auth/google-web/identity.d.ts +49 -0
  7. package/dist/auth/google-web/identity.d.ts.map +1 -0
  8. package/dist/auth/google-web/identity.js +102 -0
  9. package/dist/auth/google-web/identity.js.map +1 -0
  10. package/dist/auth/google-web/index.d.ts +1 -0
  11. package/dist/auth/google-web/index.d.ts.map +1 -1
  12. package/dist/auth/google-web/index.js +1 -0
  13. package/dist/auth/google-web/index.js.map +1 -1
  14. package/dist/core/errors.d.ts +1 -1
  15. package/dist/core/errors.d.ts.map +1 -1
  16. package/dist/core/errors.js +22 -1
  17. package/dist/core/errors.js.map +1 -1
  18. package/dist/crypto/canonical.d.ts +5 -0
  19. package/dist/crypto/canonical.d.ts.map +1 -1
  20. package/dist/crypto/canonical.js +8 -1
  21. package/dist/crypto/canonical.js.map +1 -1
  22. package/dist/crypto/envelope.d.ts.map +1 -1
  23. package/dist/crypto/envelope.js +1 -0
  24. package/dist/crypto/envelope.js.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/keys/web-passkey/index.d.ts +8 -2
  30. package/dist/keys/web-passkey/index.d.ts.map +1 -1
  31. package/dist/keys/web-passkey/index.js +32 -10
  32. package/dist/keys/web-passkey/index.js.map +1 -1
  33. package/dist/sharing/account-binding.d.ts +57 -0
  34. package/dist/sharing/account-binding.d.ts.map +1 -0
  35. package/dist/sharing/account-binding.js +305 -0
  36. package/dist/sharing/account-binding.js.map +1 -0
  37. package/dist/sharing/change-detector.d.ts +40 -0
  38. package/dist/sharing/change-detector.d.ts.map +1 -0
  39. package/dist/sharing/change-detector.js +96 -0
  40. package/dist/sharing/change-detector.js.map +1 -0
  41. package/dist/sharing/checkpoint.d.ts +32 -0
  42. package/dist/sharing/checkpoint.d.ts.map +1 -0
  43. package/dist/sharing/checkpoint.js +2 -0
  44. package/dist/sharing/checkpoint.js.map +1 -0
  45. package/dist/sharing/controller.d.ts +169 -0
  46. package/dist/sharing/controller.d.ts.map +1 -0
  47. package/dist/sharing/controller.js +693 -0
  48. package/dist/sharing/controller.js.map +1 -0
  49. package/dist/sharing/index.d.ts +122 -0
  50. package/dist/sharing/index.d.ts.map +1 -0
  51. package/dist/sharing/index.js +362 -0
  52. package/dist/sharing/index.js.map +1 -0
  53. package/dist/sharing/join.d.ts +56 -0
  54. package/dist/sharing/join.d.ts.map +1 -0
  55. package/dist/sharing/join.js +153 -0
  56. package/dist/sharing/join.js.map +1 -0
  57. package/dist/sharing/lifecycle.d.ts +20 -0
  58. package/dist/sharing/lifecycle.d.ts.map +1 -0
  59. package/dist/sharing/lifecycle.js +55 -0
  60. package/dist/sharing/lifecycle.js.map +1 -0
  61. package/dist/sharing/registry-indexeddb.d.ts +21 -0
  62. package/dist/sharing/registry-indexeddb.d.ts.map +1 -0
  63. package/dist/sharing/registry-indexeddb.js +60 -0
  64. package/dist/sharing/registry-indexeddb.js.map +1 -0
  65. package/dist/sharing/transport.d.ts +75 -0
  66. package/dist/sharing/transport.d.ts.map +1 -0
  67. package/dist/sharing/transport.js +2 -0
  68. package/dist/sharing/transport.js.map +1 -0
  69. package/dist/sharing/web-crypto.d.ts +68 -0
  70. package/dist/sharing/web-crypto.d.ts.map +1 -0
  71. package/dist/sharing/web-crypto.js +645 -0
  72. package/dist/sharing/web-crypto.js.map +1 -0
  73. package/dist/sharing/web-passkey.d.ts +68 -0
  74. package/dist/sharing/web-passkey.d.ts.map +1 -0
  75. package/dist/sharing/web-passkey.js +303 -0
  76. package/dist/sharing/web-passkey.js.map +1 -0
  77. package/dist/snapshot/controller.d.ts.map +1 -1
  78. package/dist/snapshot/controller.js +4 -8
  79. package/dist/snapshot/controller.js.map +1 -1
  80. package/dist/stores/google-drive/app-folders.d.ts +19 -0
  81. package/dist/stores/google-drive/app-folders.d.ts.map +1 -0
  82. package/dist/stores/google-drive/app-folders.js +38 -0
  83. package/dist/stores/google-drive/app-folders.js.map +1 -0
  84. package/dist/stores/google-drive/folder-name.d.ts +16 -0
  85. package/dist/stores/google-drive/folder-name.d.ts.map +1 -0
  86. package/dist/stores/google-drive/folder-name.js +37 -0
  87. package/dist/stores/google-drive/folder-name.js.map +1 -0
  88. package/dist/stores/google-drive/index.d.ts +149 -1
  89. package/dist/stores/google-drive/index.d.ts.map +1 -1
  90. package/dist/stores/google-drive/index.js +399 -0
  91. package/dist/stores/google-drive/index.js.map +1 -1
  92. package/dist/stores/google-drive/picker.d.ts +89 -0
  93. package/dist/stores/google-drive/picker.d.ts.map +1 -0
  94. package/dist/stores/google-drive/picker.js +179 -0
  95. package/dist/stores/google-drive/picker.js.map +1 -0
  96. package/dist/stores/google-drive/sharing.d.ts +57 -0
  97. package/dist/stores/google-drive/sharing.d.ts.map +1 -0
  98. package/dist/stores/google-drive/sharing.js +325 -0
  99. package/dist/stores/google-drive/sharing.js.map +1 -0
  100. package/package.json +78 -10
@@ -0,0 +1,153 @@
1
+ import { SyncKitError } from "../core/errors.js";
2
+ export const SHARING_JOIN_MARKER_PARAM = "sync-kit-join";
3
+ export const SHARING_JOIN_EXCHANGE_PARAM = "sync-kit-exchange";
4
+ export const SHARING_JOIN_FOLDER_PARAM = "sync-kit-folder";
5
+ /** Common consumer alias: `?sync=join&folder=…` with optional `exchange=…` */
6
+ export const SHARING_JOIN_SHORT_MARKER_PARAM = "sync";
7
+ export const SHARING_JOIN_SHORT_MARKER_VALUE = "join";
8
+ export const SHARING_JOIN_SHORT_EXCHANGE_PARAM = "exchange";
9
+ export const SHARING_JOIN_SHORT_FOLDER_PARAM = "folder";
10
+ /**
11
+ * Parses a join URL or query string. Returns null when the input is not a
12
+ * recognized sharing join link. The app folder ID is required; exchange ID is
13
+ * optional and only needed to disambiguate multiple pending invitations.
14
+ */
15
+ export function parseSharingJoinParams(input) {
16
+ const params = toSearchParams(input);
17
+ const appFolderId = readJoinParam(params, [
18
+ SHARING_JOIN_FOLDER_PARAM,
19
+ SHARING_JOIN_SHORT_FOLDER_PARAM,
20
+ ]);
21
+ if (!appFolderId || !isJoinMarkerPresent(params))
22
+ return null;
23
+ const exchangeId = readJoinParam(params, [
24
+ SHARING_JOIN_EXCHANGE_PARAM,
25
+ SHARING_JOIN_SHORT_EXCHANGE_PARAM,
26
+ ]);
27
+ return {
28
+ appFolderId,
29
+ ...(exchangeId ? { exchangeId } : {}),
30
+ };
31
+ }
32
+ /**
33
+ * Builds join query params for appending to a consumer landing URL.
34
+ */
35
+ export function buildSharingJoinSearchParams(params, style = "sync-kit") {
36
+ if (!params.appFolderId.trim()) {
37
+ throw new TypeError("appFolderId must not be empty.");
38
+ }
39
+ const search = new URLSearchParams();
40
+ if (style === "short") {
41
+ search.set(SHARING_JOIN_SHORT_MARKER_PARAM, SHARING_JOIN_SHORT_MARKER_VALUE);
42
+ search.set(SHARING_JOIN_SHORT_FOLDER_PARAM, params.appFolderId);
43
+ if (params.exchangeId?.trim()) {
44
+ search.set(SHARING_JOIN_SHORT_EXCHANGE_PARAM, params.exchangeId);
45
+ }
46
+ return search;
47
+ }
48
+ search.set(SHARING_JOIN_MARKER_PARAM, "1");
49
+ search.set(SHARING_JOIN_FOLDER_PARAM, params.appFolderId);
50
+ if (params.exchangeId?.trim()) {
51
+ search.set(SHARING_JOIN_EXCHANGE_PARAM, params.exchangeId);
52
+ }
53
+ return search;
54
+ }
55
+ /**
56
+ * Appends join params to a consumer landing URL. The landing origin and path
57
+ * remain application-owned.
58
+ */
59
+ export function appendSharingJoinParams(landingUrl, params, style = "sync-kit") {
60
+ const url = new URL(landingUrl);
61
+ const joinParams = buildSharingJoinSearchParams(params, style);
62
+ for (const [key, value] of joinParams.entries()) {
63
+ url.searchParams.set(key, value);
64
+ }
65
+ return url.toString();
66
+ }
67
+ /**
68
+ * Formats a Drive sharing notification body that points recipients to the app
69
+ * join flow instead of relying on Google's folder-only notification.
70
+ */
71
+ export function formatSharingInviteEmailMessage(options) {
72
+ if (!options.joinUrl.trim()) {
73
+ throw new TypeError("joinUrl must not be empty.");
74
+ }
75
+ if (!options.appDisplayName.trim()) {
76
+ throw new TypeError("appDisplayName must not be empty.");
77
+ }
78
+ const intro = options.intro?.trim() ??
79
+ `You have been invited to share ${options.appDisplayName} data.`;
80
+ return `${intro}\n\nOpen this link to join in ${options.appDisplayName}:\n${options.joinUrl.trim()}`;
81
+ }
82
+ /**
83
+ * Finds a pending invitation file for a join exchange ID inside the transport's
84
+ * current app folder.
85
+ */
86
+ export async function findSharingJoinInvitation(transport, exchangeId) {
87
+ if (!exchangeId.trim())
88
+ throw new TypeError("exchangeId must not be empty.");
89
+ const exchanges = await transport.listExchanges({
90
+ exchangeId,
91
+ kind: "invitation",
92
+ });
93
+ const invitationFile = exchanges[0];
94
+ if (!invitationFile)
95
+ return null;
96
+ const invitation = await transport.readInvitation(invitationFile.fileId);
97
+ return { invitationFileId: invitationFile.fileId, invitation };
98
+ }
99
+ /**
100
+ * Resolves join params against a transport whose app folder already matches
101
+ * `params.appFolderId` (typically via `selectedAppFolderId`). When exchange ID
102
+ * is omitted, the sole pending invitation in the folder is used.
103
+ */
104
+ export async function resolveSharingJoinInvitation(transport, params) {
105
+ const storage = await transport.ensureStorage();
106
+ if (storage.appFolderId !== params.appFolderId) {
107
+ throw new SyncKitError("configuration", "The transport app folder does not match the join link.");
108
+ }
109
+ if (params.exchangeId) {
110
+ const match = await findSharingJoinInvitation(transport, params.exchangeId);
111
+ if (!match) {
112
+ throw new SyncKitError("not-found", "No invitation matches the join exchange ID.");
113
+ }
114
+ return match;
115
+ }
116
+ const invitations = await transport.listExchanges({ kind: "invitation" });
117
+ if (invitations.length === 0) {
118
+ throw new SyncKitError("not-found", "No pending invitation was found in the shared app folder.");
119
+ }
120
+ if (invitations.length > 1) {
121
+ throw new SyncKitError("state", "Multiple pending invitations were found; include exchangeId in the join link.");
122
+ }
123
+ const invitationFile = invitations[0];
124
+ if (!invitationFile) {
125
+ throw new SyncKitError("not-found", "No pending invitation was found in the shared app folder.");
126
+ }
127
+ const invitation = await transport.readInvitation(invitationFile.fileId);
128
+ return { invitationFileId: invitationFile.fileId, invitation };
129
+ }
130
+ function toSearchParams(input) {
131
+ if (input instanceof URLSearchParams)
132
+ return input;
133
+ if (input.startsWith("?"))
134
+ return new URLSearchParams(input.slice(1));
135
+ if (input.includes("://")) {
136
+ return new URL(input).searchParams;
137
+ }
138
+ return new URLSearchParams(input);
139
+ }
140
+ function isJoinMarkerPresent(params) {
141
+ if (params.get(SHARING_JOIN_MARKER_PARAM) === "1")
142
+ return true;
143
+ return params.get(SHARING_JOIN_SHORT_MARKER_PARAM) === SHARING_JOIN_SHORT_MARKER_VALUE;
144
+ }
145
+ function readJoinParam(params, keys) {
146
+ for (const key of keys) {
147
+ const value = params.get(key);
148
+ if (value?.trim())
149
+ return value.trim();
150
+ }
151
+ return null;
152
+ }
153
+ //# sourceMappingURL=join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/sharing/join.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { SharingChangeDetectionResult, SharingSyncCheckpoint } from "./checkpoint.js";
2
+ import { SharingChangeDetector } from "./change-detector.js";
3
+ export type SharingPollBindingOptions = {
4
+ intervalMs?: number;
5
+ pollOnForeground?: boolean;
6
+ minimumBackgroundMs?: number;
7
+ window?: Window;
8
+ document?: Document;
9
+ now?: () => number;
10
+ };
11
+ export type SharingPollController = {
12
+ poll(): Promise<SharingChangeDetectionResult>;
13
+ stop(): void;
14
+ };
15
+ /**
16
+ * Foreground polling hook for Tier A sharing change detection. Does not show
17
+ * notifications; applications map events to UI or service-worker messages.
18
+ */
19
+ export declare function bindSharingPoll(detector: SharingChangeDetector, checkpoint: SharingSyncCheckpoint, onResult: (result: SharingChangeDetectionResult) => void | Promise<void>, options?: SharingPollBindingOptions): SharingPollController;
20
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/sharing/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC9C,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,4BAA4B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxE,OAAO,GAAE,yBAA8B,GACtC,qBAAqB,CA6DvB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Foreground polling hook for Tier A sharing change detection. Does not show
3
+ * notifications; applications map events to UI or service-worker messages.
4
+ */
5
+ export function bindSharingPoll(detector, checkpoint, onResult, options = {}) {
6
+ const documentImplementation = options.document ?? document;
7
+ const now = options.now ?? Date.now;
8
+ let currentCheckpoint = structuredClone(checkpoint);
9
+ let hiddenAt = null;
10
+ let intervalId = null;
11
+ const poll = async () => {
12
+ const result = await detector.detect(currentCheckpoint);
13
+ currentCheckpoint = result.checkpoint;
14
+ await onResult(result);
15
+ return result;
16
+ };
17
+ const startInterval = () => {
18
+ if (intervalId !== null)
19
+ return;
20
+ const intervalMs = options.intervalMs ?? 60_000;
21
+ intervalId = setInterval(() => {
22
+ void poll();
23
+ }, intervalMs);
24
+ };
25
+ const stopInterval = () => {
26
+ if (intervalId === null)
27
+ return;
28
+ clearInterval(intervalId);
29
+ intervalId = null;
30
+ };
31
+ const visibilityChanged = () => {
32
+ if (documentImplementation.visibilityState === "hidden") {
33
+ hiddenAt = now();
34
+ stopInterval();
35
+ return;
36
+ }
37
+ const timeAway = hiddenAt === null ? 0 : now() - hiddenAt;
38
+ hiddenAt = null;
39
+ if (options.pollOnForeground !== false &&
40
+ timeAway >= (options.minimumBackgroundMs ?? 30_000)) {
41
+ void poll();
42
+ }
43
+ startInterval();
44
+ };
45
+ documentImplementation.addEventListener("visibilitychange", visibilityChanged);
46
+ startInterval();
47
+ return {
48
+ poll,
49
+ stop: () => {
50
+ stopInterval();
51
+ documentImplementation.removeEventListener("visibilitychange", visibilityChanged);
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/sharing/lifecycle.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,QAA+B,EAC/B,UAAiC,EACjC,QAAwE,EACxE,UAAqC,EAAE;IAEvC,MAAM,sBAAsB,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,IAAI,iBAAiB,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,UAAU,GAA0C,IAAI,CAAC;IAE7D,MAAM,IAAI,GAAG,KAAK,IAA2C,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxD,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC;QACtC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;QAChD,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO;QAChC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,sBAAsB,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;YACxD,QAAQ,GAAG,GAAG,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAC1D,QAAQ,GAAG,IAAI,CAAC;QAChB,IACE,OAAO,CAAC,gBAAgB,KAAK,KAAK;YAClC,QAAQ,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,MAAM,CAAC,EACnD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QACD,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,sBAAsB,CAAC,gBAAgB,CACrC,kBAAkB,EAClB,iBAAiB,CAClB,CAAC;IACF,aAAa,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,GAAG,EAAE;YACT,YAAY,EAAE,CAAC;YACf,sBAAsB,CAAC,mBAAmB,CACxC,kBAAkB,EAClB,iBAAiB,CAClB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -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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"}
@@ -0,0 +1,75 @@
1
+ import type { SharedBackupEnvelopeV1, SharingInvitationV1, SharingPublicKeyResponseV1, SharingRole } from "./index.js";
2
+ import type { SharedDatasetHead } from "./checkpoint.js";
3
+ export type { SharedDatasetHead } from "./checkpoint.js";
4
+ export type SharedBackupStorage = {
5
+ appFolderId: string;
6
+ exchangesFolderId: string;
7
+ };
8
+ export type SharedDatasetFile = {
9
+ datasetId: string;
10
+ fileId: string;
11
+ name: string;
12
+ canEdit?: boolean;
13
+ };
14
+ export type VersionedSharedDataset = SharedDatasetFile & {
15
+ envelope: SharedBackupEnvelopeV1;
16
+ version: string;
17
+ };
18
+ export type SharedExchangeFile = {
19
+ fileId: string;
20
+ exchangeId: string;
21
+ kind: "invitation" | "key-response";
22
+ keyId?: string;
23
+ createdTime?: string;
24
+ };
25
+ export type SharedKeyResponseFile = {
26
+ fileId: string;
27
+ response: SharingPublicKeyResponseV1;
28
+ ownerPermissionId: string;
29
+ };
30
+ export type SharedDatasetPermission = {
31
+ permissionId?: string;
32
+ role: "reader" | "writer";
33
+ };
34
+ export type SharedDatasetDrivePermission = {
35
+ permissionId: string;
36
+ role: "reader" | "writer";
37
+ emailAddress?: string;
38
+ inherited: boolean;
39
+ };
40
+ /**
41
+ * Client-side transport required by the sharing controller. Implementations
42
+ * may use Google Drive or another provider, but cannot depend on a trusted app
43
+ * backend.
44
+ */
45
+ export interface SharedBackupTransport {
46
+ ensureStorage(): Promise<SharedBackupStorage>;
47
+ listDatasets(): Promise<SharedDatasetFile[]>;
48
+ readDataset(fileId: string): Promise<VersionedSharedDataset>;
49
+ createDataset(datasetId: string, envelope: SharedBackupEnvelopeV1): Promise<VersionedSharedDataset>;
50
+ writeDataset(current: VersionedSharedDataset, envelope: SharedBackupEnvelopeV1): Promise<VersionedSharedDataset>;
51
+ grantExchangeAccess(emailAddress: string, options?: {
52
+ sendNotificationEmail?: boolean;
53
+ emailMessage?: string;
54
+ }): Promise<{
55
+ drivePermissionId: string;
56
+ appFolderId: string;
57
+ }>;
58
+ createInvitation(invitation: SharingInvitationV1): Promise<string>;
59
+ createKeyResponse(response: SharingPublicKeyResponseV1): Promise<string>;
60
+ listExchanges(options?: {
61
+ exchangeId?: string;
62
+ kind?: SharedExchangeFile["kind"];
63
+ }): Promise<SharedExchangeFile[]>;
64
+ readInvitation(fileId: string): Promise<SharingInvitationV1>;
65
+ readKeyResponse(fileId: string, expectedDrivePermissionId: string): Promise<SharedKeyResponseFile>;
66
+ deleteExchange(fileId: string): Promise<void>;
67
+ setDatasetPermission(fileId: string, emailAddress: string, role: Exclude<SharingRole, "owner" | "admin"> | "admin", options?: {
68
+ existingDirectPermissionId?: string;
69
+ hasInheritedReadAccess?: boolean;
70
+ }): Promise<SharedDatasetPermission>;
71
+ removeDatasetPermission(fileId: string, permissionId: string): Promise<void>;
72
+ listDatasetPermissions(fileId: string): Promise<SharedDatasetDrivePermission[]>;
73
+ listDatasetHeads(): Promise<SharedDatasetHead[]>;
74
+ }
75
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/sharing/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/sharing/transport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { type SharedBackupCodec, type SharedBackupEnvelopeV1, type SharingAcceptanceProvenanceV1, type SharingAccountBindingV1, type SharingDatasetGrantV1, type SharingPublicKeyResponseV1, type SharingPublicKeyV1, type SharingInvitationV1, type SharingRole } from "./index.js";
2
+ export type WebCryptoSharingIdentity = {
3
+ publicKey: SharingPublicKeyV1;
4
+ encryptionPrivateKey: CryptoKey;
5
+ signingPrivateKey: CryptoKey;
6
+ };
7
+ export type SharedBackupParticipantInput = {
8
+ publicKey: SharingPublicKeyV1;
9
+ role: SharingRole;
10
+ accepted?: SharingAcceptanceProvenanceV1;
11
+ };
12
+ export type AcceptedSharingGrantV1 = {
13
+ datasetId: string;
14
+ participant: SharedBackupParticipantInput;
15
+ };
16
+ export type WebCryptoSharingOptions = {
17
+ crypto?: Crypto;
18
+ now?: () => Date;
19
+ randomUUID?: () => string;
20
+ };
21
+ export declare function createWebCryptoSharingIdentity(cryptoImplementation?: Crypto): Promise<WebCryptoSharingIdentity>;
22
+ export declare function createSharingPublicKeyResponseV1(identity: WebCryptoSharingIdentity, input: {
23
+ appId: string;
24
+ exchangeId: string;
25
+ createdAt?: string;
26
+ accountBinding?: SharingAccountBindingV1;
27
+ }, options?: WebCryptoSharingOptions): Promise<SharingPublicKeyResponseV1>;
28
+ export declare function createSharingInvitationV1(identity: WebCryptoSharingIdentity, input: {
29
+ appId: string;
30
+ appFolderId: string;
31
+ exchangeId?: string;
32
+ recipientDrivePermissionId: string;
33
+ requestedGrants: SharingDatasetGrantV1[];
34
+ trustedOwnerKeyId?: string;
35
+ createdAt?: string;
36
+ expiresAt?: string;
37
+ }, options?: WebCryptoSharingOptions): Promise<SharingInvitationV1>;
38
+ export declare function acceptSharingPublicKeyResponseV1(invitationInput: unknown, responseInput: unknown, input: {
39
+ acceptedByKeyId: string;
40
+ drivePermissionId: string;
41
+ acceptedAt?: string;
42
+ googleSubject?: string;
43
+ }, options?: WebCryptoSharingOptions): Promise<AcceptedSharingGrantV1[]>;
44
+ export declare function verifySharingInvitationV1(input: unknown, options?: {
45
+ crypto?: Crypto;
46
+ now?: () => Date;
47
+ }): Promise<SharingInvitationV1>;
48
+ export declare function verifySharingPublicKeyResponseV1(input: unknown, cryptoImplementation?: Crypto): Promise<SharingPublicKeyResponseV1>;
49
+ export declare function createSharedBackupEnvelopeV1<T>(value: T, codec: SharedBackupCodec<T>, identity: WebCryptoSharingIdentity, input: {
50
+ appId: string;
51
+ backupId: string;
52
+ participants: SharedBackupParticipantInput[];
53
+ previous?: SharedBackupEnvelopeV1;
54
+ keyRotation?: {
55
+ previousIdentity: WebCryptoSharingIdentity;
56
+ };
57
+ revisionId?: string;
58
+ createdAt?: string;
59
+ }, options?: WebCryptoSharingOptions): Promise<SharedBackupEnvelopeV1>;
60
+ export declare function verifySharedBackupEnvelopeV1(input: unknown, cryptoImplementation?: Crypto, options?: {
61
+ trustedOwnerKeyId?: string;
62
+ }): Promise<SharedBackupEnvelopeV1>;
63
+ export declare function decryptSharedBackupEnvelopeV1<T>(input: unknown, codec: Pick<SharedBackupCodec<T>, "parse">, identity: WebCryptoSharingIdentity, cryptoImplementation?: Crypto, options?: {
64
+ trustedOwnerKeyId?: string;
65
+ }): Promise<T>;
66
+ export declare function sharingKeyFingerprint(keyId: string): string;
67
+ export declare function createSharingPublicKeyV1(encryptionPublicKey: string, signingPublicKey: string, cryptoImplementation: Crypto): Promise<SharingPublicKeyV1>;
68
+ //# sourceMappingURL=web-crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-crypto.d.ts","sourceRoot":"","sources":["../../src/sharing/web-crypto.ts"],"names":[],"mappings":"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"}