@ibgib/web-gib 0.0.60 → 0.0.62

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 (89) hide show
  1. package/dist/AUTO-GENERATED-version.d.mts +1 -1
  2. package/dist/AUTO-GENERATED-version.mjs +1 -1
  3. package/dist/helpers.d.mts.map +1 -1
  4. package/dist/helpers.mjs +1 -0
  5. package/dist/helpers.mjs.map +1 -1
  6. package/dist/helpers.web.d.mts +3 -1
  7. package/dist/helpers.web.d.mts.map +1 -1
  8. package/dist/helpers.web.mjs +17 -1
  9. package/dist/helpers.web.mjs.map +1 -1
  10. package/dist/identity/device-delegate-helper.d.mts +91 -0
  11. package/dist/identity/device-delegate-helper.d.mts.map +1 -0
  12. package/dist/identity/device-delegate-helper.mjs +190 -0
  13. package/dist/identity/device-delegate-helper.mjs.map +1 -0
  14. package/dist/identity/device-delegate.respec.d.mts +2 -0
  15. package/dist/identity/device-delegate.respec.d.mts.map +1 -0
  16. package/dist/identity/device-delegate.respec.mjs +106 -0
  17. package/dist/identity/device-delegate.respec.mjs.map +1 -0
  18. package/dist/identity/keystone-sync-service.d.mts +18 -0
  19. package/dist/identity/keystone-sync-service.d.mts.map +1 -1
  20. package/dist/identity/keystone-sync-service.mjs +77 -1
  21. package/dist/identity/keystone-sync-service.mjs.map +1 -1
  22. package/dist/identity/passkey-helper.d.mts +72 -0
  23. package/dist/identity/passkey-helper.d.mts.map +1 -0
  24. package/dist/identity/passkey-helper.mjs +237 -0
  25. package/dist/identity/passkey-helper.mjs.map +1 -0
  26. package/dist/identity/passkey.respec.d.mts +2 -0
  27. package/dist/identity/passkey.respec.d.mts.map +1 -0
  28. package/dist/identity/passkey.respec.mjs +169 -0
  29. package/dist/identity/passkey.respec.mjs.map +1 -0
  30. package/dist/index.d.mts +2 -1
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +2 -2
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/storage/storage-helpers.web.d.mts +9 -0
  35. package/dist/storage/storage-helpers.web.d.mts.map +1 -1
  36. package/dist/storage/storage-helpers.web.mjs +42 -0
  37. package/dist/storage/storage-helpers.web.mjs.map +1 -1
  38. package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
  39. package/dist/ui/component/identity/add-device/add-device.mjs +31 -43
  40. package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
  41. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +18 -1
  42. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
  43. package/dist/ui/component/identity/keystone-creator/keystone-creator.html +42 -3
  44. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +524 -104
  45. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
  46. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +19 -1
  47. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
  48. package/dist/ui/component/identity/keystone-details/keystone-details.html +38 -0
  49. package/dist/ui/component/identity/keystone-details/keystone-details.mjs +1217 -132
  50. package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
  51. package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -1
  52. package/dist/ui/component/identity/remove-device/remove-device.mjs +1 -0
  53. package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -1
  54. package/dist/ui/ui-constants.d.mts +1 -0
  55. package/dist/ui/ui-constants.d.mts.map +1 -1
  56. package/dist/ui/ui-constants.mjs +1 -0
  57. package/dist/ui/ui-constants.mjs.map +1 -1
  58. package/dist/ui/ui-helpers.d.mts +3 -0
  59. package/dist/ui/ui-helpers.d.mts.map +1 -1
  60. package/dist/ui/ui-helpers.mjs +110 -6
  61. package/dist/ui/ui-helpers.mjs.map +1 -1
  62. package/dist/ui/ui-types.d.mts +5 -0
  63. package/dist/ui/ui-types.d.mts.map +1 -1
  64. package/package.json +2 -2
  65. package/src/AUTO-GENERATED-version.mts +1 -1
  66. package/src/helpers.mts +1 -0
  67. package/src/helpers.web.mts +22 -2
  68. package/src/identity/custodian-delegate-helper.mts.bak +7 -0
  69. package/src/identity/device-delegate-helper.mts +268 -0
  70. package/src/identity/device-delegate.respec.mts +125 -0
  71. package/src/identity/keystone-sync-service.mts +95 -2
  72. package/src/identity/passkey-helper.mts +304 -0
  73. package/src/identity/passkey.respec.mts +194 -0
  74. package/src/index.mts +2 -2
  75. package/src/storage/storage-helpers.web.mts +47 -0
  76. package/src/ui/component/identity/add-device/add-device.mts +37 -48
  77. package/src/ui/component/identity/keystone-creator/keystone-creator.html +42 -3
  78. package/src/ui/component/identity/keystone-creator/keystone-creator.mts +568 -111
  79. package/src/ui/component/identity/keystone-details/keystone-details.html +38 -0
  80. package/src/ui/component/identity/keystone-details/keystone-details.mts +1290 -142
  81. package/src/ui/component/identity/remove-device/remove-device.mts +1 -0
  82. package/src/ui/ui-constants.mts +1 -0
  83. package/src/ui/ui-helpers.mts +118 -5
  84. package/src/ui/ui-types.mts +6 -0
  85. package/dist/identity/custodian-delegate-helper.d.mts +0 -22
  86. package/dist/identity/custodian-delegate-helper.d.mts.map +0 -1
  87. package/dist/identity/custodian-delegate-helper.mjs +0 -67
  88. package/dist/identity/custodian-delegate-helper.mjs.map +0 -1
  89. package/src/identity/custodian-delegate-helper.mts +0 -86
@@ -0,0 +1,237 @@
1
+ /**
2
+ * @module identity/passkey-helper
3
+ *
4
+ * WebAuthn Level 3 PRF (Pseudo-Random Function) Passkey helper service.
5
+ * Derives deterministic 256-bit symmetric secrets from hardware biometrics
6
+ * (Touch ID, Windows Hello, Android Biometrics, YubiKey 5Ci) and creates
7
+ * passkey device sync delegates.
8
+ */
9
+ import { extractErrorMsg, getSaferSubstring } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
10
+ import { deriveDelegateSecret, createSyncDelegateKeystone } from '@ibgib/core-gib/dist/keystone/delegate/delegate-helpers.mjs';
11
+ import { generateDefaultDeviceTag, setDeviceDelegateSecret } from './device-delegate-helper.mjs';
12
+ /**
13
+ * Checks if the browser and underlying platform authenticator support WebAuthn PRF.
14
+ */
15
+ export async function isPasskeyPrfSupported() {
16
+ try {
17
+ if (typeof window === 'undefined' || !window.PublicKeyCredential) {
18
+ return false;
19
+ }
20
+ if (typeof window.PublicKeyCredential.getClientCapabilities === 'function') {
21
+ const caps = await window.PublicKeyCredential.getClientCapabilities();
22
+ if (caps && caps['prf']) {
23
+ return true;
24
+ }
25
+ }
26
+ // Fallback: check if PublicKeyCredential exists and platform authenticator is available
27
+ if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable === 'function') {
28
+ const isPlatformAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
29
+ return isPlatformAvailable;
30
+ }
31
+ return false;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Helper to convert an ArrayBuffer to a lowercase hex string.
39
+ */
40
+ export function bufferToHex(buffer) {
41
+ return Array.from(new Uint8Array(buffer))
42
+ .map(b => b.toString(16).padStart(2, '0'))
43
+ .join('');
44
+ }
45
+ /**
46
+ * Helper to convert a hex string to a Uint8Array.
47
+ */
48
+ export function hexToUint8Array(hex) {
49
+ const cleanHex = hex.replace(/[^0-9a-fA-F]/g, '');
50
+ const bytes = new Uint8Array(Math.floor(cleanHex.length / 2));
51
+ for (let i = 0; i < bytes.length; i++) {
52
+ bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);
53
+ }
54
+ return bytes;
55
+ }
56
+ /**
57
+ * Helper to normalize a salt string or buffer into a 32-byte Uint8Array for PRF evaluation.
58
+ */
59
+ export function normalizeSaltTo32Bytes(salt) {
60
+ if (salt instanceof Uint8Array) {
61
+ if (salt.length === 32)
62
+ return salt;
63
+ const result = new Uint8Array(32);
64
+ result.set(salt.subarray(0, 32));
65
+ return result;
66
+ }
67
+ // If hex string of length 64 (32 bytes)
68
+ if (/^[0-9a-fA-F]{64}$/.test(salt)) {
69
+ return hexToUint8Array(salt);
70
+ }
71
+ // Text string: encode and pad/slice to 32 bytes
72
+ const encoded = new TextEncoder().encode(salt);
73
+ const result = new Uint8Array(32);
74
+ result.set(encoded.subarray(0, 32));
75
+ return result;
76
+ }
77
+ /**
78
+ * Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
79
+ */
80
+ /**
81
+ * Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
82
+ */
83
+ export async function registerPasskeyCredential({ username, displayName = username, rpName = 'ibgib', rpId, salt, }) {
84
+ const lc = `[registerPasskeyCredential]`;
85
+ try {
86
+ if (typeof window === 'undefined' || !navigator.credentials?.create) {
87
+ throw new Error('WebAuthn is not supported in this browser environment.');
88
+ }
89
+ const effectiveRpId = rpId || (typeof window !== 'undefined' ? window.location.hostname : undefined);
90
+ const challenge = crypto.getRandomValues(new Uint8Array(32));
91
+ const userId = new TextEncoder().encode(username.slice(0, 64));
92
+ const saltBuffer = salt ? normalizeSaltTo32Bytes(salt) : undefined;
93
+ const prfExtension = saltBuffer
94
+ ? { eval: { first: saltBuffer } }
95
+ : {};
96
+ const credential = await navigator.credentials.create({
97
+ publicKey: {
98
+ challenge,
99
+ rp: {
100
+ name: rpName,
101
+ ...(effectiveRpId ? { id: effectiveRpId } : {})
102
+ },
103
+ user: {
104
+ id: userId,
105
+ name: username,
106
+ displayName
107
+ },
108
+ pubKeyCredParams: [
109
+ { alg: -7, type: 'public-key' }, // ES256 (ECDSA P-256)
110
+ { alg: -257, type: 'public-key' }, // RS256 (RSA)
111
+ { alg: -8, type: 'public-key' }, // Ed25519
112
+ ],
113
+ authenticatorSelection: {
114
+ residentKey: 'required',
115
+ userVerification: 'required'
116
+ },
117
+ extensions: {
118
+ prf: prfExtension
119
+ }
120
+ }
121
+ });
122
+ if (!credential) {
123
+ throw new Error('Passkey creation was cancelled or failed.');
124
+ }
125
+ const credentialId = bufferToHex(credential.rawId);
126
+ const response = credential.response;
127
+ const transports = (typeof response.getTransports === 'function')
128
+ ? response.getTransports()
129
+ : [];
130
+ const extResults = credential.getClientExtensionResults?.() || {};
131
+ console.log(`${lc} WebAuthn registration clientExtensionResults:`, extResults);
132
+ let passkeySecret;
133
+ if (extResults.prf?.results?.first) {
134
+ passkeySecret = bufferToHex(extResults.prf.results.first);
135
+ console.log(`${lc} Evaluated PRF directly during create!`);
136
+ }
137
+ return {
138
+ credentialId,
139
+ rawId: credential.rawId,
140
+ transports,
141
+ passkeySecret
142
+ };
143
+ }
144
+ catch (error) {
145
+ console.error(`${lc} ${extractErrorMsg(error)}`);
146
+ throw error;
147
+ }
148
+ }
149
+ /**
150
+ * Evaluates the PRF extension on a passkey assertion to derive a deterministic 256-bit symmetric secret.
151
+ */
152
+ export async function evaluatePasskeyPrf({ salt, credentialId, transports, rpId, }) {
153
+ const lc = `[evaluatePasskeyPrf]`;
154
+ try {
155
+ if (typeof window === 'undefined' || !navigator.credentials?.get) {
156
+ throw new Error('WebAuthn is not supported in this browser environment.');
157
+ }
158
+ const effectiveRpId = rpId || (typeof window !== 'undefined' ? window.location.hostname : undefined);
159
+ const challenge = crypto.getRandomValues(new Uint8Array(32));
160
+ const saltBuffer = normalizeSaltTo32Bytes(salt);
161
+ let allowCredentials = undefined;
162
+ if (credentialId) {
163
+ const rawBytes = hexToUint8Array(credentialId);
164
+ allowCredentials = [{
165
+ id: rawBytes.buffer,
166
+ type: 'public-key',
167
+ ...(transports && transports.length > 0 ? { transports } : {})
168
+ }];
169
+ }
170
+ const assertion = await navigator.credentials.get({
171
+ publicKey: {
172
+ challenge,
173
+ ...(effectiveRpId ? { rpId: effectiveRpId } : {}),
174
+ allowCredentials,
175
+ userVerification: 'required',
176
+ extensions: {
177
+ prf: {
178
+ eval: {
179
+ first: saltBuffer
180
+ }
181
+ }
182
+ }
183
+ }
184
+ });
185
+ if (!assertion) {
186
+ throw new Error('Passkey authentication was cancelled or failed.');
187
+ }
188
+ const resolvedCredentialId = bufferToHex(assertion.rawId);
189
+ const extResults = assertion.getClientExtensionResults?.() || {};
190
+ console.log(`${lc} WebAuthn assertion clientExtensionResults:`, extResults);
191
+ const prfResult = extResults.prf?.results?.first;
192
+ if (!prfResult) {
193
+ console.error(`${lc} Extension results did not contain PRF evaluation:`, extResults);
194
+ throw new Error('Authenticator did not return a PRF evaluation. PRF extension may not be supported on this authenticator.');
195
+ }
196
+ const passkeySecret = bufferToHex(prfResult);
197
+ return {
198
+ passkeySecret,
199
+ credentialId: resolvedCredentialId
200
+ };
201
+ }
202
+ catch (error) {
203
+ console.error(`${lc} ${extractErrorMsg(error)}`);
204
+ throw error;
205
+ }
206
+ }
207
+ /**
208
+ * Creates a Passkey sovereign sync delegate for this device.
209
+ * Standardized format: `passkey-${safeUsername}-${defaultDeviceTag}`
210
+ */
211
+ export async function createPasskeyDeviceSyncDelegate({ username, primaryTjpAddr, passkeySecret, transports, metaspace, space, }) {
212
+ const delegateSecret = await deriveDelegateSecret({ masterSecret: passkeySecret });
213
+ await setDeviceDelegateSecret({ primaryTjpAddr, delegateSecret });
214
+ const safeUser = getSaferSubstring({ text: username, length: 8, keepLiterals: ['-'] }) || 'user';
215
+ const defaultDeviceTag = generateDefaultDeviceTag();
216
+ const deviceTag = `passkey-${safeUser}-${defaultDeviceTag}`;
217
+ const sovereignSyncProfileName = process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC;
218
+ if (!sovereignSyncProfileName || !sovereignSyncProfileName.trim()) {
219
+ throw new Error('KEYSTONE_PROFILE_SOVEREIGN_SYNC environment variable is missing.');
220
+ }
221
+ const delegateKeystone = await createSyncDelegateKeystone({
222
+ profileName: sovereignSyncProfileName.trim(),
223
+ username,
224
+ deviceTag,
225
+ primaryTjpAddr,
226
+ delegateSecret,
227
+ additionalFrameDetails: {
228
+ client: 'space-gib-web',
229
+ role: 'passkey-sync',
230
+ ...(transports && transports.length > 0 ? { transports } : {})
231
+ },
232
+ metaspace,
233
+ space,
234
+ });
235
+ return { delegateKeystone, deviceTag, delegateSecret };
236
+ }
237
+ //# sourceMappingURL=passkey-helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey-helper.mjs","sourceRoot":"","sources":["../../src/identity/passkey-helper.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=passkey.respec.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey.respec.d.mts","sourceRoot":"","sources":["../../src/identity/passkey.respec.mts"],"names":[],"mappings":""}
@@ -0,0 +1,169 @@
1
+ import { respecfully, ifWe, iReckon } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
2
+ import { getIbGibGlobalThis_IbGib } from '../helpers.mjs';
3
+ import { bufferToHex, hexToUint8Array, normalizeSaltTo32Bytes, isPasskeyPrfSupported, createPasskeyDeviceSyncDelegate } from './passkey-helper.mjs';
4
+ import { getDeviceDelegateSecret } from './device-delegate-helper.mjs';
5
+ const sir = `[${import.meta.url}]`;
6
+ // Initialize global db & store names for tests
7
+ const globalThisIbGib = getIbGibGlobalThis_IbGib();
8
+ globalThisIbGib.dbName_hack = 'space_gib_db';
9
+ globalThisIbGib.storeName_hack = 'space_gib_store';
10
+ // Mock storage substrate for Node test environment
11
+ const inMemoryStore = new Map();
12
+ if (typeof globalThis.indexedDB === 'undefined') {
13
+ globalThis.indexedDB = {
14
+ open: (dbName) => {
15
+ const req = {};
16
+ setTimeout(() => {
17
+ const db = {
18
+ objectStoreNames: { contains: () => true },
19
+ transaction: (storeName) => ({
20
+ objectStore: (sName) => ({
21
+ get: (key) => {
22
+ const getReq = {};
23
+ setTimeout(() => {
24
+ const val = inMemoryStore.get(key);
25
+ getReq.result = val !== undefined ? { value: val } : undefined;
26
+ if (getReq.onsuccess)
27
+ getReq.onsuccess({ target: getReq });
28
+ }, 0);
29
+ return getReq;
30
+ },
31
+ put: (datum) => {
32
+ const putReq = {};
33
+ setTimeout(() => {
34
+ inMemoryStore.set(datum.key, datum.value);
35
+ if (putReq.onsuccess)
36
+ putReq.onsuccess({ target: putReq });
37
+ }, 0);
38
+ return putReq;
39
+ },
40
+ delete: (key) => {
41
+ const delReq = {};
42
+ setTimeout(() => {
43
+ inMemoryStore.delete(key);
44
+ if (delReq.onsuccess)
45
+ delReq.onsuccess({ target: delReq });
46
+ }, 0);
47
+ return delReq;
48
+ }
49
+ })
50
+ }),
51
+ close: () => { }
52
+ };
53
+ req.result = db;
54
+ if (req.onsuccess)
55
+ req.onsuccess({ target: req });
56
+ }, 0);
57
+ return req;
58
+ }
59
+ };
60
+ }
61
+ // Setup environment profile
62
+ process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC = 'sync-profile.dev';
63
+ class MockIbGibSpace {
64
+ name;
65
+ store = new Map();
66
+ ib = 'witness space mock-space mock_space_id user';
67
+ constructor(name = "mock_space") {
68
+ this.name = name;
69
+ }
70
+ async put({ ibGib }) {
71
+ const addr = `${ibGib.ib}^${ibGib.gib}`;
72
+ this.store.set(addr, JSON.parse(JSON.stringify(ibGib)));
73
+ }
74
+ async get({ addr }) {
75
+ const data = this.store.get(addr);
76
+ return data ? JSON.parse(JSON.stringify(data)) : null;
77
+ }
78
+ async argy({ argData, ibGibs }) {
79
+ return {
80
+ ib: 'arg^gib',
81
+ gib: 'arg_gib',
82
+ data: argData,
83
+ ibGibs,
84
+ };
85
+ }
86
+ async witness(arg) {
87
+ return { data: { success: true } };
88
+ }
89
+ }
90
+ class MockMetaspaceService {
91
+ space;
92
+ constructor(space) {
93
+ this.space = space;
94
+ }
95
+ async getLocalUserSpace({ lock } = {}) {
96
+ return this.space;
97
+ }
98
+ async put(args) {
99
+ const target = args.space || this.space;
100
+ return target.put(args);
101
+ }
102
+ async registerNewIbGib({ ibGib }) {
103
+ return this.put({ ibGib });
104
+ }
105
+ async get(args) {
106
+ const target = args.space || this.space;
107
+ if (args.addr) {
108
+ const x = await target.get({ addr: args.addr });
109
+ return { success: !!x, ibGibs: x ? [x] : [] };
110
+ }
111
+ return { success: true, ibGibs: [] };
112
+ }
113
+ }
114
+ const mockSpace = new MockIbGibSpace();
115
+ const mockMetaspace = new MockMetaspaceService(mockSpace);
116
+ await respecfully(sir, 'Passkey WebAuthn PRF Helper Service', async () => {
117
+ await ifWe(sir, 'bufferToHex and hexToUint8Array roundtrip correctly', async () => {
118
+ const originalBytes = new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
119
+ const hex = bufferToHex(originalBytes.buffer);
120
+ iReckon(sir, hex).willEqual('deadbeef0123456789abcdef');
121
+ const roundtripBytes = hexToUint8Array(hex);
122
+ iReckon(sir, roundtripBytes.length).willEqual(originalBytes.length);
123
+ for (let i = 0; i < originalBytes.length; i++) {
124
+ iReckon(sir, roundtripBytes[i]).willEqual(originalBytes[i]);
125
+ }
126
+ });
127
+ await ifWe(sir, 'normalizeSaltTo32Bytes normalizes various salt inputs to 32 bytes', async () => {
128
+ // 1. Hex string of 64 chars (32 bytes)
129
+ const hex64 = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
130
+ const normHex = normalizeSaltTo32Bytes(hex64);
131
+ iReckon(sir, normHex.length).willEqual(32);
132
+ iReckon(sir, bufferToHex(normHex.buffer)).willEqual(hex64);
133
+ // 2. Text string
134
+ const textSalt = 'ibgib_passkey_salt_domain_123';
135
+ const normText = normalizeSaltTo32Bytes(textSalt);
136
+ iReckon(sir, normText.length).willEqual(32);
137
+ // 3. Uint8Array
138
+ const rawBytes = new Uint8Array(32);
139
+ rawBytes.fill(0x42);
140
+ const normRaw = normalizeSaltTo32Bytes(rawBytes);
141
+ iReckon(sir, normRaw.length).willEqual(32);
142
+ iReckon(sir, normRaw[0]).willEqual(0x42);
143
+ });
144
+ await ifWe(sir, 'isPasskeyPrfSupported evaluates capabilities cleanly', async () => {
145
+ // In Node environment without window
146
+ const supported = await isPasskeyPrfSupported();
147
+ iReckon(sir, typeof supported).willEqual('boolean');
148
+ });
149
+ await ifWe(sir, 'createPasskeyDeviceSyncDelegate creates standard passkey sync delegate', async () => {
150
+ const username = 'alice';
151
+ const primaryTjpAddr = 'keystone^alice_primary_tjp.addr';
152
+ const passkeySecret = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
153
+ const { delegateKeystone, deviceTag, delegateSecret } = await createPasskeyDeviceSyncDelegate({
154
+ username,
155
+ primaryTjpAddr,
156
+ passkeySecret,
157
+ transports: ['internal'],
158
+ metaspace: mockMetaspace,
159
+ space: mockSpace,
160
+ });
161
+ iReckon(sir, delegateKeystone).asTo('delegateKeystone is generated').isGonnaBeTruthy();
162
+ iReckon(sir, deviceTag.startsWith('passkey-alice-')).asTo('deviceTag follows passkey naming format').isGonnaBeTrue();
163
+ iReckon(sir, delegateSecret).asTo('delegateSecret is derived').isGonnaBeTruthy();
164
+ // Verify stored in IndexedDB
165
+ const storedSecret = await getDeviceDelegateSecret({ primaryTjpAddr });
166
+ iReckon(sir, storedSecret).willEqual(delegateSecret);
167
+ });
168
+ });
169
+ //# sourceMappingURL=passkey.respec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey.respec.mjs","sourceRoot":"","sources":["../../src/identity/passkey.respec.mts"],"names":[],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -12,8 +12,9 @@ export * from "./helpers.web.mjs";
12
12
  export * from "./helpers.mjs";
13
13
  export * from "./api/ibgib-api-bridge.mjs";
14
14
  export * from "./identity/keystone-sync-service.mjs";
15
- export * from "./identity/custodian-delegate-helper.mjs";
15
+ export * from "./identity/device-delegate-helper.mjs";
16
16
  export * from "./identity/sso-popup-helper.mjs";
17
+ export * from "./identity/passkey-helper.mjs";
17
18
  export * from "./ui/component/identity/index.mjs";
18
19
  export * from "./ui/ui-constants.mjs";
19
20
  export * from "./ui/ui-types.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAG9B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAEzD,cAAc,iCAAiC,CAAC;AAGhD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAG9B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,mCAAmC,CAAC;AAGlD,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
package/dist/index.mjs CHANGED
@@ -14,9 +14,9 @@ export * from "./helpers.mjs";
14
14
  export * from "./api/ibgib-api-bridge.mjs";
15
15
  // Identity & Sync services
16
16
  export * from "./identity/keystone-sync-service.mjs";
17
- export * from "./identity/custodian-delegate-helper.mjs";
18
- // export * from "./identity/sso-callback-helper.mjs";
17
+ export * from "./identity/device-delegate-helper.mjs";
19
18
  export * from "./identity/sso-popup-helper.mjs";
19
+ export * from "./identity/passkey-helper.mjs";
20
20
  // Identity UI components
21
21
  export * from "./ui/component/identity/index.mjs";
22
22
  // UI constants & types
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAE9B,kBAAkB;AAClB,cAAc,4BAA4B,CAAC;AAE3C,2BAA2B;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,sDAAsD;AACtD,cAAc,iCAAiC,CAAC;AAEhD,yBAAyB;AACzB,cAAc,mCAAmC,CAAC;AAElD,uBAAuB;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAE9B,kBAAkB;AAClB,cAAc,4BAA4B,CAAC;AAE3C,2BAA2B;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,yBAAyB;AACzB,cAAc,mCAAmC,CAAC;AAElD,uBAAuB;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
@@ -105,4 +105,13 @@ export declare function storageReaddir({ dbName, storeName, dirPath, withFileTyp
105
105
  dirPath: string;
106
106
  withFileTypes?: boolean;
107
107
  }): Promise<string[] | Dirent[]>;
108
+ /**
109
+ * Deletes a single key from indexeddb storage.
110
+ */
111
+ export declare function storageDelete({ dbName, storeName, key, logalot, }: {
112
+ dbName: string;
113
+ storeName: string;
114
+ key: string;
115
+ logalot?: boolean;
116
+ }): Promise<void>;
108
117
  //# sourceMappingURL=storage-helpers.web.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-helpers.web.d.mts","sourceRoot":"","sources":["../../src/storage/storage-helpers.web.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage-helpers.web.d.mts","sourceRoot":"","sources":["../../src/storage/storage-helpers.web.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAKjD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B;AAID,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB1D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,EACpC,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGhB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EACnC,MAAM,EACN,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAevC;AAGD;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,EAC/C,MAAM,EACN,SAAS,EACT,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEhB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,EAC7B,MAAM,EACN,OAAO,EACP,SAAS,EACT,GAAG,EACH,KAAK,EACL,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDhB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,EAC7B,MAAM,EACN,OAAO,EACP,SAAS,EACT,GAAG,EACH,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmF9B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,EAClC,MAAM,EACN,KAAK,GACR,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6CnB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAC9B,MAAM,EACN,SAAS,EACT,QAAQ,GACX,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFhB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EACjC,MAAM,EACN,SAAS,EACT,OAAO,EACP,aAAqB,GACxB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CA0F/B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAChC,MAAM,EACN,SAAS,EACT,GAAG,EACH,OAAe,GAClB,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB"}
@@ -754,4 +754,46 @@ export async function storageReaddir({ dbName, storeName, dirPath, withFileTypes
754
754
  }
755
755
  }
756
756
  }
757
+ /**
758
+ * Deletes a single key from indexeddb storage.
759
+ */
760
+ export async function storageDelete({ dbName, storeName, key, logalot = false, }) {
761
+ const lc = `[${storageDelete.name}]`;
762
+ let db = undefined;
763
+ try {
764
+ if (logalot) {
765
+ console.log(`${lc} starting... (I: 8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d)`);
766
+ }
767
+ await new Promise((resolve, reject) => {
768
+ const openDBRequest = indexedDB.open(dbName);
769
+ openDBRequest.onerror = () => {
770
+ reject(openDBRequest.error);
771
+ };
772
+ openDBRequest.onsuccess = () => {
773
+ db = openDBRequest.result;
774
+ const transaction = db.transaction(storeName, "readwrite");
775
+ const objectStore = transaction.objectStore(storeName);
776
+ const deleteRequest = objectStore.delete(key);
777
+ deleteRequest.onerror = () => {
778
+ reject(deleteRequest.error);
779
+ };
780
+ deleteRequest.onsuccess = () => {
781
+ resolve();
782
+ };
783
+ };
784
+ });
785
+ }
786
+ catch (error) {
787
+ console.error(`${lc} ${extractErrorMsg(error)}`);
788
+ throw error;
789
+ }
790
+ finally {
791
+ if (db) {
792
+ db.close();
793
+ }
794
+ if (logalot) {
795
+ console.log(`${lc} complete.`);
796
+ }
797
+ }
798
+ }
757
799
  //# sourceMappingURL=storage-helpers.web.mjs.map