@keyneom/sync-kit 0.1.1 → 0.2.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -8
- package/dist/auth/google-web/identity.d.ts +49 -0
- package/dist/auth/google-web/identity.d.ts.map +1 -0
- package/dist/auth/google-web/identity.js +102 -0
- package/dist/auth/google-web/identity.js.map +1 -0
- package/dist/auth/google-web/index.d.ts +1 -0
- package/dist/auth/google-web/index.d.ts.map +1 -1
- package/dist/auth/google-web/index.js +1 -0
- package/dist/auth/google-web/index.js.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +22 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/crypto/canonical.d.ts +5 -0
- package/dist/crypto/canonical.d.ts.map +1 -1
- package/dist/crypto/canonical.js +8 -1
- package/dist/crypto/canonical.js.map +1 -1
- package/dist/crypto/envelope.d.ts.map +1 -1
- package/dist/crypto/envelope.js +1 -0
- package/dist/crypto/envelope.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/keys/web-passkey/index.d.ts +8 -2
- package/dist/keys/web-passkey/index.d.ts.map +1 -1
- package/dist/keys/web-passkey/index.js +32 -10
- package/dist/keys/web-passkey/index.js.map +1 -1
- package/dist/sharing/account-binding.d.ts +57 -0
- package/dist/sharing/account-binding.d.ts.map +1 -0
- package/dist/sharing/account-binding.js +305 -0
- package/dist/sharing/account-binding.js.map +1 -0
- package/dist/sharing/controller.d.ts +139 -0
- package/dist/sharing/controller.d.ts.map +1 -0
- package/dist/sharing/controller.js +549 -0
- package/dist/sharing/controller.js.map +1 -0
- package/dist/sharing/index.d.ts +119 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/index.js +360 -0
- package/dist/sharing/index.js.map +1 -0
- package/dist/sharing/transport.d.ts +65 -0
- package/dist/sharing/transport.d.ts.map +1 -0
- package/dist/sharing/transport.js +2 -0
- package/dist/sharing/transport.js.map +1 -0
- package/dist/sharing/web-crypto.d.ts +68 -0
- package/dist/sharing/web-crypto.d.ts.map +1 -0
- package/dist/sharing/web-crypto.js +645 -0
- package/dist/sharing/web-crypto.js.map +1 -0
- package/dist/sharing/web-passkey.d.ts +68 -0
- package/dist/sharing/web-passkey.d.ts.map +1 -0
- package/dist/sharing/web-passkey.js +303 -0
- package/dist/sharing/web-passkey.js.map +1 -0
- package/dist/snapshot/controller.d.ts.map +1 -1
- package/dist/snapshot/controller.js +4 -8
- package/dist/snapshot/controller.js.map +1 -1
- package/dist/stores/google-drive/index.d.ts +147 -1
- package/dist/stores/google-drive/index.d.ts.map +1 -1
- package/dist/stores/google-drive/index.js +397 -0
- package/dist/stores/google-drive/index.js.map +1 -1
- package/dist/stores/google-drive/picker.d.ts +89 -0
- package/dist/stores/google-drive/picker.d.ts.map +1 -0
- package/dist/stores/google-drive/picker.js +179 -0
- package/dist/stores/google-drive/picker.js.map +1 -0
- package/dist/stores/google-drive/sharing.d.ts +55 -0
- package/dist/stores/google-drive/sharing.d.ts.map +1 -0
- package/dist/stores/google-drive/sharing.js +295 -0
- package/dist/stores/google-drive/sharing.js.map +1 -0
- package/package.json +67 -10
package/README.md
CHANGED
|
@@ -7,12 +7,39 @@ The package extracts the behavior already implemented by EasyBC and Family
|
|
|
7
7
|
Chores. It does not own application schemas, merge policy, persistence, UI, or
|
|
8
8
|
lifecycle policy.
|
|
9
9
|
|
|
10
|
+
## Backend-independent by design
|
|
11
|
+
|
|
12
|
+
A primary package objective is to let a static frontend provide encrypted sync
|
|
13
|
+
and multi-user sharing without an application-owned trusted backend. The
|
|
14
|
+
complete interactive flow must be implementable with browser cryptography and
|
|
15
|
+
passkeys, Google Identity Services, and Google Drive:
|
|
16
|
+
|
|
17
|
+
- no server-held client secret or refresh token;
|
|
18
|
+
- no application database, certificate signer, or authorization service;
|
|
19
|
+
- no server required to encrypt, decrypt, invite, accept, reconcile access, or
|
|
20
|
+
publish a signed revision.
|
|
21
|
+
|
|
22
|
+
Google remains the OAuth, identity, and storage provider. Participant keys,
|
|
23
|
+
signed access-control history, and the pinned owner key remain the
|
|
24
|
+
cryptographic authority. An optional backend adapter may add unattended jobs,
|
|
25
|
+
notifications, or operational automation, but package correctness and
|
|
26
|
+
interoperability must never depend on one.
|
|
27
|
+
|
|
28
|
+
Backendless browser deployments operate while the app is open and may need
|
|
29
|
+
user interaction when OAuth access expires or a passkey ceremony is required.
|
|
30
|
+
That limitation must not be hidden by broad Drive scopes or by making a
|
|
31
|
+
backend mandatory.
|
|
32
|
+
|
|
10
33
|
## Status
|
|
11
34
|
|
|
12
|
-
Version `0.1.
|
|
13
|
-
|
|
35
|
+
Version `0.1.1` was published to npm on 2026-06-30. It removes the
|
|
36
|
+
application-specific runtime presets from `0.1.0` and keeps compatibility
|
|
14
37
|
profiles consumer-owned.
|
|
15
38
|
|
|
39
|
+
The current worktree is the unpublished `0.2.0-rc.0` sharing release
|
|
40
|
+
candidate. Publication remains gated on live Google validation and one
|
|
41
|
+
external consumer integration.
|
|
42
|
+
|
|
16
43
|
The tests in this repository cover frozen compatibility vectors, mocked
|
|
17
44
|
browser providers, package orchestration, and installation/imports from the
|
|
18
45
|
packed tarball. They do not install this package into EasyBC, Family Chores, or
|
|
@@ -87,12 +114,28 @@ Available exports:
|
|
|
87
114
|
optional gzip, and canonical JSON/AAD helpers
|
|
88
115
|
- `/snapshot` — serialized snapshot synchronization
|
|
89
116
|
- `/snapshot/lifecycle` — opt-in browser lifecycle binding
|
|
117
|
+
- `/sharing` — browser-independent shared-backup protocol types, validation,
|
|
118
|
+
roles, invitations, and signed multi-recipient envelopes
|
|
119
|
+
- `/sharing/web-crypto` — P-256 identities, ECDH key grants, signed revisions,
|
|
120
|
+
invitation/key-response proofs, and decryption
|
|
121
|
+
- `/sharing/controller` — headless multi-dataset orchestration, owner pinning,
|
|
122
|
+
serialized writes, exchange processing, roles, and revocation
|
|
123
|
+
- `/sharing/web-passkey` — passkey-encrypted sharing identities with
|
|
124
|
+
non-extractable runtime keys and optional IndexedDB ciphertext storage
|
|
125
|
+
- `/sharing/account-binding` — backendless Google ID-token and WebAuthn
|
|
126
|
+
challenge binding, signature verification, and account provenance
|
|
90
127
|
- `/keys/web-passkey` — WebAuthn PRF keys with exact credential selection,
|
|
91
128
|
unlock coalescing, raw-secret zeroing, and explicit cache clearing
|
|
92
129
|
- `/auth/google-web` — Google Identity Services with memory-only token reuse,
|
|
93
130
|
expiry skew, request coalescing, and explicit invalidation
|
|
94
|
-
- `/
|
|
95
|
-
|
|
131
|
+
- `/auth/google-web/identity` — uncached nonce-bound Google ID tokens for
|
|
132
|
+
account-binding exchanges
|
|
133
|
+
- `/stores/google-drive` — low-level `appDataFolder` objects, a typed snapshot
|
|
134
|
+
wrapper, and normal-Drive folder/per-file stores
|
|
135
|
+
- `/stores/google-drive/sharing` — managed app/exchange folders, conditional
|
|
136
|
+
dataset writes, provenance checks, and per-dataset permissions
|
|
137
|
+
- `/stores/google-drive/picker` — explicit folder Picker and Drive Open-with
|
|
138
|
+
state parsing
|
|
96
139
|
|
|
97
140
|
The root, `/core`, `/crypto`, and `/snapshot` expose no browser adapter.
|
|
98
141
|
Browser globals and script loading are used only after an explicit browser
|
|
@@ -136,12 +179,14 @@ matches the remote value.
|
|
|
136
179
|
The wire protocol is the native compatibility boundary; the browser adapter is
|
|
137
180
|
not.
|
|
138
181
|
|
|
139
|
-
-
|
|
140
|
-
|
|
182
|
+
- **Android:** `com.keyneom:sync-kit-android` (module `android/synckit`) provides
|
|
183
|
+
private v1 snapshot crypto, `SnapshotSyncController`, Drive `appDataFolder`
|
|
184
|
+
storage, and Credential Manager passkey PRF — the same contracts as the npm
|
|
185
|
+
`/crypto`, `/snapshot`, and appData store paths. See
|
|
186
|
+
[android-library.md](docs/android-library.md).
|
|
187
|
+
- Shared backups (`/sharing`) are TypeScript-only for now.
|
|
141
188
|
- React Native and other JavaScript-native runtimes can inject a
|
|
142
189
|
`CryptoBackend<K>` backed by platform crypto.
|
|
143
|
-
- Kotlin and Swift applications implement the small key, authorization, store,
|
|
144
|
-
and crypto contracts natively while consuming the shared fixtures.
|
|
145
190
|
- Tauri applications can use `/core`, `/crypto`, and the low-level Google Drive
|
|
146
191
|
object store, but should perform OAuth in the system browser through
|
|
147
192
|
Authorization Code + PKCE.
|
|
@@ -149,6 +194,52 @@ not.
|
|
|
149
194
|
See [native consumer guidance](docs/native-consumers.md) and the exact
|
|
150
195
|
[v1 compatibility contract](docs/compatibility-v1.md).
|
|
151
196
|
|
|
197
|
+
## Shared encrypted backups
|
|
198
|
+
|
|
199
|
+
The experimental sharing surface encrypts each revision with a fresh content
|
|
200
|
+
key, wraps that key to every participant's ECDH public key, and accepts writes
|
|
201
|
+
only when an owner/admin/writer signs the complete revision. Viewers receive a
|
|
202
|
+
decryption grant but are not authorized revision signers.
|
|
203
|
+
|
|
204
|
+
Sharing follows the package-wide backend-independent objective above. A static
|
|
205
|
+
frontend can execute the protocol directly against Google Drive; an
|
|
206
|
+
application-owned server is neither a trust root nor a deployment requirement.
|
|
207
|
+
|
|
208
|
+
Shared files use normal Google Drive storage with the per-file `drive.file`
|
|
209
|
+
scope. A recipient can select the shared app folder once through Google Picker,
|
|
210
|
+
after which the app reuses its ID for app-created children; broad access to
|
|
211
|
+
Drive is not required. `appDataFolder` files cannot be shared.
|
|
212
|
+
|
|
213
|
+
New integrations can use `GoogleDriveFileSnapshotStore`, which defaults to an
|
|
214
|
+
app-owned top-level folder:
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
Sync Kit - <appId>/
|
|
218
|
+
<consumer filename>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The folder name can be overridden. A selected parent folder is optional rather
|
|
222
|
+
than part of the default flow. Existing v1 consumers continue using
|
|
223
|
+
`GoogleDriveSnapshotStore` and `appDataFolder` until they explicitly migrate.
|
|
224
|
+
|
|
225
|
+
For shared data, the default policy makes the app folder readable to all app
|
|
226
|
+
participants, makes its `exchanges/` child writable, and upgrades selected
|
|
227
|
+
participants to writer on individual dataset files. This exposes filenames,
|
|
228
|
+
metadata, and ciphertext to app participants while cryptographic grants control
|
|
229
|
+
decryption. Applications needing metadata isolation can instead use direct file
|
|
230
|
+
sharing or limited-access subfolders.
|
|
231
|
+
|
|
232
|
+
See the [protocol and threat model](docs/shared-backups.md) and
|
|
233
|
+
[authoritative implementation handoff](docs/sharing-implementation-handoff.md).
|
|
234
|
+
The phased gates remain in the
|
|
235
|
+
[sharing execution plan](docs/sharing-execution-plan.md). The crypto and
|
|
236
|
+
per-file transport, Picker, protected identity, account binding, signed
|
|
237
|
+
ancestry/fork policy, key rotation, and controller primitives are implemented.
|
|
238
|
+
The same sharing fixture is consumed by Java, and the packed package completes
|
|
239
|
+
an exchange/decryption smoke test. Live Google OAuth/Picker, Drive
|
|
240
|
+
conditional-write/permission validation, and adoption in an external consumer
|
|
241
|
+
remain release gates.
|
|
242
|
+
|
|
152
243
|
## Compatibility and isolation
|
|
153
244
|
|
|
154
245
|
Each application owns the profile that preserves its filename, AAD, HKDF
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
type GoogleCredentialResponse = {
|
|
2
|
+
credential?: string;
|
|
3
|
+
};
|
|
4
|
+
type PromptMomentNotification = {
|
|
5
|
+
isNotDisplayed(): boolean;
|
|
6
|
+
isSkippedMoment(): boolean;
|
|
7
|
+
getNotDisplayedReason?(): string;
|
|
8
|
+
getSkippedReason?(): string;
|
|
9
|
+
};
|
|
10
|
+
type GoogleIdentityWindow = Window & {
|
|
11
|
+
google?: {
|
|
12
|
+
accounts?: {
|
|
13
|
+
id?: {
|
|
14
|
+
initialize(options: {
|
|
15
|
+
client_id: string;
|
|
16
|
+
nonce: string;
|
|
17
|
+
callback(response: GoogleCredentialResponse): void;
|
|
18
|
+
auto_select?: boolean;
|
|
19
|
+
cancel_on_tap_outside?: boolean;
|
|
20
|
+
use_fedcm_for_prompt?: boolean;
|
|
21
|
+
}): void;
|
|
22
|
+
prompt(callback?: (notification: PromptMomentNotification) => void): void;
|
|
23
|
+
cancel(): void;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export type GoogleWebIdentityOptions = {
|
|
29
|
+
clientId: string;
|
|
30
|
+
window?: GoogleIdentityWindow;
|
|
31
|
+
document?: Document;
|
|
32
|
+
useFedCm?: boolean;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Requests a Google-signed ID token whose nonce is the sharing-account
|
|
36
|
+
* binding challenge. The token is returned to the caller and is not cached.
|
|
37
|
+
*/
|
|
38
|
+
export declare class GoogleWebIdentityProvider {
|
|
39
|
+
private readonly options;
|
|
40
|
+
private scriptPromise;
|
|
41
|
+
constructor(options: GoogleWebIdentityOptions);
|
|
42
|
+
requestIdToken(nonce: string): Promise<string>;
|
|
43
|
+
cancel(): void;
|
|
44
|
+
private loadScript;
|
|
45
|
+
private browserWindow;
|
|
46
|
+
private browserDocument;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/auth/google-web/identity.ts"],"names":[],"mappings":"AAEA,KAAK,wBAAwB,GAAG;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,cAAc,IAAI,OAAO,CAAC;IAC1B,eAAe,IAAI,OAAO,CAAC;IAC3B,qBAAqB,CAAC,IAAI,MAAM,CAAC;IACjC,gBAAgB,CAAC,IAAI,MAAM,CAAC;CAC7B,CAAC;AAEF,KAAK,oBAAoB,GAAG,MAAM,GAAG;IACnC,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE;YACT,EAAE,CAAC,EAAE;gBACH,UAAU,CAAC,OAAO,EAAE;oBAClB,SAAS,EAAE,MAAM,CAAC;oBAClB,KAAK,EAAE,MAAM,CAAC;oBACd,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAAC;oBACnD,WAAW,CAAC,EAAE,OAAO,CAAC;oBACtB,qBAAqB,CAAC,EAAE,OAAO,CAAC;oBAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;iBAChC,GAAG,IAAI,CAAC;gBACT,MAAM,CACJ,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,wBAAwB,KAAK,IAAI,GAC1D,IAAI,CAAC;gBACR,MAAM,IAAI,IAAI,CAAC;aAChB,CAAC;SACH,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,qBAAa,yBAAyB;IAGxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,aAAa,CAA8B;gBAEtB,OAAO,EAAE,wBAAwB;IAMxD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDpD,MAAM,IAAI,IAAI;IAId,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,eAAe;CAYxB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { SyncKitError } from "../../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Requests a Google-signed ID token whose nonce is the sharing-account
|
|
4
|
+
* binding challenge. The token is returned to the caller and is not cached.
|
|
5
|
+
*/
|
|
6
|
+
export class GoogleWebIdentityProvider {
|
|
7
|
+
options;
|
|
8
|
+
scriptPromise = null;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
if (!options.clientId.trim()) {
|
|
12
|
+
throw new TypeError("clientId must not be empty.");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async requestIdToken(nonce) {
|
|
16
|
+
if (!nonce.trim())
|
|
17
|
+
throw new TypeError("nonce must not be empty.");
|
|
18
|
+
await this.loadScript();
|
|
19
|
+
const identity = this.browserWindow().google?.accounts?.id;
|
|
20
|
+
if (!identity) {
|
|
21
|
+
throw new SyncKitError("authorization", "Google identity services are unavailable.");
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
let settled = false;
|
|
25
|
+
const fail = (message) => {
|
|
26
|
+
if (settled)
|
|
27
|
+
return;
|
|
28
|
+
settled = true;
|
|
29
|
+
reject(new SyncKitError("authorization", message));
|
|
30
|
+
};
|
|
31
|
+
identity.initialize({
|
|
32
|
+
client_id: this.options.clientId,
|
|
33
|
+
nonce,
|
|
34
|
+
auto_select: false,
|
|
35
|
+
cancel_on_tap_outside: true,
|
|
36
|
+
use_fedcm_for_prompt: this.options.useFedCm ?? true,
|
|
37
|
+
callback: (response) => {
|
|
38
|
+
if (settled)
|
|
39
|
+
return;
|
|
40
|
+
if (!response.credential) {
|
|
41
|
+
fail("Google did not return an identity token.");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
settled = true;
|
|
45
|
+
resolve(response.credential);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
identity.prompt((notification) => {
|
|
49
|
+
if (notification.isNotDisplayed()) {
|
|
50
|
+
fail(notification.getNotDisplayedReason?.() ??
|
|
51
|
+
"Google sign-in could not be displayed.");
|
|
52
|
+
}
|
|
53
|
+
else if (notification.isSkippedMoment()) {
|
|
54
|
+
fail(notification.getSkippedReason?.() ??
|
|
55
|
+
"Google sign-in was skipped.");
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
cancel() {
|
|
61
|
+
this.browserWindow().google?.accounts?.id?.cancel();
|
|
62
|
+
}
|
|
63
|
+
loadScript() {
|
|
64
|
+
if (this.browserWindow().google?.accounts?.id) {
|
|
65
|
+
return Promise.resolve();
|
|
66
|
+
}
|
|
67
|
+
if (this.scriptPromise)
|
|
68
|
+
return this.scriptPromise;
|
|
69
|
+
this.scriptPromise = new Promise((resolve, reject) => {
|
|
70
|
+
const script = this.browserDocument().createElement("script");
|
|
71
|
+
script.src = "https://accounts.google.com/gsi/client";
|
|
72
|
+
script.async = true;
|
|
73
|
+
script.defer = true;
|
|
74
|
+
script.onload = () => resolve();
|
|
75
|
+
script.onerror = () => {
|
|
76
|
+
this.scriptPromise = null;
|
|
77
|
+
reject(new SyncKitError("authorization", "Google identity services could not be loaded."));
|
|
78
|
+
};
|
|
79
|
+
this.browserDocument().head.append(script);
|
|
80
|
+
});
|
|
81
|
+
return this.scriptPromise;
|
|
82
|
+
}
|
|
83
|
+
browserWindow() {
|
|
84
|
+
const value = this.options.window ??
|
|
85
|
+
(typeof window === "undefined"
|
|
86
|
+
? undefined
|
|
87
|
+
: window);
|
|
88
|
+
if (!value) {
|
|
89
|
+
throw new SyncKitError("configuration", "Google identity requires a browser window.");
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
browserDocument() {
|
|
94
|
+
const value = this.options.document ??
|
|
95
|
+
(typeof document === "undefined" ? undefined : document);
|
|
96
|
+
if (!value) {
|
|
97
|
+
throw new SyncKitError("configuration", "Google identity requires a browser document.");
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/auth/google-web/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Authorization, AuthorizationProvider } from "../../core/types.js";
|
|
2
2
|
export declare const GOOGLE_DRIVE_APPDATA_SCOPE = "https://www.googleapis.com/auth/drive.appdata";
|
|
3
|
+
export declare const GOOGLE_DRIVE_FILE_SCOPE = "https://www.googleapis.com/auth/drive.file";
|
|
3
4
|
type TokenResponse = {
|
|
4
5
|
access_token?: string;
|
|
5
6
|
expires_in?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/google-web/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,0BAA0B,kDACU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/google-web/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,0BAA0B,kDACU,CAAC;AAClD,eAAO,MAAM,uBAAuB,+CACU,CAAC;AAE/C,KAAK,aAAa,GAAG;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QACR,MAAM,EAAE;YACN,eAAe,CAAC,MAAM,EAAE;gBACtB,SAAS,EAAE,MAAM,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC;gBACd,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;gBACxC,cAAc,CAAC,CAAC,KAAK,EAAE;oBAAE,IAAI,CAAC,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAC;aACjD,GAAG,WAAW,CAAC;SACjB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,qBAAa,8BACX,YAAW,qBAAqB,CAAC,aAAa,CAAC;IAOnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,UAAU,CAAK;gBAEM,OAAO,EAAE,6BAA6B;IAE7D,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAwBzC,KAAK,IAAI,IAAI;YAMC,YAAY;IAyD1B,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,QAAQ;CAYjB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SyncKitError } from "../../core/errors.js";
|
|
2
2
|
export const GOOGLE_DRIVE_APPDATA_SCOPE = "https://www.googleapis.com/auth/drive.appdata";
|
|
3
|
+
export const GOOGLE_DRIVE_FILE_SCOPE = "https://www.googleapis.com/auth/drive.file";
|
|
3
4
|
export class GoogleWebAuthorizationProvider {
|
|
4
5
|
options;
|
|
5
6
|
scriptPromise = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/google-web/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,0BAA0B,GACrC,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/google-web/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type SyncErrorCode = "authorization" | "compatibility" | "configuration" | "crypto" | "decompression" | "key" | "not-found" | "provider" | "serialization" | "state";
|
|
1
|
+
export type SyncErrorCode = "authorization" | "compatibility" | "configuration" | "conflict" | "crypto" | "decompression" | "key" | "not-found" | "provider" | "serialization" | "state";
|
|
2
2
|
export declare class SyncKitError extends Error {
|
|
3
3
|
readonly code: SyncErrorCode;
|
|
4
4
|
readonly status: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,eAAe,GACf,eAAe,GACf,QAAQ,GACR,eAAe,GACf,KAAK,GACL,WAAW,GACX,UAAU,GACV,eAAe,GACf,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,eAAe,GACf,eAAe,GACf,UAAU,GACV,QAAQ,GACR,eAAe,GACf,KAAK,GACL,WAAW,GACX,UAAU,GACV,eAAe,GACf,OAAO,CAAC;AAgBZ,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGlC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAY,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAOnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAUpE;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,GACd,YAAY,CAId"}
|
package/dist/core/errors.js
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
const SYNC_ERROR_CODES = new Set([
|
|
2
|
+
"authorization",
|
|
3
|
+
"compatibility",
|
|
4
|
+
"configuration",
|
|
5
|
+
"conflict",
|
|
6
|
+
"crypto",
|
|
7
|
+
"decompression",
|
|
8
|
+
"key",
|
|
9
|
+
"not-found",
|
|
10
|
+
"provider",
|
|
11
|
+
"serialization",
|
|
12
|
+
"state",
|
|
13
|
+
]);
|
|
1
14
|
export class SyncKitError extends Error {
|
|
2
15
|
code;
|
|
3
16
|
status;
|
|
@@ -9,7 +22,15 @@ export class SyncKitError extends Error {
|
|
|
9
22
|
}
|
|
10
23
|
}
|
|
11
24
|
export function isSyncKitError(value) {
|
|
12
|
-
|
|
25
|
+
if (value instanceof SyncKitError)
|
|
26
|
+
return true;
|
|
27
|
+
if (typeof value !== "object" || value === null)
|
|
28
|
+
return false;
|
|
29
|
+
const candidate = value;
|
|
30
|
+
return (candidate.name === "SyncKitError" &&
|
|
31
|
+
typeof candidate.message === "string" &&
|
|
32
|
+
typeof candidate.code === "string" &&
|
|
33
|
+
SYNC_ERROR_CODES.has(candidate.code));
|
|
13
34
|
}
|
|
14
35
|
export function asSyncKitError(value, code, message) {
|
|
15
36
|
return isSyncKitError(value)
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAaA,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAgB;IAC9C,eAAe;IACf,eAAe;IACf,eAAe;IACf,UAAU;IACV,QAAQ;IACR,eAAe;IACf,KAAK;IACL,WAAW;IACX,UAAU;IACV,eAAe;IACf,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAgB;IACpB,MAAM,CAAqB;IAEpC,YACE,IAAmB,EACnB,OAAe,EACf,UAA8C,EAAE;QAEhD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,KAA8D,CAAC;IACjF,OAAO,CACL,SAAS,CAAC,IAAI,KAAK,cAAc;QACjC,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAqB,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,IAAmB,EACnB,OAAe;IAEf,OAAO,cAAc,CAAC,KAAK,CAAC;QAC1B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export declare function canonicalJson(value: unknown): string;
|
|
2
2
|
export declare function canonicalAad(value: unknown): Uint8Array;
|
|
3
|
+
/**
|
|
4
|
+
* Compares strings by UTF-16 code units so canonicalization is independent of
|
|
5
|
+
* the host locale and matches Java String.compareTo.
|
|
6
|
+
*/
|
|
7
|
+
export declare function compareUtf16CodeUnits(left: string, right: string): number;
|
|
3
8
|
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/crypto/canonical.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAEvD"}
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/crypto/canonical.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzE"}
|
package/dist/crypto/canonical.js
CHANGED
|
@@ -5,6 +5,13 @@ export function canonicalJson(value) {
|
|
|
5
5
|
export function canonicalAad(value) {
|
|
6
6
|
return new TextEncoder().encode(canonicalJson(value));
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Compares strings by UTF-16 code units so canonicalization is independent of
|
|
10
|
+
* the host locale and matches Java String.compareTo.
|
|
11
|
+
*/
|
|
12
|
+
export function compareUtf16CodeUnits(left, right) {
|
|
13
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
14
|
+
}
|
|
8
15
|
function canonicalValue(value) {
|
|
9
16
|
if (value === null ||
|
|
10
17
|
typeof value === "string" ||
|
|
@@ -22,7 +29,7 @@ function canonicalValue(value) {
|
|
|
22
29
|
if (typeof value === "object") {
|
|
23
30
|
return Object.fromEntries(Object.entries(value)
|
|
24
31
|
.filter(([, child]) => child !== undefined)
|
|
25
|
-
.sort(([left], [right]) => left
|
|
32
|
+
.sort(([left], [right]) => compareUtf16CodeUnits(left, right))
|
|
26
33
|
.map(([key, child]) => [key, canonicalValue(child)]));
|
|
27
34
|
}
|
|
28
35
|
throw new SyncKitError("serialization", `Canonical JSON does not support ${typeof value}.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/crypto/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;aAC1C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/crypto/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;aAC1C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aAC7D,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,mCAAmC,OAAO,KAAK,GAAG,CACnD,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,sBAAsB,GAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,SAAS,EAAE,OAAO,YAAY,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,sBAAsB,GAC9B,cAAc,CAoChB;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,OAAO,EAAE,sBAAsB,EAC/B,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC,CAMZ;AAED,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAC9C,KAAK,EAAE,CAAC,EACR,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,EACpD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CAAO,GACrD,OAAO,CAAC,cAAc,CAAC,CA2CzB;AAED,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAC9C,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,CAAC,EACzC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,aAAa,CAAC,CAarD"}
|
package/dist/crypto/envelope.js
CHANGED
|
@@ -29,6 +29,7 @@ export function parseSyncEnvelopeV1(value, profile) {
|
|
|
29
29
|
}
|
|
30
30
|
validateEncodedLength(parsed.nonce, profile.nonceBytes, "nonce");
|
|
31
31
|
validateEncodedLength(parsed.kdfSalt, profile.kdfSaltBytes, "KDF salt");
|
|
32
|
+
validateEncodedLength(parsed.prfInput, profile.prfInputBytes, "PRF input");
|
|
32
33
|
return parsed;
|
|
33
34
|
}
|
|
34
35
|
export async function deriveContentKey(profile, inputKeyMaterial, salt, backend) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { KeyProvider } from "../../core/types.js";
|
|
2
2
|
import { type CryptoBackend, type SyncEnvelopeV1, type V1CompatibilityProfile, type V1KeyMetadata } from "../../crypto/index.js";
|
|
3
|
+
export type WebPasskeyKeyMetadata = V1KeyMetadata & {
|
|
4
|
+
credentialPublicKey?: JsonWebKey;
|
|
5
|
+
};
|
|
3
6
|
export type WebPasskeyProviderOptions<K> = {
|
|
4
7
|
rpId: string;
|
|
5
8
|
deriveKey: (secret: Uint8Array, salt: Uint8Array) => Promise<K>;
|
|
6
|
-
crypto?: Pick<Crypto, "getRandomValues"
|
|
9
|
+
crypto?: Pick<Crypto, "getRandomValues"> & {
|
|
10
|
+
subtle?: SubtleCrypto;
|
|
11
|
+
};
|
|
7
12
|
navigator?: Navigator;
|
|
8
13
|
secureContext?: () => boolean;
|
|
9
14
|
};
|
|
@@ -14,10 +19,11 @@ export declare class WebPasskeyProvider<K> implements KeyProvider<SyncEnvelopeV1
|
|
|
14
19
|
private pending;
|
|
15
20
|
constructor(profile: V1CompatibilityProfile, options: WebPasskeyProviderOptions<K>);
|
|
16
21
|
create(): Promise<{
|
|
17
|
-
metadata:
|
|
22
|
+
metadata: WebPasskeyKeyMetadata;
|
|
18
23
|
key: K;
|
|
19
24
|
}>;
|
|
20
25
|
unlock(envelope: SyncEnvelopeV1): Promise<K>;
|
|
26
|
+
unlockMetadata(metadata: V1KeyMetadata): Promise<K>;
|
|
21
27
|
clear(): void;
|
|
22
28
|
supported(): boolean;
|
|
23
29
|
private unlockNow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/keys/web-passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/keys/web-passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAgB/B,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG;IAClD,mBAAmB,CAAC,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG;QACzC,MAAM,CAAC,EAAE,YAAY,CAAC;KACvB,CAAC;IACF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;CAC/B,CAAC;AAEF,qBAAa,kBAAkB,CAAC,CAAC,CAC/B,YAAW,WAAW,CAAC,cAAc,EAAE,CAAC,EAAE,aAAa,CAAC;IAMtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,OAAO,CAA0D;gBAGtD,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAGlD,MAAM,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,qBAAqB,CAAC;QAAC,GAAG,EAAE,CAAC,CAAA;KAAE,CAAC;IA2D9D,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAS5C,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBzD,KAAK,IAAI,IAAI;IAKb,SAAS,IAAI,OAAO;YASN,SAAS;YAkBT,WAAW;YA6BX,aAAa;IAW3B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;CAMrB;AA8BD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,GAAG;IACjE,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACpC,GACA,kBAAkB,CAAC,SAAS,CAAC,CAO/B"}
|