@0xsequence/wallet-wdk 0.0.0-20250520201059
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/.env.test +3 -0
- package/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +11 -0
- package/LICENSE +202 -0
- package/dist/dbs/auth-commitments.d.ts +17 -0
- package/dist/dbs/auth-commitments.d.ts.map +1 -0
- package/dist/dbs/auth-commitments.js +13 -0
- package/dist/dbs/auth-keys.d.ts +19 -0
- package/dist/dbs/auth-keys.d.ts.map +1 -0
- package/dist/dbs/auth-keys.js +67 -0
- package/dist/dbs/generic.d.ts +33 -0
- package/dist/dbs/generic.d.ts.map +1 -0
- package/dist/dbs/generic.js +170 -0
- package/dist/dbs/index.d.ts +12 -0
- package/dist/dbs/index.d.ts.map +1 -0
- package/dist/dbs/index.js +8 -0
- package/dist/dbs/messages.d.ts +6 -0
- package/dist/dbs/messages.d.ts.map +1 -0
- package/dist/dbs/messages.js +13 -0
- package/dist/dbs/recovery.d.ts +6 -0
- package/dist/dbs/recovery.d.ts.map +1 -0
- package/dist/dbs/recovery.js +13 -0
- package/dist/dbs/signatures.d.ts +6 -0
- package/dist/dbs/signatures.d.ts.map +1 -0
- package/dist/dbs/signatures.js +13 -0
- package/dist/dbs/transactions.d.ts +6 -0
- package/dist/dbs/transactions.d.ts.map +1 -0
- package/dist/dbs/transactions.js +13 -0
- package/dist/dbs/wallets.d.ts +6 -0
- package/dist/dbs/wallets.d.ts.map +1 -0
- package/dist/dbs/wallets.js +13 -0
- package/dist/identity/signer.d.ts +17 -0
- package/dist/identity/signer.d.ts.map +1 -0
- package/dist/identity/signer.js +58 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/sequence/cron.d.ts +19 -0
- package/dist/sequence/cron.d.ts.map +1 -0
- package/dist/sequence/cron.js +118 -0
- package/dist/sequence/devices.d.ts +14 -0
- package/dist/sequence/devices.d.ts.map +1 -0
- package/dist/sequence/devices.js +43 -0
- package/dist/sequence/handlers/authcode-pkce.d.ts +14 -0
- package/dist/sequence/handlers/authcode-pkce.d.ts.map +1 -0
- package/dist/sequence/handlers/authcode-pkce.js +48 -0
- package/dist/sequence/handlers/authcode.d.ts +25 -0
- package/dist/sequence/handlers/authcode.d.ts.map +1 -0
- package/dist/sequence/handlers/authcode.js +91 -0
- package/dist/sequence/handlers/devices.d.ts +14 -0
- package/dist/sequence/handlers/devices.d.ts.map +1 -0
- package/dist/sequence/handlers/devices.js +39 -0
- package/dist/sequence/handlers/handler.d.ts +8 -0
- package/dist/sequence/handlers/handler.d.ts.map +1 -0
- package/dist/sequence/handlers/handler.js +1 -0
- package/dist/sequence/handlers/identity.d.ts +21 -0
- package/dist/sequence/handlers/identity.d.ts.map +1 -0
- package/dist/sequence/handlers/identity.js +86 -0
- package/dist/sequence/handlers/index.d.ts +7 -0
- package/dist/sequence/handlers/index.d.ts.map +1 -0
- package/dist/sequence/handlers/index.js +5 -0
- package/dist/sequence/handlers/mnemonic.d.ts +19 -0
- package/dist/sequence/handlers/mnemonic.d.ts.map +1 -0
- package/dist/sequence/handlers/mnemonic.js +67 -0
- package/dist/sequence/handlers/otp.d.ts +20 -0
- package/dist/sequence/handlers/otp.d.ts.map +1 -0
- package/dist/sequence/handlers/otp.js +83 -0
- package/dist/sequence/handlers/passkeys.d.ts +17 -0
- package/dist/sequence/handlers/passkeys.d.ts.map +1 -0
- package/dist/sequence/handlers/passkeys.js +63 -0
- package/dist/sequence/handlers/recovery.d.ts +15 -0
- package/dist/sequence/handlers/recovery.d.ts.map +1 -0
- package/dist/sequence/handlers/recovery.js +72 -0
- package/dist/sequence/index.d.ts +12 -0
- package/dist/sequence/index.d.ts.map +1 -0
- package/dist/sequence/index.js +9 -0
- package/dist/sequence/logger.d.ts +7 -0
- package/dist/sequence/logger.d.ts.map +1 -0
- package/dist/sequence/logger.js +11 -0
- package/dist/sequence/manager.d.ts +287 -0
- package/dist/sequence/manager.d.ts.map +1 -0
- package/dist/sequence/manager.js +356 -0
- package/dist/sequence/messages.d.ts +18 -0
- package/dist/sequence/messages.d.ts.map +1 -0
- package/dist/sequence/messages.js +115 -0
- package/dist/sequence/recovery.d.ts +30 -0
- package/dist/sequence/recovery.d.ts.map +1 -0
- package/dist/sequence/recovery.js +314 -0
- package/dist/sequence/sessions.d.ts +26 -0
- package/dist/sequence/sessions.d.ts.map +1 -0
- package/dist/sequence/sessions.js +169 -0
- package/dist/sequence/signatures.d.ts +21 -0
- package/dist/sequence/signatures.d.ts.map +1 -0
- package/dist/sequence/signatures.js +192 -0
- package/dist/sequence/signers.d.ts +14 -0
- package/dist/sequence/signers.d.ts.map +1 -0
- package/dist/sequence/signers.js +74 -0
- package/dist/sequence/transactions.d.ts +26 -0
- package/dist/sequence/transactions.d.ts.map +1 -0
- package/dist/sequence/transactions.js +201 -0
- package/dist/sequence/types/index.d.ts +9 -0
- package/dist/sequence/types/index.d.ts.map +1 -0
- package/dist/sequence/types/index.js +2 -0
- package/dist/sequence/types/message-request.d.ts +23 -0
- package/dist/sequence/types/message-request.d.ts.map +1 -0
- package/dist/sequence/types/message-request.js +1 -0
- package/dist/sequence/types/recovery.d.ts +15 -0
- package/dist/sequence/types/recovery.d.ts.map +1 -0
- package/dist/sequence/types/recovery.js +1 -0
- package/dist/sequence/types/signature-request.d.ts +76 -0
- package/dist/sequence/types/signature-request.d.ts.map +1 -0
- package/dist/sequence/types/signature-request.js +11 -0
- package/dist/sequence/types/signer.d.ts +28 -0
- package/dist/sequence/types/signer.d.ts.map +1 -0
- package/dist/sequence/types/signer.js +10 -0
- package/dist/sequence/types/transaction-request.d.ts +41 -0
- package/dist/sequence/types/transaction-request.d.ts.map +1 -0
- package/dist/sequence/types/transaction-request.js +1 -0
- package/dist/sequence/types/wallet.d.ts +21 -0
- package/dist/sequence/types/wallet.d.ts.map +1 -0
- package/dist/sequence/types/wallet.js +1 -0
- package/dist/sequence/wallets.d.ts +121 -0
- package/dist/sequence/wallets.d.ts.map +1 -0
- package/dist/sequence/wallets.js +632 -0
- package/package.json +40 -0
- package/src/dbs/auth-commitments.ts +26 -0
- package/src/dbs/auth-keys.ts +85 -0
- package/src/dbs/generic.ts +194 -0
- package/src/dbs/index.ts +13 -0
- package/src/dbs/messages.ts +16 -0
- package/src/dbs/recovery.ts +15 -0
- package/src/dbs/signatures.ts +15 -0
- package/src/dbs/transactions.ts +16 -0
- package/src/dbs/wallets.ts +16 -0
- package/src/identity/signer.ts +78 -0
- package/src/index.ts +2 -0
- package/src/sequence/cron.ts +134 -0
- package/src/sequence/devices.ts +53 -0
- package/src/sequence/handlers/authcode-pkce.ts +70 -0
- package/src/sequence/handlers/authcode.ts +116 -0
- package/src/sequence/handlers/devices.ts +53 -0
- package/src/sequence/handlers/handler.ts +14 -0
- package/src/sequence/handlers/identity.ts +101 -0
- package/src/sequence/handlers/index.ts +6 -0
- package/src/sequence/handlers/mnemonic.ts +88 -0
- package/src/sequence/handlers/otp.ts +107 -0
- package/src/sequence/handlers/passkeys.ts +84 -0
- package/src/sequence/handlers/recovery.ts +88 -0
- package/src/sequence/index.ts +25 -0
- package/src/sequence/logger.ts +11 -0
- package/src/sequence/manager.ts +634 -0
- package/src/sequence/messages.ts +146 -0
- package/src/sequence/recovery.ts +429 -0
- package/src/sequence/sessions.ts +238 -0
- package/src/sequence/signatures.ts +263 -0
- package/src/sequence/signers.ts +88 -0
- package/src/sequence/transactions.ts +281 -0
- package/src/sequence/types/index.ts +27 -0
- package/src/sequence/types/message-request.ts +26 -0
- package/src/sequence/types/recovery.ts +15 -0
- package/src/sequence/types/signature-request.ts +89 -0
- package/src/sequence/types/signer.ts +32 -0
- package/src/sequence/types/transaction-request.ts +47 -0
- package/src/sequence/types/wallet.ts +24 -0
- package/src/sequence/wallets.ts +853 -0
- package/test/constants.ts +62 -0
- package/test/recovery.test.ts +211 -0
- package/test/sessions.test.ts +324 -0
- package/test/setup.ts +63 -0
- package/test/transactions.test.ts +464 -0
- package/test/wallets.test.ts +381 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +11 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Generic } from './generic.js';
|
|
2
|
+
const TABLE_NAME = 'envelopes';
|
|
3
|
+
export class Signatures extends Generic {
|
|
4
|
+
constructor(dbName = 'sequence-signature-requests') {
|
|
5
|
+
super(dbName, TABLE_NAME, 'id', [
|
|
6
|
+
(db) => {
|
|
7
|
+
if (!db.objectStoreNames.contains(TABLE_NAME)) {
|
|
8
|
+
db.createObjectStore(TABLE_NAME);
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/dbs/transactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,qBAAa,YAAa,SAAQ,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;gBAC9C,MAAM,GAAE,MAAgC;CASrD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Generic } from './generic.js';
|
|
2
|
+
const TABLE_NAME = 'transactions';
|
|
3
|
+
export class Transactions extends Generic {
|
|
4
|
+
constructor(dbName = 'sequence-transactions') {
|
|
5
|
+
super(dbName, TABLE_NAME, 'id', [
|
|
6
|
+
(db) => {
|
|
7
|
+
if (!db.objectStoreNames.contains(TABLE_NAME)) {
|
|
8
|
+
db.createObjectStore(TABLE_NAME);
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../src/dbs/wallets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAIpD,qBAAa,OAAQ,SAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;gBACzC,MAAM,GAAE,MAA2B;CAShD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Generic } from './generic.js';
|
|
2
|
+
const TABLE_NAME = 'wallets';
|
|
3
|
+
export class Wallets extends Generic {
|
|
4
|
+
constructor(dbName = 'sequence-manager') {
|
|
5
|
+
super(dbName, TABLE_NAME, 'address', [
|
|
6
|
+
(db) => {
|
|
7
|
+
if (!db.objectStoreNames.contains(TABLE_NAME)) {
|
|
8
|
+
db.createObjectStore(TABLE_NAME);
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Address, Bytes } from 'ox';
|
|
2
|
+
import { Signers, State } from '@0xsequence/wallet-core';
|
|
3
|
+
import { IdentityInstrument } from '@0xsequence/identity-instrument';
|
|
4
|
+
import { AuthKey } from '../dbs/auth-keys.js';
|
|
5
|
+
import { Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives';
|
|
6
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
7
|
+
export declare function toIdentityAuthKey(authKey: AuthKey): Identity.AuthKey;
|
|
8
|
+
export declare class IdentitySigner implements Signers.Signer {
|
|
9
|
+
readonly identityInstrument: IdentityInstrument;
|
|
10
|
+
readonly authKey: AuthKey;
|
|
11
|
+
constructor(identityInstrument: IdentityInstrument, authKey: AuthKey);
|
|
12
|
+
get address(): `0x${string}`;
|
|
13
|
+
sign(wallet: Address.Address, chainId: bigint, payload: Payload.Parented): Promise<SequenceSignature.SignatureOfSignerLeaf>;
|
|
14
|
+
signDigest(digest: Bytes.Bytes): Promise<SequenceSignature.SignatureOfSignerLeafHash>;
|
|
15
|
+
witness(stateWriter: State.Writer, wallet: Address.Address, extra?: Object): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=signer.d.ts.map
|
|
@@ -0,0 +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,KAAK,MAAM,EAAE,CAK3B;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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Address, Signature, Hex } from 'ox';
|
|
2
|
+
import { Payload } from '@0xsequence/wallet-primitives';
|
|
3
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
4
|
+
export function toIdentityAuthKey(authKey) {
|
|
5
|
+
return {
|
|
6
|
+
address: authKey.address,
|
|
7
|
+
keyType: Identity.KeyType.P256R1,
|
|
8
|
+
signer: authKey.identitySigner,
|
|
9
|
+
async sign(digest) {
|
|
10
|
+
const authKeySignature = await window.crypto.subtle.sign({
|
|
11
|
+
name: 'ECDSA',
|
|
12
|
+
hash: 'SHA-256',
|
|
13
|
+
}, authKey.privateKey, digest);
|
|
14
|
+
return Hex.fromBytes(new Uint8Array(authKeySignature));
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export class IdentitySigner {
|
|
19
|
+
identityInstrument;
|
|
20
|
+
authKey;
|
|
21
|
+
constructor(identityInstrument, authKey) {
|
|
22
|
+
this.identityInstrument = identityInstrument;
|
|
23
|
+
this.authKey = authKey;
|
|
24
|
+
}
|
|
25
|
+
get address() {
|
|
26
|
+
if (!Address.validate(this.authKey.identitySigner)) {
|
|
27
|
+
throw new Error('No signer address found');
|
|
28
|
+
}
|
|
29
|
+
return Address.checksum(this.authKey.identitySigner);
|
|
30
|
+
}
|
|
31
|
+
async sign(wallet, chainId, payload) {
|
|
32
|
+
const payloadHash = Payload.hash(wallet, chainId, payload);
|
|
33
|
+
return this.signDigest(payloadHash);
|
|
34
|
+
}
|
|
35
|
+
async signDigest(digest) {
|
|
36
|
+
const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey), digest);
|
|
37
|
+
const sig = Signature.fromHex(sigHex);
|
|
38
|
+
return {
|
|
39
|
+
type: 'hash',
|
|
40
|
+
...sig,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async witness(stateWriter, wallet, extra) {
|
|
44
|
+
const payload = Payload.fromMessage(Hex.fromString(JSON.stringify({
|
|
45
|
+
action: 'consent-to-be-part-of-wallet',
|
|
46
|
+
wallet,
|
|
47
|
+
signer: this.address,
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
...extra,
|
|
50
|
+
})));
|
|
51
|
+
const signature = await this.sign(wallet, 0n, payload);
|
|
52
|
+
await stateWriter.saveWitnesses(wallet, 0n, payload, {
|
|
53
|
+
type: 'unrecovered-signer',
|
|
54
|
+
weight: 1n,
|
|
55
|
+
signature,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Shared } from './manager.js';
|
|
2
|
+
export declare class Cron {
|
|
3
|
+
private readonly shared;
|
|
4
|
+
private jobs;
|
|
5
|
+
private checkInterval?;
|
|
6
|
+
private readonly STORAGE_KEY;
|
|
7
|
+
private isStopping;
|
|
8
|
+
private currentCheckJobsPromise;
|
|
9
|
+
constructor(shared: Shared);
|
|
10
|
+
private start;
|
|
11
|
+
private executeCheckJobsChain;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
registerJob(id: string, interval: number, handler: () => Promise<void>): void;
|
|
14
|
+
unregisterJob(id: string): void;
|
|
15
|
+
private checkJobs;
|
|
16
|
+
private getStorageState;
|
|
17
|
+
private syncWithStorage;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cron.d.ts.map
|
|
@@ -0,0 +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,qBAAa,IAAI;IAOH,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,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;gBAErC,MAAM,EAAE,MAAM;IAI3C,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,qBAAqB;IAWhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAelC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAStE,aAAa,CAAC,EAAE,EAAE,MAAM;YAIV,SAAS;YAwDT,eAAe;YAMf,eAAe;CAK9B"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export class Cron {
|
|
2
|
+
shared;
|
|
3
|
+
jobs = new Map();
|
|
4
|
+
checkInterval;
|
|
5
|
+
STORAGE_KEY = 'sequence-cron-jobs';
|
|
6
|
+
isStopping = false;
|
|
7
|
+
currentCheckJobsPromise = Promise.resolve();
|
|
8
|
+
constructor(shared) {
|
|
9
|
+
this.shared = shared;
|
|
10
|
+
this.start();
|
|
11
|
+
}
|
|
12
|
+
start() {
|
|
13
|
+
if (this.isStopping)
|
|
14
|
+
return;
|
|
15
|
+
this.executeCheckJobsChain();
|
|
16
|
+
this.checkInterval = setInterval(() => this.executeCheckJobsChain(), 60 * 1000);
|
|
17
|
+
}
|
|
18
|
+
// Wraps checkJobs to chain executions and manage currentCheckJobsPromise
|
|
19
|
+
executeCheckJobsChain() {
|
|
20
|
+
this.currentCheckJobsPromise = this.currentCheckJobsPromise
|
|
21
|
+
.catch(() => { }) // Ignore errors from previous chain link for sequencing
|
|
22
|
+
.then(() => {
|
|
23
|
+
if (!this.isStopping) {
|
|
24
|
+
return this.checkJobs();
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async stop() {
|
|
30
|
+
this.isStopping = true;
|
|
31
|
+
if (this.checkInterval) {
|
|
32
|
+
clearInterval(this.checkInterval);
|
|
33
|
+
this.checkInterval = undefined;
|
|
34
|
+
this.shared.modules.logger.log('Cron: Interval cleared.');
|
|
35
|
+
}
|
|
36
|
+
// Wait for the promise of the last (or current) checkJobs execution
|
|
37
|
+
await this.currentCheckJobsPromise.catch((err) => {
|
|
38
|
+
console.error('Cron: Error during currentCheckJobsPromise settlement in stop():', err);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
registerJob(id, interval, handler) {
|
|
42
|
+
if (this.jobs.has(id)) {
|
|
43
|
+
throw new Error(`Job with ID ${id} already exists`);
|
|
44
|
+
}
|
|
45
|
+
const job = { id, interval, lastRun: 0, handler };
|
|
46
|
+
this.jobs.set(id, job);
|
|
47
|
+
// No syncWithStorage needed here, it happens in checkJobs
|
|
48
|
+
}
|
|
49
|
+
unregisterJob(id) {
|
|
50
|
+
this.jobs.delete(id);
|
|
51
|
+
}
|
|
52
|
+
async checkJobs() {
|
|
53
|
+
if (this.isStopping) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await navigator.locks.request('sequence-cron-jobs', async (lock) => {
|
|
58
|
+
if (this.isStopping) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!lock) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const storage = await this.getStorageState();
|
|
66
|
+
for (const [id, job] of this.jobs) {
|
|
67
|
+
if (this.isStopping) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
const lastRun = storage.get(id)?.lastRun ?? job.lastRun;
|
|
71
|
+
const timeSinceLastRun = now - lastRun;
|
|
72
|
+
if (timeSinceLastRun >= job.interval) {
|
|
73
|
+
try {
|
|
74
|
+
await job.handler();
|
|
75
|
+
if (!this.isStopping) {
|
|
76
|
+
job.lastRun = now;
|
|
77
|
+
storage.set(id, { lastRun: now });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
84
|
+
this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(`Cron job ${id} failed:`, error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!this.isStopping) {
|
|
93
|
+
await this.syncWithStorage();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
99
|
+
this.shared.modules.logger.log('Cron: navigator.locks.request was aborted.');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error('Cron: Error in navigator.locks.request:', error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async getStorageState() {
|
|
107
|
+
if (this.isStopping)
|
|
108
|
+
return new Map();
|
|
109
|
+
const state = localStorage.getItem(this.STORAGE_KEY);
|
|
110
|
+
return new Map(state ? JSON.parse(state) : []);
|
|
111
|
+
}
|
|
112
|
+
async syncWithStorage() {
|
|
113
|
+
if (this.isStopping)
|
|
114
|
+
return;
|
|
115
|
+
const state = Array.from(this.jobs.entries()).map(([id, job]) => [id, { lastRun: job.lastRun }]);
|
|
116
|
+
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(state));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Signers } from '@0xsequence/wallet-core';
|
|
2
|
+
import { Address } from 'ox';
|
|
3
|
+
import { Shared } from './manager.js';
|
|
4
|
+
export declare class Devices {
|
|
5
|
+
private readonly shared;
|
|
6
|
+
constructor(shared: Shared);
|
|
7
|
+
list(): Promise<`0x${string}`[]>;
|
|
8
|
+
has(address: Address.Address): Promise<boolean>;
|
|
9
|
+
create(): Promise<Signers.Pk.Pk>;
|
|
10
|
+
get(address: Address.Address): Promise<Signers.Pk.Pk | undefined>;
|
|
11
|
+
witness(address: Address.Address, wallet: Address.Address): Promise<void>;
|
|
12
|
+
remove(address: Address.Address): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/sequence/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAErC,IAAI;IAIJ,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO;IAK5B,MAAM;IAYN,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO;IAS5B,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO;IAWzD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO;CAGtC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Signers } from '@0xsequence/wallet-core';
|
|
2
|
+
import { Kinds } from './types/signer.js';
|
|
3
|
+
export class Devices {
|
|
4
|
+
shared;
|
|
5
|
+
constructor(shared) {
|
|
6
|
+
this.shared = shared;
|
|
7
|
+
}
|
|
8
|
+
async list() {
|
|
9
|
+
return this.shared.databases.encryptedPks.listAddresses();
|
|
10
|
+
}
|
|
11
|
+
async has(address) {
|
|
12
|
+
const entry = await this.shared.databases.encryptedPks.getEncryptedEntry(address);
|
|
13
|
+
return entry !== undefined;
|
|
14
|
+
}
|
|
15
|
+
async create() {
|
|
16
|
+
const e = await this.shared.databases.encryptedPks.generateAndStore();
|
|
17
|
+
const s = await this.shared.databases.encryptedPks.getEncryptedPkStore(e.address);
|
|
18
|
+
if (!s) {
|
|
19
|
+
throw new Error('Failed to create session');
|
|
20
|
+
}
|
|
21
|
+
this.shared.modules.logger.log('Created new session:', s.address);
|
|
22
|
+
return new Signers.Pk.Pk(s);
|
|
23
|
+
}
|
|
24
|
+
async get(address) {
|
|
25
|
+
const s = await this.shared.databases.encryptedPks.getEncryptedPkStore(address);
|
|
26
|
+
if (!s) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return new Signers.Pk.Pk(s);
|
|
30
|
+
}
|
|
31
|
+
async witness(address, wallet) {
|
|
32
|
+
const signer = await this.get(address);
|
|
33
|
+
if (!signer) {
|
|
34
|
+
throw new Error('Signer not found');
|
|
35
|
+
}
|
|
36
|
+
await signer.witness(this.shared.sequence.stateProvider, wallet, {
|
|
37
|
+
signerKind: Kinds.LocalDevice,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async remove(address) {
|
|
41
|
+
await this.shared.databases.encryptedPks.remove(address);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Handler } from './handler.js';
|
|
2
|
+
import * as Db from '../../dbs/index.js';
|
|
3
|
+
import { Signatures } from '../signatures.js';
|
|
4
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
5
|
+
import { IdentitySigner } from '../../identity/signer.js';
|
|
6
|
+
import { AuthCodeHandler } from './authcode.js';
|
|
7
|
+
export declare class AuthCodePkceHandler extends AuthCodeHandler implements Handler {
|
|
8
|
+
constructor(signupKind: 'google-pkce', issuer: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys);
|
|
9
|
+
commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string): Promise<string>;
|
|
10
|
+
completeAuth(commitment: Db.AuthCommitment, code: string): Promise<[IdentitySigner, {
|
|
11
|
+
[key: string]: string;
|
|
12
|
+
}]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=authcode-pkce.d.ts.map
|
|
@@ -0,0 +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,EACzB,MAAM,EAAE,MAAM,EACd,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;IAmC7E,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;CAUxD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Hex, Bytes } from 'ox';
|
|
2
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
3
|
+
import { AuthCodeHandler } from './authcode.js';
|
|
4
|
+
export class AuthCodePkceHandler extends AuthCodeHandler {
|
|
5
|
+
constructor(signupKind, issuer, audience, nitro, signatures, commitments, authKeys) {
|
|
6
|
+
super(signupKind, issuer, audience, nitro, signatures, commitments, authKeys);
|
|
7
|
+
}
|
|
8
|
+
async commitAuth(target, isSignUp, state, signer) {
|
|
9
|
+
let challenge = new Identity.AuthCodePkceChallenge(this.issuer, this.audience, this.redirectUri);
|
|
10
|
+
if (signer) {
|
|
11
|
+
challenge = challenge.withSigner(signer);
|
|
12
|
+
}
|
|
13
|
+
const { verifier, loginHint, challenge: codeChallenge } = await this.nitroCommitVerifier(challenge);
|
|
14
|
+
if (!state) {
|
|
15
|
+
state = Hex.fromBytes(Bytes.random(32));
|
|
16
|
+
}
|
|
17
|
+
await this.commitments.set({
|
|
18
|
+
id: state,
|
|
19
|
+
kind: this.signupKind,
|
|
20
|
+
verifier,
|
|
21
|
+
challenge: codeChallenge,
|
|
22
|
+
target,
|
|
23
|
+
metadata: {},
|
|
24
|
+
isSignUp,
|
|
25
|
+
});
|
|
26
|
+
const searchParams = new URLSearchParams({
|
|
27
|
+
code_challenge: codeChallenge,
|
|
28
|
+
code_challenge_method: 'S256',
|
|
29
|
+
client_id: this.audience,
|
|
30
|
+
redirect_uri: this.redirectUri,
|
|
31
|
+
login_hint: loginHint,
|
|
32
|
+
response_type: 'code',
|
|
33
|
+
scope: 'openid profile email',
|
|
34
|
+
state,
|
|
35
|
+
});
|
|
36
|
+
const oauthUrl = this.oauthUrl();
|
|
37
|
+
return `${oauthUrl}?${searchParams.toString()}`;
|
|
38
|
+
}
|
|
39
|
+
async completeAuth(commitment, code) {
|
|
40
|
+
const challenge = new Identity.AuthCodePkceChallenge('', '', '');
|
|
41
|
+
if (!commitment.verifier) {
|
|
42
|
+
throw new Error('Missing verifier in commitment');
|
|
43
|
+
}
|
|
44
|
+
const signer = await this.nitroCompleteAuth(challenge.withAnswer(commitment.verifier, code));
|
|
45
|
+
await this.commitments.del(commitment.id);
|
|
46
|
+
return [signer, commitment.metadata];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Hex, Address } from 'ox';
|
|
2
|
+
import { Handler } from './handler.js';
|
|
3
|
+
import * as Db from '../../dbs/index.js';
|
|
4
|
+
import { Signatures } from '../signatures.js';
|
|
5
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
6
|
+
import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest } from '../types/signature-request.js';
|
|
7
|
+
import { IdentitySigner } from '../../identity/signer.js';
|
|
8
|
+
import { IdentityHandler } from './identity.js';
|
|
9
|
+
export declare class AuthCodeHandler extends IdentityHandler implements Handler {
|
|
10
|
+
readonly signupKind: 'apple' | 'google-pkce';
|
|
11
|
+
readonly issuer: string;
|
|
12
|
+
readonly audience: string;
|
|
13
|
+
protected readonly commitments: Db.AuthCommitments;
|
|
14
|
+
protected redirectUri: string;
|
|
15
|
+
constructor(signupKind: 'apple' | 'google-pkce', issuer: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys);
|
|
16
|
+
get kind(): string;
|
|
17
|
+
setRedirectUri(redirectUri: string): void;
|
|
18
|
+
commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string): Promise<string>;
|
|
19
|
+
completeAuth(commitment: Db.AuthCommitment, code: string): Promise<[IdentitySigner, {
|
|
20
|
+
[key: string]: string;
|
|
21
|
+
}]>;
|
|
22
|
+
status(address: Address.Address, _imageHash: Hex.Hex | undefined, request: BaseSignatureRequest): Promise<SignerUnavailable | SignerReady | SignerActionable>;
|
|
23
|
+
protected oauthUrl(): "https://accounts.google.com/o/oauth2/v2/auth" | "https://appleid.apple.com/auth/authorize";
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=authcode.d.ts.map
|
|
@@ -0,0 +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;aACnC,MAAM,EAAE,MAAM;aACd,QAAQ,EAAE,MAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,eAAe;IARpD,SAAS,CAAC,WAAW,EAAE,MAAM,CAAK;gBAGhB,UAAU,EAAE,OAAO,GAAG,aAAa,EACnC,MAAM,EAAE,MAAM,EACd,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;IA0B7E,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;IA6B9D,SAAS,CAAC,QAAQ;CAUnB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Hex, Address, Bytes } from 'ox';
|
|
2
|
+
import * as Identity from '@0xsequence/identity-instrument';
|
|
3
|
+
import { IdentityHandler } from './identity.js';
|
|
4
|
+
export class AuthCodeHandler extends IdentityHandler {
|
|
5
|
+
signupKind;
|
|
6
|
+
issuer;
|
|
7
|
+
audience;
|
|
8
|
+
commitments;
|
|
9
|
+
redirectUri = '';
|
|
10
|
+
constructor(signupKind, issuer, audience, nitro, signatures, commitments, authKeys) {
|
|
11
|
+
super(nitro, authKeys, signatures, Identity.IdentityType.OIDC);
|
|
12
|
+
this.signupKind = signupKind;
|
|
13
|
+
this.issuer = issuer;
|
|
14
|
+
this.audience = audience;
|
|
15
|
+
this.commitments = commitments;
|
|
16
|
+
}
|
|
17
|
+
get kind() {
|
|
18
|
+
return 'login-' + this.signupKind;
|
|
19
|
+
}
|
|
20
|
+
setRedirectUri(redirectUri) {
|
|
21
|
+
this.redirectUri = redirectUri;
|
|
22
|
+
}
|
|
23
|
+
async commitAuth(target, isSignUp, state, signer) {
|
|
24
|
+
if (!state) {
|
|
25
|
+
state = Hex.fromBytes(Bytes.random(32));
|
|
26
|
+
}
|
|
27
|
+
await this.commitments.set({
|
|
28
|
+
id: state,
|
|
29
|
+
kind: this.signupKind,
|
|
30
|
+
signer,
|
|
31
|
+
target,
|
|
32
|
+
metadata: {},
|
|
33
|
+
isSignUp,
|
|
34
|
+
});
|
|
35
|
+
const searchParams = new URLSearchParams({
|
|
36
|
+
client_id: this.audience,
|
|
37
|
+
redirect_uri: this.redirectUri,
|
|
38
|
+
response_type: 'code',
|
|
39
|
+
scope: 'openid',
|
|
40
|
+
state,
|
|
41
|
+
});
|
|
42
|
+
const oauthUrl = this.oauthUrl();
|
|
43
|
+
return `${oauthUrl}?${searchParams.toString()}`;
|
|
44
|
+
}
|
|
45
|
+
async completeAuth(commitment, code) {
|
|
46
|
+
let challenge = new Identity.AuthCodeChallenge(this.issuer, this.audience, this.redirectUri, code);
|
|
47
|
+
if (commitment.signer) {
|
|
48
|
+
challenge = challenge.withSigner(commitment.signer);
|
|
49
|
+
}
|
|
50
|
+
await this.nitroCommitVerifier(challenge);
|
|
51
|
+
const signer = await this.nitroCompleteAuth(challenge);
|
|
52
|
+
return [signer, {}];
|
|
53
|
+
}
|
|
54
|
+
async status(address, _imageHash, request) {
|
|
55
|
+
// Normalize address
|
|
56
|
+
const normalizedAddress = Address.checksum(address);
|
|
57
|
+
const signer = await this.getAuthKeySigner(normalizedAddress);
|
|
58
|
+
if (signer) {
|
|
59
|
+
return {
|
|
60
|
+
address: normalizedAddress,
|
|
61
|
+
handler: this,
|
|
62
|
+
status: 'ready',
|
|
63
|
+
handle: async () => {
|
|
64
|
+
await this.sign(signer, request);
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
address: normalizedAddress,
|
|
71
|
+
handler: this,
|
|
72
|
+
status: 'actionable',
|
|
73
|
+
message: 'request-redirect',
|
|
74
|
+
handle: async () => {
|
|
75
|
+
const url = await this.commitAuth(window.location.pathname, false, request.id, normalizedAddress);
|
|
76
|
+
window.location.href = url;
|
|
77
|
+
return true;
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
oauthUrl() {
|
|
82
|
+
switch (this.issuer) {
|
|
83
|
+
case 'https://accounts.google.com':
|
|
84
|
+
return 'https://accounts.google.com/o/oauth2/v2/auth';
|
|
85
|
+
case 'https://appleid.apple.com':
|
|
86
|
+
return 'https://appleid.apple.com/auth/authorize';
|
|
87
|
+
default:
|
|
88
|
+
throw new Error('unsupported-issuer');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Signatures } from '../signatures.js';
|
|
2
|
+
import { Address, Hex } from 'ox';
|
|
3
|
+
import { Devices } from '../devices.js';
|
|
4
|
+
import { Handler } from './handler.js';
|
|
5
|
+
import { SignerReady, SignerUnavailable, BaseSignatureRequest } from '../types/index.js';
|
|
6
|
+
export declare class DevicesHandler implements Handler {
|
|
7
|
+
private readonly signatures;
|
|
8
|
+
private readonly devices;
|
|
9
|
+
kind: "local-device";
|
|
10
|
+
constructor(signatures: Signatures, devices: Devices);
|
|
11
|
+
onStatusChange(cb: () => void): () => void;
|
|
12
|
+
status(address: Address.Address, _imageHash: Hex.Hex | undefined, request: BaseSignatureRequest): Promise<SignerUnavailable | SignerReady>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/devices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAExF,qBAAa,cAAe,YAAW,OAAO;IAI1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,IAAI,iBAAoB;gBAGL,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAGnC,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAIpC,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,CAAC;CA6B5C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Kinds } from '../types/signer.js';
|
|
2
|
+
export class DevicesHandler {
|
|
3
|
+
signatures;
|
|
4
|
+
devices;
|
|
5
|
+
kind = Kinds.LocalDevice;
|
|
6
|
+
constructor(signatures, devices) {
|
|
7
|
+
this.signatures = signatures;
|
|
8
|
+
this.devices = devices;
|
|
9
|
+
}
|
|
10
|
+
onStatusChange(cb) {
|
|
11
|
+
return () => { };
|
|
12
|
+
}
|
|
13
|
+
async status(address, _imageHash, request) {
|
|
14
|
+
const signer = await this.devices.get(address);
|
|
15
|
+
if (!signer) {
|
|
16
|
+
const status = {
|
|
17
|
+
address,
|
|
18
|
+
handler: this,
|
|
19
|
+
reason: 'not-local-key',
|
|
20
|
+
status: 'unavailable',
|
|
21
|
+
};
|
|
22
|
+
return status;
|
|
23
|
+
}
|
|
24
|
+
const status = {
|
|
25
|
+
address,
|
|
26
|
+
handler: this,
|
|
27
|
+
status: 'ready',
|
|
28
|
+
handle: async () => {
|
|
29
|
+
const signature = await signer.sign(request.envelope.wallet, request.envelope.chainId, request.envelope.payload);
|
|
30
|
+
await this.signatures.addSignature(request.id, {
|
|
31
|
+
address,
|
|
32
|
+
signature,
|
|
33
|
+
});
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
return status;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Address, Hex } from 'ox';
|
|
2
|
+
import { SignerActionable, SignerReady, SignerUnavailable, BaseSignatureRequest } from '../types/index.js';
|
|
3
|
+
export interface Handler {
|
|
4
|
+
kind: string;
|
|
5
|
+
onStatusChange(cb: () => void): () => void;
|
|
6
|
+
status(address: Address.Address, imageHash: Hex.Hex | undefined, request: BaseSignatureRequest): Promise<SignerUnavailable | SignerReady | SignerActionable>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/sequence/handlers/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAE1G,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IAEZ,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAE1C,MAAM,CACJ,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,SAAS,EAAE,GAAG,CAAC,GAAG,GAAG,SAAS,EAC9B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,iBAAiB,GAAG,WAAW,GAAG,gBAAgB,CAAC,CAAA;CAC/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|