@0xsequence/wallet-wdk 3.0.0-beta.14 → 3.0.0-beta.16

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 (59) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +24 -0
  3. package/dist/dbs/auth-keys.d.ts +3 -1
  4. package/dist/dbs/auth-keys.d.ts.map +1 -1
  5. package/dist/dbs/auth-keys.js +16 -4
  6. package/dist/env.d.ts +22 -0
  7. package/dist/env.d.ts.map +1 -0
  8. package/dist/env.js +30 -0
  9. package/dist/identity/signer.d.ts +4 -3
  10. package/dist/identity/signer.d.ts.map +1 -1
  11. package/dist/identity/signer.js +11 -4
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/sequence/cron.d.ts +3 -0
  16. package/dist/sequence/cron.d.ts.map +1 -1
  17. package/dist/sequence/cron.js +72 -39
  18. package/dist/sequence/handlers/authcode-pkce.d.ts +2 -1
  19. package/dist/sequence/handlers/authcode-pkce.d.ts.map +1 -1
  20. package/dist/sequence/handlers/authcode-pkce.js +4 -4
  21. package/dist/sequence/handlers/authcode.d.ts +4 -1
  22. package/dist/sequence/handlers/authcode.d.ts.map +1 -1
  23. package/dist/sequence/handlers/authcode.js +23 -6
  24. package/dist/sequence/handlers/identity.d.ts +3 -1
  25. package/dist/sequence/handlers/identity.d.ts.map +1 -1
  26. package/dist/sequence/handlers/identity.js +14 -7
  27. package/dist/sequence/handlers/otp.d.ts +2 -1
  28. package/dist/sequence/handlers/otp.d.ts.map +1 -1
  29. package/dist/sequence/handlers/otp.js +2 -2
  30. package/dist/sequence/handlers/passkeys.d.ts +5 -3
  31. package/dist/sequence/handlers/passkeys.d.ts.map +1 -1
  32. package/dist/sequence/handlers/passkeys.js +7 -4
  33. package/dist/sequence/index.d.ts +2 -0
  34. package/dist/sequence/index.d.ts.map +1 -1
  35. package/dist/sequence/index.js +1 -0
  36. package/dist/sequence/manager.d.ts +65 -55
  37. package/dist/sequence/manager.d.ts.map +1 -1
  38. package/dist/sequence/manager.js +75 -16
  39. package/dist/sequence/passkeys-provider.d.ts +24 -0
  40. package/dist/sequence/passkeys-provider.d.ts.map +1 -0
  41. package/dist/sequence/passkeys-provider.js +15 -0
  42. package/dist/sequence/wallets.d.ts +1 -0
  43. package/dist/sequence/wallets.d.ts.map +1 -1
  44. package/dist/sequence/wallets.js +15 -4
  45. package/package.json +6 -6
  46. package/src/dbs/auth-keys.ts +19 -5
  47. package/src/env.ts +58 -0
  48. package/src/identity/signer.ts +10 -4
  49. package/src/index.ts +1 -0
  50. package/src/sequence/cron.ts +75 -42
  51. package/src/sequence/handlers/authcode-pkce.ts +5 -3
  52. package/src/sequence/handlers/authcode.ts +26 -5
  53. package/src/sequence/handlers/identity.ts +17 -7
  54. package/src/sequence/handlers/otp.ts +3 -2
  55. package/src/sequence/handlers/passkeys.ts +12 -12
  56. package/src/sequence/index.ts +2 -0
  57. package/src/sequence/manager.ts +165 -13
  58. package/src/sequence/passkeys-provider.ts +55 -0
  59. package/src/sequence/wallets.ts +20 -5
@@ -1,5 +1,5 @@
1
1
 
2
2
 
3
- > @0xsequence/wallet-wdk@3.0.0-beta.14 build /home/taylan/development/sequence/sequence.js/packages/wallet/wdk
3
+ > @0xsequence/wallet-wdk@3.0.0-beta.16 build /home/taylan/development/sequence/sequence.js/packages/wallet/wdk
4
4
  > tsc
5
5
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @0xsequence/wallet-wdk
2
2
 
3
+ ## 3.0.0-beta.16
4
+
5
+ ### Patch Changes
6
+
7
+ - ethauth support
8
+ - Updated dependencies
9
+ - @0xsequence/guard@3.0.0-beta.16
10
+ - @0xsequence/identity-instrument@3.0.0-beta.16
11
+ - @0xsequence/relayer@3.0.0-beta.16
12
+ - @0xsequence/wallet-core@3.0.0-beta.16
13
+ - @0xsequence/wallet-primitives@3.0.0-beta.16
14
+
15
+ ## 3.0.0-beta.15
16
+
17
+ ### Patch Changes
18
+
19
+ - New chains, minor fixes
20
+ - Updated dependencies
21
+ - @0xsequence/guard@3.0.0-beta.15
22
+ - @0xsequence/identity-instrument@3.0.0-beta.15
23
+ - @0xsequence/relayer@3.0.0-beta.15
24
+ - @0xsequence/wallet-core@3.0.0-beta.15
25
+ - @0xsequence/wallet-primitives@3.0.0-beta.15
26
+
3
27
  ## 3.0.0-beta.14
4
28
 
5
29
  ### Patch Changes
@@ -1,4 +1,5 @@
1
1
  import { Generic } from './generic.js';
2
+ import type { WdkEnv } from '../env.js';
2
3
  export type AuthKey = {
3
4
  address: string;
4
5
  privateKey: CryptoKey;
@@ -6,8 +7,9 @@ export type AuthKey = {
6
7
  expiresAt: Date;
7
8
  };
8
9
  export declare class AuthKeys extends Generic<AuthKey, 'address'> {
10
+ private readonly env?;
9
11
  private expirationTimers;
10
- constructor(dbName?: string);
12
+ constructor(dbName?: string, env?: WdkEnv | undefined);
11
13
  handleOpenDB(): Promise<void>;
12
14
  set(item: AuthKey): Promise<AuthKey['address']>;
13
15
  del(address: AuthKey['address']): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-keys.d.ts","sourceRoot":"","sources":["../../src/dbs/auth-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAa,MAAM,cAAc,CAAA;AAKjD,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA;AAED,qBAAa,QAAS,SAAQ,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;IACvD,OAAO,CAAC,gBAAgB,CAA4B;gBAExC,MAAM,GAAE,MAA6B;IAgB3C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAU/C,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAwC9E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlC,kBAAkB;IAgBhC,OAAO,CAAC,eAAe;CAOxB"}
1
+ {"version":3,"file":"auth-keys.d.ts","sourceRoot":"","sources":["../../src/dbs/auth-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAa,MAAM,cAAc,CAAA;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIvC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA;AAED,qBAAa,QAAS,SAAQ,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;IAKrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAJvB,OAAO,CAAC,gBAAgB,CAAmD;gBAGzE,MAAM,GAAE,MAA6B,EACpB,GAAG,CAAC,EAAE,MAAM,YAAA;IAiBzB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAU/C,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IA2C9E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAOlC,kBAAkB;IAoBhC,OAAO,CAAC,eAAe;CAUxB"}
@@ -1,8 +1,9 @@
1
1
  import { Generic } from './generic.js';
2
2
  const TABLE_NAME = 'auth-keys';
3
3
  export class AuthKeys extends Generic {
4
+ env;
4
5
  expirationTimers = new Map();
5
- constructor(dbName = 'sequence-auth-keys') {
6
+ constructor(dbName = 'sequence-auth-keys', env) {
6
7
  super(dbName, TABLE_NAME, 'address', [
7
8
  (db, _tx, _event) => {
8
9
  if (!db.objectStoreNames.contains(TABLE_NAME)) {
@@ -11,6 +12,7 @@ export class AuthKeys extends Generic {
11
12
  }
12
13
  },
13
14
  ]);
15
+ this.env = env;
14
16
  }
15
17
  async handleOpenDB() {
16
18
  const authKeys = await this.list();
@@ -44,7 +46,10 @@ export class AuthKeys extends Generic {
44
46
  return result;
45
47
  }
46
48
  else if (attempt < 2) {
47
- await new Promise((resolve) => setTimeout(resolve, 50));
49
+ const setTimeoutFn = this.env?.timers?.setTimeout ?? globalThis.setTimeout;
50
+ if (setTimeoutFn) {
51
+ await new Promise((resolve) => setTimeoutFn(resolve, 50));
52
+ }
48
53
  return this.getBySigner(signer, attempt + 1);
49
54
  }
50
55
  else {
@@ -81,7 +86,11 @@ export class AuthKeys extends Generic {
81
86
  await this.del(authKey.address.toLowerCase());
82
87
  return;
83
88
  }
84
- const timer = window.setTimeout(() => {
89
+ const setTimeoutFn = this.env?.timers?.setTimeout ?? globalThis.setTimeout;
90
+ if (!setTimeoutFn) {
91
+ return;
92
+ }
93
+ const timer = setTimeoutFn(() => {
85
94
  console.log('removing expired auth key', authKey);
86
95
  this.del(authKey.address.toLowerCase());
87
96
  }, delay);
@@ -90,7 +99,10 @@ export class AuthKeys extends Generic {
90
99
  clearExpiration(address) {
91
100
  const timer = this.expirationTimers.get(address.toLowerCase());
92
101
  if (timer) {
93
- window.clearTimeout(timer);
102
+ const clearTimeoutFn = this.env?.timers?.clearTimeout ?? globalThis.clearTimeout;
103
+ if (clearTimeoutFn) {
104
+ clearTimeoutFn(timer);
105
+ }
94
106
  this.expirationTimers.delete(address.toLowerCase());
95
107
  }
96
108
  }
package/dist/env.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { CoreEnv } from '@0xsequence/wallet-core';
2
+ export type TimersLike = {
3
+ setTimeout: typeof setTimeout;
4
+ clearTimeout: typeof clearTimeout;
5
+ setInterval: typeof setInterval;
6
+ clearInterval: typeof clearInterval;
7
+ };
8
+ export type LockManagerLike = {
9
+ request: (name: string, callback: (lock: Lock | null) => Promise<void> | void) => Promise<void>;
10
+ };
11
+ export type NavigationLike = {
12
+ getPathname: () => string;
13
+ redirect: (url: string) => void;
14
+ };
15
+ export type WdkEnv = CoreEnv & {
16
+ timers?: TimersLike;
17
+ locks?: LockManagerLike;
18
+ navigation?: NavigationLike;
19
+ urlSearchParams?: typeof URLSearchParams;
20
+ };
21
+ export declare function resolveWdkEnv(env?: WdkEnv): WdkEnv;
22
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAGtD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,OAAO,UAAU,CAAA;IAC7B,YAAY,EAAE,OAAO,YAAY,CAAA;IACjC,WAAW,EAAE,OAAO,WAAW,CAAA;IAC/B,aAAa,EAAE,OAAO,aAAa,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChG,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,MAAM,CAAA;IACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG;IAC7B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,eAAe,CAAA;CACzC,CAAA;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BlD"}
package/dist/env.js ADDED
@@ -0,0 +1,30 @@
1
+ import { resolveCoreEnv } from '@0xsequence/wallet-core';
2
+ export function resolveWdkEnv(env) {
3
+ const core = resolveCoreEnv(env);
4
+ const globalObj = globalThis;
5
+ const windowObj = typeof window !== 'undefined' ? window : (globalObj.window ?? {});
6
+ const location = windowObj.location ?? globalObj.location;
7
+ return {
8
+ ...core,
9
+ timers: env?.timers ??
10
+ (typeof globalObj.setTimeout === 'function'
11
+ ? {
12
+ setTimeout: globalObj.setTimeout.bind(globalObj),
13
+ clearTimeout: globalObj.clearTimeout.bind(globalObj),
14
+ setInterval: globalObj.setInterval.bind(globalObj),
15
+ clearInterval: globalObj.clearInterval.bind(globalObj),
16
+ }
17
+ : undefined),
18
+ locks: env?.locks ?? globalObj.navigator?.locks ?? windowObj.navigator?.locks,
19
+ navigation: env?.navigation ??
20
+ (location
21
+ ? {
22
+ getPathname: () => location.pathname,
23
+ redirect: (url) => {
24
+ location.href = url;
25
+ },
26
+ }
27
+ : undefined),
28
+ urlSearchParams: env?.urlSearchParams ?? globalObj.URLSearchParams ?? windowObj.URLSearchParams,
29
+ };
30
+ }
@@ -1,14 +1,15 @@
1
1
  import { Address, Bytes } from 'ox';
2
- import { Signers, State } from '@0xsequence/wallet-core';
2
+ import { Signers, State, type CryptoLike } from '@0xsequence/wallet-core';
3
3
  import { IdentityInstrument } from '@0xsequence/identity-instrument';
4
4
  import { AuthKey } from '../dbs/auth-keys.js';
5
5
  import { Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives';
6
6
  import * as Identity from '@0xsequence/identity-instrument';
7
- export declare function toIdentityAuthKey(authKey: AuthKey): Identity.AuthKey;
7
+ export declare function toIdentityAuthKey(authKey: AuthKey, crypto?: CryptoLike): Identity.AuthKey;
8
8
  export declare class IdentitySigner implements Signers.Signer {
9
9
  readonly identityInstrument: IdentityInstrument;
10
10
  readonly authKey: AuthKey;
11
- constructor(identityInstrument: IdentityInstrument, authKey: AuthKey);
11
+ private readonly crypto?;
12
+ constructor(identityInstrument: IdentityInstrument, authKey: AuthKey, crypto?: CryptoLike | undefined);
12
13
  get address(): Address.Address;
13
14
  sign(wallet: Address.Address, chainId: number, payload: Payload.Parented): Promise<SequenceSignature.SignatureOfSignerLeaf>;
14
15
  signDigest(digest: Bytes.Bytes): Promise<SequenceSignature.SignatureOfSignerLeafHash>;
@@ -1 +1 @@
1
- {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/identity/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,KAAK,EAAmB,MAAM,IAAI,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAW,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACvF,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAE3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAiBpE;AAED,qBAAa,cAAe,YAAW,OAAO,CAAC,MAAM;IAEjD,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO;gBADhB,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,OAAO;IAG3B,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,CAK7B;IAEK,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,QAAQ,GACxB,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;IAK7C,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;IASrF,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBjG"}
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/identity/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,KAAK,EAAmB,MAAM,IAAI,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAW,MAAM,iCAAiC,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACvF,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAE3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,OAAO,CAsBzF;AAED,qBAAa,cAAe,YAAW,OAAO,CAAC,MAAM;IAEjD,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAFf,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,OAAO,EACR,MAAM,CAAC,EAAE,UAAU,YAAA;IAGtC,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,CAK7B;IAEK,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,QAAQ,GACxB,OAAO,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;IAK7C,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;IASrF,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBjG"}
@@ -1,13 +1,18 @@
1
1
  import { Address, Signature, Hex } from 'ox';
2
2
  import { Payload } from '@0xsequence/wallet-primitives';
3
3
  import * as Identity from '@0xsequence/identity-instrument';
4
- export function toIdentityAuthKey(authKey) {
4
+ export function toIdentityAuthKey(authKey, crypto) {
5
+ const globalObj = globalThis;
6
+ const resolvedCrypto = crypto ?? globalObj.window?.crypto ?? globalObj.crypto;
7
+ if (!resolvedCrypto?.subtle) {
8
+ throw new Error('crypto.subtle is not available');
9
+ }
5
10
  return {
6
11
  address: authKey.address,
7
12
  keyType: Identity.KeyType.WebCrypto_Secp256r1,
8
13
  signer: authKey.identitySigner,
9
14
  async sign(digest) {
10
- const authKeySignature = await window.crypto.subtle.sign({
15
+ const authKeySignature = await resolvedCrypto.subtle.sign({
11
16
  name: 'ECDSA',
12
17
  hash: 'SHA-256',
13
18
  }, authKey.privateKey, new Uint8Array(digest));
@@ -18,9 +23,11 @@ export function toIdentityAuthKey(authKey) {
18
23
  export class IdentitySigner {
19
24
  identityInstrument;
20
25
  authKey;
21
- constructor(identityInstrument, authKey) {
26
+ crypto;
27
+ constructor(identityInstrument, authKey, crypto) {
22
28
  this.identityInstrument = identityInstrument;
23
29
  this.authKey = authKey;
30
+ this.crypto = crypto;
24
31
  }
25
32
  get address() {
26
33
  if (!Address.validate(this.authKey.identitySigner)) {
@@ -33,7 +40,7 @@ export class IdentitySigner {
33
40
  return this.signDigest(payloadHash);
34
41
  }
35
42
  async signDigest(digest) {
36
- const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey), digest);
43
+ const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey, this.crypto), digest);
37
44
  const sig = Signature.fromHex(sigHex);
38
45
  return {
39
46
  type: 'hash',
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * as Identity from './identity/signer.js';
2
2
  export * as Sequence from './sequence/index.js';
3
+ export * from './env.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * as Identity from './identity/signer.js';
2
2
  export * as Sequence from './sequence/index.js';
3
+ export * from './env.js';
@@ -10,6 +10,7 @@ export declare class Cron {
10
10
  private readonly STORAGE_KEY;
11
11
  private isStopping;
12
12
  private currentCheckJobsPromise;
13
+ private readonly env;
13
14
  /**
14
15
  * Initializes the Cron scheduler and starts the periodic job checker.
15
16
  * @param shared Shared context for modules and logging.
@@ -48,6 +49,7 @@ export declare class Cron {
48
49
  * Uses a lock to prevent concurrent execution.
49
50
  */
50
51
  private checkJobs;
52
+ private runJobs;
51
53
  /**
52
54
  * Loads the persisted last run times for jobs from localStorage.
53
55
  * @returns Map of job IDs to their last run times.
@@ -57,5 +59,6 @@ export declare class Cron {
57
59
  * Persists the current last run times of all jobs to localStorage.
58
60
  */
59
61
  private syncWithStorage;
62
+ private isAbortError;
60
63
  }
61
64
  //# sourceMappingURL=cron.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/sequence/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AASrC;;;GAGG;AACH,qBAAa,IAAI;IAWH,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVnC,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,uBAAuB,CAAmC;IAElE;;;OAGG;gBAC0B,MAAM,EAAE,MAAM;IAI3C;;;OAGG;IACH,OAAO,CAAC,KAAK;IAMb;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAelC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAStE;;;OAGG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM;IAIxB;;;;OAIG;YACW,SAAS;IAuDvB;;;OAGG;YACW,eAAe;IAM7B;;OAEG;YACW,eAAe;CAK9B"}
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/sequence/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AASrC;;;GAGG;AACH,qBAAa,IAAI;IAYH,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXnC,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC;;;OAGG;gBAC0B,MAAM,EAAE,MAAM;IAK3C;;;OAGG;IACH,OAAO,CAAC,KAAK;IAUb;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAStE;;;OAGG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM;IAIxB;;;;OAIG;YACW,SAAS;YA6BT,OAAO;IAkCrB;;;OAGG;YACW,eAAe;IAU7B;;OAEG;YACW,eAAe;IAU7B,OAAO,CAAC,YAAY;CAOrB"}
@@ -9,12 +9,14 @@ export class Cron {
9
9
  STORAGE_KEY = 'sequence-cron-jobs';
10
10
  isStopping = false;
11
11
  currentCheckJobsPromise = Promise.resolve();
12
+ env;
12
13
  /**
13
14
  * Initializes the Cron scheduler and starts the periodic job checker.
14
15
  * @param shared Shared context for modules and logging.
15
16
  */
16
17
  constructor(shared) {
17
18
  this.shared = shared;
19
+ this.env = shared.env;
18
20
  this.start();
19
21
  }
20
22
  /**
@@ -25,7 +27,11 @@ export class Cron {
25
27
  if (this.isStopping)
26
28
  return;
27
29
  this.executeCheckJobsChain();
28
- this.checkInterval = setInterval(() => this.executeCheckJobsChain(), 60 * 1000);
30
+ const setIntervalFn = this.env.timers?.setInterval ?? globalThis.setInterval;
31
+ if (!setIntervalFn) {
32
+ return;
33
+ }
34
+ this.checkInterval = setIntervalFn(() => this.executeCheckJobsChain(), 60 * 1000);
29
35
  }
30
36
  /**
31
37
  * Chains job checks to ensure sequential execution.
@@ -47,7 +53,10 @@ export class Cron {
47
53
  async stop() {
48
54
  this.isStopping = true;
49
55
  if (this.checkInterval) {
50
- clearInterval(this.checkInterval);
56
+ const clearIntervalFn = this.env.timers?.clearInterval ?? globalThis.clearInterval;
57
+ if (clearIntervalFn) {
58
+ clearIntervalFn(this.checkInterval);
59
+ }
51
60
  this.checkInterval = undefined;
52
61
  this.shared.modules.logger.log('Cron: Interval cleared.');
53
62
  }
@@ -88,46 +97,24 @@ export class Cron {
88
97
  return;
89
98
  }
90
99
  try {
91
- await navigator.locks.request('sequence-cron-jobs', async (lock) => {
92
- if (this.isStopping) {
93
- return;
94
- }
95
- if (!lock) {
96
- return;
97
- }
98
- const now = Date.now();
99
- const storage = await this.getStorageState();
100
- for (const [id, job] of this.jobs) {
100
+ const locks = this.env.locks ?? globalThis.navigator?.locks;
101
+ if (locks?.request) {
102
+ await locks.request('sequence-cron-jobs', async (lock) => {
101
103
  if (this.isStopping) {
102
- break;
104
+ return;
103
105
  }
104
- const lastRun = storage.get(id)?.lastRun ?? job.lastRun;
105
- const timeSinceLastRun = now - lastRun;
106
- if (timeSinceLastRun >= job.interval) {
107
- try {
108
- await job.handler();
109
- if (!this.isStopping) {
110
- job.lastRun = now;
111
- storage.set(id, { lastRun: now });
112
- }
113
- }
114
- catch (error) {
115
- if (error instanceof DOMException && error.name === 'AbortError') {
116
- this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`);
117
- }
118
- else {
119
- console.error(`Cron job ${id} failed:`, error);
120
- }
121
- }
106
+ if (!lock) {
107
+ return;
122
108
  }
123
- }
124
- if (!this.isStopping) {
125
- await this.syncWithStorage();
126
- }
127
- });
109
+ await this.runJobs();
110
+ });
111
+ }
112
+ else {
113
+ await this.runJobs();
114
+ }
128
115
  }
129
116
  catch (error) {
130
- if (error instanceof DOMException && error.name === 'AbortError') {
117
+ if (this.isAbortError(error)) {
131
118
  this.shared.modules.logger.log('Cron: navigator.locks.request was aborted.');
132
119
  }
133
120
  else {
@@ -135,6 +122,37 @@ export class Cron {
135
122
  }
136
123
  }
137
124
  }
125
+ async runJobs() {
126
+ const now = Date.now();
127
+ const storage = await this.getStorageState();
128
+ for (const [id, job] of this.jobs) {
129
+ if (this.isStopping) {
130
+ break;
131
+ }
132
+ const lastRun = storage.get(id)?.lastRun ?? job.lastRun;
133
+ const timeSinceLastRun = now - lastRun;
134
+ if (timeSinceLastRun >= job.interval) {
135
+ try {
136
+ await job.handler();
137
+ if (!this.isStopping) {
138
+ job.lastRun = now;
139
+ storage.set(id, { lastRun: now });
140
+ }
141
+ }
142
+ catch (error) {
143
+ if (this.isAbortError(error)) {
144
+ this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`);
145
+ }
146
+ else {
147
+ console.error(`Cron job ${id} failed:`, error);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ if (!this.isStopping) {
153
+ await this.syncWithStorage();
154
+ }
155
+ }
138
156
  /**
139
157
  * Loads the persisted last run times for jobs from localStorage.
140
158
  * @returns Map of job IDs to their last run times.
@@ -142,7 +160,11 @@ export class Cron {
142
160
  async getStorageState() {
143
161
  if (this.isStopping)
144
162
  return new Map();
145
- const state = localStorage.getItem(this.STORAGE_KEY);
163
+ const storage = this.env.storage;
164
+ if (!storage) {
165
+ return new Map();
166
+ }
167
+ const state = storage.getItem(this.STORAGE_KEY);
146
168
  return new Map(state ? JSON.parse(state) : []);
147
169
  }
148
170
  /**
@@ -151,7 +173,18 @@ export class Cron {
151
173
  async syncWithStorage() {
152
174
  if (this.isStopping)
153
175
  return;
176
+ const storage = this.env.storage;
177
+ if (!storage) {
178
+ return;
179
+ }
154
180
  const state = Array.from(this.jobs.entries()).map(([id, job]) => [id, { lastRun: job.lastRun }]);
155
- localStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));
181
+ storage.setItem(this.STORAGE_KEY, JSON.stringify(state));
182
+ }
183
+ isAbortError(error) {
184
+ const domException = globalThis.DOMException;
185
+ if (domException && error instanceof domException) {
186
+ return error.name === 'AbortError';
187
+ }
188
+ return error?.name === 'AbortError';
156
189
  }
157
190
  }
@@ -4,8 +4,9 @@ import { Signatures } from '../signatures.js';
4
4
  import * as Identity from '@0xsequence/identity-instrument';
5
5
  import { IdentitySigner } from '../../identity/signer.js';
6
6
  import { AuthCodeHandler } from './authcode.js';
7
+ import type { WdkEnv } from '../../env.js';
7
8
  export declare class AuthCodePkceHandler extends AuthCodeHandler implements Handler {
8
- constructor(signupKind: 'google-pkce' | `custom-${string}`, issuer: string, oauthUrl: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys);
9
+ constructor(signupKind: 'google-pkce' | `custom-${string}`, issuer: string, oauthUrl: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, env?: WdkEnv);
9
10
  commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string): Promise<string>;
10
11
  completeAuth(commitment: Db.AuthCommitment, code: string): Promise<[IdentitySigner, {
11
12
  [key: string]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"authcode-pkce.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/authcode-pkce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,qBAAa,mBAAoB,SAAQ,eAAgB,YAAW,OAAO;gBAEvE,UAAU,EAAE,aAAa,GAAG,UAAU,MAAM,EAAE,EAC9C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,EAAE,CAAC,eAAe,EAC/B,QAAQ,EAAE,EAAE,CAAC,QAAQ;IAKV,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAkC7E,YAAY,CACvB,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAWxD"}
1
+ {"version":3,"file":"authcode-pkce.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/authcode-pkce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,qBAAa,mBAAoB,SAAQ,eAAgB,YAAW,OAAO;gBAEvE,UAAU,EAAE,aAAa,GAAG,UAAU,MAAM,EAAE,EAC9C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,EAAE,CAAC,eAAe,EAC/B,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACrB,GAAG,CAAC,EAAE,MAAM;IAKD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAkC7E,YAAY,CACvB,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAWxD"}
@@ -2,8 +2,8 @@ import { Hex, Bytes } from 'ox';
2
2
  import * as Identity from '@0xsequence/identity-instrument';
3
3
  import { AuthCodeHandler } from './authcode.js';
4
4
  export class AuthCodePkceHandler extends AuthCodeHandler {
5
- constructor(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys) {
6
- super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys);
5
+ constructor(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env) {
6
+ super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env);
7
7
  }
8
8
  async commitAuth(target, isSignUp, state, signer) {
9
9
  let challenge = new Identity.AuthCodePkceChallenge(this.issuer, this.audience, this.redirectUri);
@@ -23,7 +23,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler {
23
23
  metadata: {},
24
24
  isSignUp,
25
25
  });
26
- const searchParams = new URLSearchParams({
26
+ const searchParams = this.serializeQuery({
27
27
  code_challenge: codeChallenge,
28
28
  code_challenge_method: 'S256',
29
29
  client_id: this.audience,
@@ -33,7 +33,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler {
33
33
  scope: 'openid profile email',
34
34
  state,
35
35
  });
36
- return `${this.oauthUrl}?${searchParams.toString()}`;
36
+ return `${this.oauthUrl}?${searchParams}`;
37
37
  }
38
38
  async completeAuth(commitment, code) {
39
39
  const challenge = new Identity.AuthCodePkceChallenge('', '', '');
@@ -6,6 +6,7 @@ import * as Identity from '@0xsequence/identity-instrument';
6
6
  import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest } from '../types/signature-request.js';
7
7
  import { IdentitySigner } from '../../identity/signer.js';
8
8
  import { IdentityHandler } from './identity.js';
9
+ import type { WdkEnv } from '../../env.js';
9
10
  export declare class AuthCodeHandler extends IdentityHandler implements Handler {
10
11
  readonly signupKind: 'apple' | 'google-pkce' | `custom-${string}`;
11
12
  readonly issuer: string;
@@ -13,7 +14,7 @@ export declare class AuthCodeHandler extends IdentityHandler implements Handler
13
14
  readonly audience: string;
14
15
  protected readonly commitments: Db.AuthCommitments;
15
16
  protected redirectUri: string;
16
- constructor(signupKind: 'apple' | 'google-pkce' | `custom-${string}`, issuer: string, oauthUrl: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys);
17
+ constructor(signupKind: 'apple' | 'google-pkce' | `custom-${string}`, issuer: string, oauthUrl: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, env?: WdkEnv);
17
18
  get kind(): string;
18
19
  setRedirectUri(redirectUri: string): void;
19
20
  commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string): Promise<string>;
@@ -21,5 +22,7 @@ export declare class AuthCodeHandler extends IdentityHandler implements Handler
21
22
  [key: string]: string;
22
23
  }]>;
23
24
  status(address: Address.Address, _imageHash: Hex.Hex | undefined, request: BaseSignatureRequest): Promise<SignerUnavailable | SignerReady | SignerActionable>;
25
+ protected serializeQuery(params: Record<string, string>): string;
26
+ private getNavigation;
24
27
  }
25
28
  //# sourceMappingURL=authcode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authcode.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/authcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAS,MAAM,IAAI,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,qBAAa,eAAgB,SAAQ,eAAgB,YAAW,OAAO;aAInD,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,MAAM,EAAE;aACxD,MAAM,EAAE,MAAM;IAC9B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;aACnB,QAAQ,EAAE,MAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,eAAe;IATpD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAK;gBAGhB,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,MAAM,EAAE,EACxD,MAAM,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,UAAU,EAAE,UAAU,EACH,WAAW,EAAE,EAAE,CAAC,eAAe,EAClD,QAAQ,EAAE,EAAE,CAAC,QAAQ;IAKvB,IAAW,IAAI,WAEd;IAEM,cAAc,CAAC,WAAW,EAAE,MAAM;IAI5B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAyB7E,YAAY,CACvB,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAWjD,MAAM,CACV,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,SAAS,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,GAAG,WAAW,GAAG,gBAAgB,CAAC;CA0B/D"}
1
+ {"version":3,"file":"authcode.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/authcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAS,MAAM,IAAI,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1D,qBAAa,eAAgB,SAAQ,eAAgB,YAAW,OAAO;aAInD,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,MAAM,EAAE;aACxD,MAAM,EAAE,MAAM;IAC9B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;aACnB,QAAQ,EAAE,MAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,eAAe;IATpD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAK;gBAGhB,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,UAAU,MAAM,EAAE,EACxD,MAAM,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,UAAU,EAAE,UAAU,EACH,WAAW,EAAE,EAAE,CAAC,eAAe,EAClD,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACrB,GAAG,CAAC,EAAE,MAAM;IAKd,IAAW,IAAI,WAEd;IAEM,cAAc,CAAC,WAAW,EAAE,MAAM;IAI5B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAyB7E,YAAY,CACvB,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IAWjD,MAAM,CACV,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,SAAS,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,GAAG,WAAW,GAAG,gBAAgB,CAAC;IA4B9D,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAUhE,OAAO,CAAC,aAAa;CAOtB"}
@@ -8,8 +8,8 @@ export class AuthCodeHandler extends IdentityHandler {
8
8
  audience;
9
9
  commitments;
10
10
  redirectUri = '';
11
- constructor(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys) {
12
- super(nitro, authKeys, signatures, Identity.IdentityType.OIDC);
11
+ constructor(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env) {
12
+ super(nitro, authKeys, signatures, Identity.IdentityType.OIDC, env);
13
13
  this.signupKind = signupKind;
14
14
  this.issuer = issuer;
15
15
  this.oauthUrl = oauthUrl;
@@ -34,14 +34,14 @@ export class AuthCodeHandler extends IdentityHandler {
34
34
  metadata: {},
35
35
  isSignUp,
36
36
  });
37
- const searchParams = new URLSearchParams({
37
+ const searchParams = this.serializeQuery({
38
38
  client_id: this.audience,
39
39
  redirect_uri: this.redirectUri,
40
40
  response_type: 'code',
41
41
  state,
42
42
  ...(this.signupKind === 'apple' ? {} : { scope: 'openid profile email' }),
43
43
  });
44
- return `${this.oauthUrl}?${searchParams.toString()}`;
44
+ return `${this.oauthUrl}?${searchParams}`;
45
45
  }
46
46
  async completeAuth(commitment, code) {
47
47
  let challenge = new Identity.AuthCodeChallenge(this.issuer, this.audience, this.redirectUri, code);
@@ -71,10 +71,27 @@ export class AuthCodeHandler extends IdentityHandler {
71
71
  status: 'actionable',
72
72
  message: 'request-redirect',
73
73
  handle: async () => {
74
- const url = await this.commitAuth(window.location.pathname, false, request.id, address);
75
- window.location.href = url;
74
+ const navigation = this.getNavigation();
75
+ const url = await this.commitAuth(navigation.getPathname(), false, request.id, address);
76
+ navigation.redirect(url);
76
77
  return true;
77
78
  },
78
79
  };
79
80
  }
81
+ serializeQuery(params) {
82
+ const searchParamsCtor = this.env.urlSearchParams ?? globalThis.URLSearchParams;
83
+ if (searchParamsCtor) {
84
+ return new searchParamsCtor(params).toString();
85
+ }
86
+ return Object.entries(params)
87
+ .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
88
+ .join('&');
89
+ }
90
+ getNavigation() {
91
+ const navigation = this.env.navigation;
92
+ if (!navigation) {
93
+ throw new Error('navigation is not available');
94
+ }
95
+ return navigation;
96
+ }
80
97
  }
@@ -4,13 +4,15 @@ import * as Identity from '@0xsequence/identity-instrument';
4
4
  import { Signatures } from '../signatures.js';
5
5
  import { BaseSignatureRequest } from '../types/signature-request.js';
6
6
  import { IdentitySigner } from '../../identity/signer.js';
7
+ import { type WdkEnv } from '../../env.js';
7
8
  export declare const identityTypeToHex: (identityType?: Identity.IdentityType) => Hex.Hex;
8
9
  export declare class IdentityHandler {
9
10
  private readonly nitro;
10
11
  private readonly authKeys;
11
12
  private readonly signatures;
12
13
  readonly identityType: Identity.IdentityType;
13
- constructor(nitro: Identity.IdentityInstrument, authKeys: Db.AuthKeys, signatures: Signatures, identityType: Identity.IdentityType);
14
+ protected readonly env: WdkEnv;
15
+ constructor(nitro: Identity.IdentityInstrument, authKeys: Db.AuthKeys, signatures: Signatures, identityType: Identity.IdentityType, env?: WdkEnv);
14
16
  onStatusChange(cb: () => void): () => void;
15
17
  protected nitroCommitVerifier(challenge: Identity.Challenge): Promise<Identity.Client.CommitVerifierReturn>;
16
18
  protected nitroCompleteAuth(challenge: Identity.Challenge): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAS,MAAM,IAAI,CAAA;AAC/B,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,cAAc,EAAqB,MAAM,0BAA0B,CAAA;AAE5E,eAAO,MAAM,iBAAiB,GAAI,eAAe,QAAQ,CAAC,YAAY,KAAG,GAAG,CAAC,GAW5E,CAAA;AAED,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;aACX,YAAY,EAAE,QAAQ,CAAC,YAAY;gBAHlC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACrB,UAAU,EAAE,UAAU,EACvB,YAAY,EAAE,QAAQ,CAAC,YAAY;IAG9C,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;cAIjC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS;cAWjD,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS;;;;cAkB/C,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB;cAQ1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;YAQxE,UAAU;CAsBzB"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAS,MAAM,IAAI,CAAA;AAC/B,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,KAAK,QAAQ,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACpE,OAAO,EAAE,cAAc,EAAqB,MAAM,0BAA0B,CAAA;AAC5E,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AAEzD,eAAO,MAAM,iBAAiB,GAAI,eAAe,QAAQ,CAAC,YAAY,KAAG,GAAG,CAAC,GAW5E,CAAA;AAED,qBAAa,eAAe;IAIxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;aACX,YAAY,EAAE,QAAQ,CAAC,YAAY;IANrD,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;gBAGX,KAAK,EAAE,QAAQ,CAAC,kBAAkB,EAClC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACrB,UAAU,EAAE,UAAU,EACvB,YAAY,EAAE,QAAQ,CAAC,YAAY,EACnD,GAAG,CAAC,EAAE,MAAM;IAKP,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;cAIjC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS;cAWjD,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS;;;;cAkB/C,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB;cAQ1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;YAQxE,UAAU;CA0BzB"}