@astrox/connection 0.0.24 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -10
- package/lib/cjs/canisters/internet_identity_idl.d.ts +7 -0
- package/lib/cjs/canisters/internet_identity_idl.js +102 -0
- package/lib/cjs/canisters/internet_identity_idl.js.map +1 -0
- package/lib/cjs/canisters/ledger.idl.d.ts +7 -0
- package/lib/cjs/canisters/ledger.idl.js +82 -0
- package/lib/cjs/canisters/ledger.idl.js.map +1 -0
- package/lib/cjs/canisters/me.idl.d.ts +7 -0
- package/lib/cjs/canisters/me.idl.js +126 -0
- package/lib/cjs/canisters/me.idl.js.map +1 -0
- package/lib/cjs/canisters/nns-dapp-cert.idl.d.ts +7 -0
- package/lib/cjs/canisters/nns-dapp-cert.idl.js +87 -0
- package/lib/cjs/canisters/nns-dapp-cert.idl.js.map +1 -0
- package/lib/cjs/canisters/nns-dapp.idl.d.ts +7 -0
- package/lib/cjs/canisters/nns-dapp.idl.js +185 -0
- package/lib/cjs/canisters/nns-dapp.idl.js.map +1 -0
- package/lib/cjs/connections/baseConnection.d.ts +23 -0
- package/lib/cjs/connections/baseConnection.js +89 -0
- package/lib/cjs/connections/baseConnection.js.map +1 -0
- package/lib/cjs/connections/ledgerConnection.d.ts +53 -0
- package/lib/cjs/connections/ledgerConnection.js +137 -0
- package/lib/cjs/connections/ledgerConnection.js.map +1 -0
- package/lib/cjs/connections/nnsConnection.d.ts +63 -0
- package/lib/cjs/connections/nnsConnection.js +161 -0
- package/lib/cjs/connections/nnsConnection.js.map +1 -0
- package/lib/cjs/ic/icAuthClient.d.ts +31 -0
- package/lib/cjs/ic/icAuthClient.js +236 -0
- package/lib/cjs/ic/icAuthClient.js.map +1 -0
- package/lib/cjs/ic/icConnect.d.ts +36 -0
- package/lib/cjs/ic/icConnect.js +192 -0
- package/lib/cjs/ic/icConnect.js.map +1 -0
- package/lib/cjs/ic/icStorage.d.ts +16 -0
- package/lib/cjs/ic/icStorage.js +49 -0
- package/lib/cjs/ic/icStorage.js.map +1 -0
- package/lib/cjs/ic/icWindow.d.ts +8 -0
- package/lib/cjs/ic/icWindow.js +24 -0
- package/lib/cjs/ic/icWindow.js.map +1 -0
- package/lib/cjs/ic/index.d.ts +2 -0
- package/lib/cjs/ic/index.js +8 -0
- package/lib/cjs/ic/index.js.map +1 -0
- package/lib/cjs/index.d.ts +5 -0
- package/lib/cjs/index.js +18 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/types/index.d.ts +175 -0
- package/lib/cjs/types/index.js +17 -0
- package/lib/cjs/types/index.js.map +1 -0
- package/lib/cjs/utils/common/types.d.ts +15 -0
- package/lib/cjs/utils/common/types.js +12 -0
- package/lib/cjs/utils/common/types.js.map +1 -0
- package/lib/cjs/utils/constants.d.ts +6 -0
- package/lib/cjs/utils/constants.js +13 -0
- package/lib/cjs/utils/constants.js.map +1 -0
- package/lib/cjs/utils/converter.d.ts +32 -0
- package/lib/cjs/utils/converter.js +147 -0
- package/lib/cjs/utils/converter.js.map +1 -0
- package/lib/cjs/utils/index.d.ts +3 -0
- package/lib/cjs/utils/index.js +16 -0
- package/lib/cjs/utils/index.js.map +1 -0
- package/lib/esm/canisters/internet_identity_idl.d.ts +7 -0
- package/lib/esm/canisters/internet_identity_idl.js +98 -0
- package/lib/esm/canisters/internet_identity_idl.js.map +1 -0
- package/lib/esm/canisters/ledger.idl.d.ts +7 -0
- package/lib/esm/canisters/ledger.idl.js +78 -0
- package/lib/esm/canisters/ledger.idl.js.map +1 -0
- package/lib/esm/canisters/me.idl.d.ts +7 -0
- package/lib/esm/canisters/me.idl.js +122 -0
- package/lib/esm/canisters/me.idl.js.map +1 -0
- package/lib/esm/canisters/nns-dapp-cert.idl.d.ts +7 -0
- package/lib/esm/canisters/nns-dapp-cert.idl.js +83 -0
- package/lib/esm/canisters/nns-dapp-cert.idl.js.map +1 -0
- package/lib/esm/canisters/nns-dapp.idl.d.ts +7 -0
- package/lib/esm/canisters/nns-dapp.idl.js +181 -0
- package/lib/esm/canisters/nns-dapp.idl.js.map +1 -0
- package/lib/esm/connections/baseConnection.d.ts +23 -0
- package/lib/esm/connections/baseConnection.js +80 -0
- package/lib/esm/connections/baseConnection.js.map +1 -0
- package/lib/esm/connections/ledgerConnection.d.ts +53 -0
- package/lib/esm/connections/ledgerConnection.js +130 -0
- package/lib/esm/connections/ledgerConnection.js.map +1 -0
- package/lib/esm/connections/nnsConnection.d.ts +63 -0
- package/lib/esm/connections/nnsConnection.js +154 -0
- package/lib/esm/connections/nnsConnection.js.map +1 -0
- package/lib/esm/ic/icAuthClient.d.ts +31 -0
- package/lib/esm/ic/icAuthClient.js +232 -0
- package/lib/esm/ic/icAuthClient.js.map +1 -0
- package/lib/esm/ic/icConnect.d.ts +36 -0
- package/lib/esm/ic/icConnect.js +188 -0
- package/lib/esm/ic/icConnect.js.map +1 -0
- package/lib/esm/ic/icStorage.d.ts +16 -0
- package/lib/esm/ic/icStorage.js +44 -0
- package/lib/esm/ic/icStorage.js.map +1 -0
- package/lib/esm/ic/icWindow.d.ts +8 -0
- package/lib/esm/ic/icWindow.js +20 -0
- package/lib/esm/ic/icWindow.js.map +1 -0
- package/lib/esm/ic/index.d.ts +2 -0
- package/lib/esm/ic/index.js +3 -0
- package/lib/esm/ic/index.js.map +1 -0
- package/lib/esm/index.d.ts +5 -0
- package/lib/esm/index.js +6 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/types/index.d.ts +175 -0
- package/lib/esm/types/index.js +14 -0
- package/lib/esm/types/index.js.map +1 -0
- package/lib/esm/utils/common/types.d.ts +15 -0
- package/lib/esm/utils/common/types.js +9 -0
- package/lib/esm/utils/common/types.js.map +1 -0
- package/lib/esm/utils/constants.d.ts +6 -0
- package/lib/esm/utils/constants.js +10 -0
- package/lib/esm/utils/constants.js.map +1 -0
- package/lib/esm/utils/converter.d.ts +32 -0
- package/lib/esm/utils/converter.js +124 -0
- package/lib/esm/utils/converter.js.map +1 -0
- package/lib/esm/utils/index.d.ts +3 -0
- package/lib/esm/utils/index.js +4 -0
- package/lib/esm/utils/index.js.map +1 -0
- package/lib/tsconfig-cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
@@ -0,0 +1,154 @@
|
|
1
|
+
import { BaseConnection, executeWithLogging, _createActor } from './baseConnection';
|
2
|
+
import nns_idl from '../canisters/nns-dapp.idl';
|
3
|
+
import nns_idl_cert from '../canisters/nns-dapp-cert.idl';
|
4
|
+
import { NNS_CANISTER_ID } from '../utils/constants';
|
5
|
+
export class NNSConnection extends BaseConnection {
|
6
|
+
constructor(identity, delegationIdentity, actor, agent, nnsCanisterId) {
|
7
|
+
super(identity, delegationIdentity, nnsCanisterId !== null && nnsCanisterId !== void 0 ? nnsCanisterId : NNS_CANISTER_ID, nns_idl, actor, agent);
|
8
|
+
this.identity = identity;
|
9
|
+
this.delegationIdentity = delegationIdentity;
|
10
|
+
this.actor = actor;
|
11
|
+
this.agent = agent;
|
12
|
+
}
|
13
|
+
get accountDetails() {
|
14
|
+
return this._accountDetails;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* create connection
|
18
|
+
* @param identity
|
19
|
+
* @param delegationIdentity
|
20
|
+
* @param actor
|
21
|
+
* @param agent
|
22
|
+
* @function createConnection
|
23
|
+
* @returns {NNSConnection}
|
24
|
+
*/
|
25
|
+
static createConnection(identity, delegationIdentity, actor, agent) {
|
26
|
+
return new NNSConnection(identity, delegationIdentity, actor, agent);
|
27
|
+
}
|
28
|
+
/**
|
29
|
+
* create Actor with DelegationIdentity
|
30
|
+
* @param delegationIdentity
|
31
|
+
* @param nnsCanisterId
|
32
|
+
* @function {function name}
|
33
|
+
* @returns {type} {description}
|
34
|
+
*/
|
35
|
+
static async createActor(delegationIdentity, nnsCanisterId) {
|
36
|
+
const actor = await _createActor(nns_idl, nnsCanisterId !== null && nnsCanisterId !== void 0 ? nnsCanisterId : NNS_CANISTER_ID, delegationIdentity);
|
37
|
+
return actor;
|
38
|
+
}
|
39
|
+
// /**
|
40
|
+
// * create connection with II, we need to login II before login to NNS
|
41
|
+
// * only when AstroX ME linked With II, use 2 params as input
|
42
|
+
// * 1. use Identity created by devices, not delegation
|
43
|
+
// * 2. use II anchor that linked, will ensure NNS Dapp get the correct principal
|
44
|
+
// *
|
45
|
+
// * @param identity
|
46
|
+
// * @param anchor
|
47
|
+
// * @function {function name}
|
48
|
+
// * @returns {type} {description}
|
49
|
+
// */
|
50
|
+
// static async createConnectionWithII(
|
51
|
+
// identity: SignIdentity,
|
52
|
+
// anchor: string | bigint,
|
53
|
+
// ): Promise<NNSConnection> {
|
54
|
+
// const key = Ed25519KeyIdentity.generate();
|
55
|
+
// const s = await iiDelegation(
|
56
|
+
// identity,
|
57
|
+
// new Uint8Array(key.getPublicKey().toDer()),
|
58
|
+
// anchor,
|
59
|
+
// NNS_URL,
|
60
|
+
// /* days */ BigInt(7) * /* hours */ BigInt(24) * /* nanoseconds */ BigInt(3600000000000),
|
61
|
+
// );
|
62
|
+
// const iiDelegationResult = {
|
63
|
+
// kind: 'authorize-client-success',
|
64
|
+
// delegations: [s],
|
65
|
+
// userPublicKey: Uint8Array.from(s.userKey),
|
66
|
+
// };
|
67
|
+
// const storage = new NNSStorage(anchor.toString());
|
68
|
+
// const delegations = iiDelegationResult.delegations.map(signedDelegation => {
|
69
|
+
// return {
|
70
|
+
// delegation: new Delegation(
|
71
|
+
// signedDelegation.delegation.pubkey.buffer,
|
72
|
+
// signedDelegation.delegation.expiration,
|
73
|
+
// signedDelegation.delegation.targets,
|
74
|
+
// ),
|
75
|
+
// signature: signedDelegation.signature.buffer as Signature,
|
76
|
+
// };
|
77
|
+
// });
|
78
|
+
// const delegationChain = DelegationChain.fromDelegations(
|
79
|
+
// delegations,
|
80
|
+
// iiDelegationResult.userPublicKey.buffer as DerEncodedPublicKey,
|
81
|
+
// );
|
82
|
+
// await storage.saveJson({
|
83
|
+
// delegationChain: delegationChain.toJSON(),
|
84
|
+
// key,
|
85
|
+
// });
|
86
|
+
// const delegationResult = (await handleDelegation(iiDelegationResult, key)) as DelegationResult;
|
87
|
+
// const actorResult = await NNSConnection.createActor(delegationResult.delegationIdentity);
|
88
|
+
// return NNSConnection.createConnection(
|
89
|
+
// identity,
|
90
|
+
// delegationResult.delegationIdentity,
|
91
|
+
// actorResult.actor,
|
92
|
+
// actorResult.agent,
|
93
|
+
// );
|
94
|
+
// }
|
95
|
+
/**
|
96
|
+
* get NNS Actor, used internally
|
97
|
+
* @param nnsCanisterId
|
98
|
+
* @function {function name}
|
99
|
+
* @returns {type} {description}
|
100
|
+
*/
|
101
|
+
async getNNSActor(nnsCanisterId) {
|
102
|
+
const actor = await this._getActor(nnsCanisterId !== null && nnsCanisterId !== void 0 ? nnsCanisterId : NNS_CANISTER_ID, nns_idl);
|
103
|
+
return actor;
|
104
|
+
}
|
105
|
+
/**
|
106
|
+
* get NNS Actor, used internally
|
107
|
+
* @param nnsCanisterId
|
108
|
+
* @function {function name}
|
109
|
+
* @returns {type} {description}
|
110
|
+
*/
|
111
|
+
async getNNSActorCert(nnsCanisterId) {
|
112
|
+
const actor = await this._getActor(nnsCanisterId !== null && nnsCanisterId !== void 0 ? nnsCanisterId : NNS_CANISTER_ID, nns_idl_cert);
|
113
|
+
return actor;
|
114
|
+
}
|
115
|
+
/**
|
116
|
+
* when NNSConnection is created, we can get account created to NNS.
|
117
|
+
* Even we can just calculate the login principal to NNS DApp, however,
|
118
|
+
* The NNS DApp stores and create account, thus, a new Identity login will get NO ACCOUNT created by default.
|
119
|
+
* We need to manually create account using `add_account` when no account found.
|
120
|
+
*
|
121
|
+
* @param cert
|
122
|
+
* @function {function name}
|
123
|
+
* @returns {type} {description}
|
124
|
+
*/
|
125
|
+
async getAccount(cert) {
|
126
|
+
const actor = cert === true ? await this.getNNSActorCert() : await this.getNNSActor();
|
127
|
+
const response = await executeWithLogging(() => actor.get_account());
|
128
|
+
if (response === { AccountNotFound: null }) {
|
129
|
+
return undefined;
|
130
|
+
}
|
131
|
+
else {
|
132
|
+
this._accountDetails = response['Ok'];
|
133
|
+
return response['Ok'];
|
134
|
+
}
|
135
|
+
}
|
136
|
+
/**
|
137
|
+
* create account when new identity logined to NNS
|
138
|
+
* @function {function name}
|
139
|
+
* @returns {type} {description}
|
140
|
+
*/
|
141
|
+
async addAccount() {
|
142
|
+
const actor = await this.getNNSActor();
|
143
|
+
const response = await executeWithLogging(() => actor.add_account());
|
144
|
+
return response;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
// export const requestNNSDelegation = async (
|
148
|
+
// identity: SignIdentity,
|
149
|
+
// ): Promise<DelegationIdentity> => {
|
150
|
+
// const tenMinutesInMsec = 10 * 1000 * 60;
|
151
|
+
// const date = new Date(Date.now() + tenMinutesInMsec);
|
152
|
+
// return requestDelegation(identity, { canisterId, date });
|
153
|
+
// };
|
154
|
+
//# sourceMappingURL=nnsConnection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nnsConnection.js","sourceRoot":"","sources":["../../../src/connections/nnsConnection.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { Identity, SignIdentity } from '@dfinity/agent';
|
2
|
+
import { DelegationChain, DelegationIdentity } from '@dfinity/identity';
|
3
|
+
import { AuthClientCreateOptions, AuthClientLoginOptions, AuthClientStorage } from '../types';
|
4
|
+
export declare class AuthClient {
|
5
|
+
private _identity;
|
6
|
+
private _key;
|
7
|
+
private _chain;
|
8
|
+
private _storage;
|
9
|
+
private _appId?;
|
10
|
+
private _wallet?;
|
11
|
+
private _idpWindowOption?;
|
12
|
+
private _idpWindow?;
|
13
|
+
private _eventHandler?;
|
14
|
+
static create(options?: AuthClientCreateOptions): Promise<AuthClient>;
|
15
|
+
private _delegationIdentity?;
|
16
|
+
protected constructor(_identity: Identity, _key: SignIdentity | null, _chain: DelegationChain | null, _storage: AuthClientStorage, _appId?: string | undefined, _wallet?: string | undefined, _idpWindowOption?: string | undefined, _idpWindow?: Window | undefined, _eventHandler?: ((event: MessageEvent) => void) | undefined);
|
17
|
+
private _handleSuccess;
|
18
|
+
getIdentity(): Identity;
|
19
|
+
getDelegationIdentity(): DelegationIdentity | undefined;
|
20
|
+
getInnerKey(): SignIdentity | null;
|
21
|
+
get wallet(): string | undefined;
|
22
|
+
setWallet(data: string): void;
|
23
|
+
isAuthenticated(): Promise<boolean>;
|
24
|
+
login(options?: AuthClientLoginOptions): Promise<void>;
|
25
|
+
private _getEventHandler;
|
26
|
+
private _handleFailure;
|
27
|
+
private _removeEventListener;
|
28
|
+
logout(options?: {
|
29
|
+
returnTo?: string;
|
30
|
+
}): Promise<void>;
|
31
|
+
}
|
@@ -0,0 +1,232 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
3
|
+
/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
|
4
|
+
import { AnonymousIdentity, } from '@dfinity/agent';
|
5
|
+
import { isDelegationValid } from '@dfinity/authentication';
|
6
|
+
import { Delegation, DelegationChain, DelegationIdentity, Ed25519KeyIdentity, } from '@dfinity/identity';
|
7
|
+
import { PermissionsType, } from '../types';
|
8
|
+
import { IDENTITY_PROVIDER_DEFAULT, IDENTITY_PROVIDER_ENDPOINT, KEY_SESSIONSTORAGE_DELEGATION, KEY_SESSIONSTORAGE_KEY, KEY_SESSIONSTORAGE_WALLET, SessionStorage, _deleteStorage, } from './icStorage';
|
9
|
+
export class AuthClient {
|
10
|
+
constructor(_identity, _key, _chain, _storage, _appId, _wallet, _idpWindowOption,
|
11
|
+
// A handle on the IdP window.
|
12
|
+
_idpWindow,
|
13
|
+
// The event handler for processing events from the IdP.
|
14
|
+
_eventHandler) {
|
15
|
+
this._identity = _identity;
|
16
|
+
this._key = _key;
|
17
|
+
this._chain = _chain;
|
18
|
+
this._storage = _storage;
|
19
|
+
this._appId = _appId;
|
20
|
+
this._wallet = _wallet;
|
21
|
+
this._idpWindowOption = _idpWindowOption;
|
22
|
+
this._idpWindow = _idpWindow;
|
23
|
+
this._eventHandler = _eventHandler;
|
24
|
+
}
|
25
|
+
static async create(options = {
|
26
|
+
appId: '',
|
27
|
+
}) {
|
28
|
+
var _a, _b;
|
29
|
+
const storage = (_a = options.storage) !== null && _a !== void 0 ? _a : new SessionStorage('ic-');
|
30
|
+
let key = null;
|
31
|
+
if (options.identity) {
|
32
|
+
key = options.identity;
|
33
|
+
}
|
34
|
+
else {
|
35
|
+
const maybeIdentityStorage = await storage.get(KEY_SESSIONSTORAGE_KEY);
|
36
|
+
if (maybeIdentityStorage) {
|
37
|
+
try {
|
38
|
+
key = Ed25519KeyIdentity.fromJSON(maybeIdentityStorage);
|
39
|
+
}
|
40
|
+
catch (e) {
|
41
|
+
// Ignore this, this means that the sessionStorage value isn't a valid Ed25519KeyIdentity
|
42
|
+
// serialization.
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
let identity = new AnonymousIdentity();
|
47
|
+
let chain = null;
|
48
|
+
let wallet = null;
|
49
|
+
if (key) {
|
50
|
+
try {
|
51
|
+
const chainStorage = await storage.get(KEY_SESSIONSTORAGE_DELEGATION);
|
52
|
+
wallet = await storage.get(KEY_SESSIONSTORAGE_WALLET);
|
53
|
+
if (chainStorage) {
|
54
|
+
chain = DelegationChain.fromJSON(chainStorage);
|
55
|
+
// Verify that the delegation isn't expired.
|
56
|
+
if (!isDelegationValid(chain)) {
|
57
|
+
await _deleteStorage(storage);
|
58
|
+
key = null;
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
identity = DelegationIdentity.fromDelegation(key, chain);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
catch (e) {
|
66
|
+
console.error(e);
|
67
|
+
// If there was a problem loading the chain, delete the key.
|
68
|
+
await _deleteStorage(storage);
|
69
|
+
key = null;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
return new this(identity, key, chain, storage, options.appId, wallet !== null ? wallet : undefined, (_b = options.idpWindowOption) !== null && _b !== void 0 ? _b : 'height=600, width=800, top=0, right=0, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
|
73
|
+
}
|
74
|
+
async _handleSuccess(message, onSuccess) {
|
75
|
+
var _a;
|
76
|
+
// console.log(message["identity"]);
|
77
|
+
if (message['identity'] !== undefined) {
|
78
|
+
const idDelegations = message['identity'].delegations.map(signedDelegation => {
|
79
|
+
return {
|
80
|
+
delegation: new Delegation(signedDelegation.delegation.pubkey.buffer, signedDelegation.delegation.expiration, signedDelegation.delegation.targets),
|
81
|
+
signature: signedDelegation.signature.buffer,
|
82
|
+
};
|
83
|
+
});
|
84
|
+
const idDelegationChain = DelegationChain.fromDelegations(idDelegations, message['identity'].userPublicKey
|
85
|
+
.buffer);
|
86
|
+
this._chain = idDelegationChain;
|
87
|
+
this._wallet = message['wallet'];
|
88
|
+
}
|
89
|
+
else {
|
90
|
+
const iiDelegations = message.delegations.map(signedDelegation => {
|
91
|
+
return {
|
92
|
+
delegation: new Delegation(signedDelegation.delegation.pubkey.buffer, signedDelegation.delegation.expiration, signedDelegation.delegation.targets),
|
93
|
+
signature: signedDelegation.signature.buffer,
|
94
|
+
};
|
95
|
+
});
|
96
|
+
const iiDelegationChain = DelegationChain.fromDelegations(iiDelegations, message.userPublicKey.buffer);
|
97
|
+
this._chain = iiDelegationChain;
|
98
|
+
}
|
99
|
+
const key = this._key;
|
100
|
+
if (!key) {
|
101
|
+
return this;
|
102
|
+
}
|
103
|
+
this._delegationIdentity = DelegationIdentity.fromDelegation(key, this._chain);
|
104
|
+
this._identity = this._delegationIdentity;
|
105
|
+
console.log(this._identity);
|
106
|
+
(_a = this._idpWindow) === null || _a === void 0 ? void 0 : _a.close();
|
107
|
+
await (onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess());
|
108
|
+
this._removeEventListener();
|
109
|
+
return this;
|
110
|
+
}
|
111
|
+
getIdentity() {
|
112
|
+
return this._identity;
|
113
|
+
}
|
114
|
+
getDelegationIdentity() {
|
115
|
+
return this._delegationIdentity;
|
116
|
+
}
|
117
|
+
getInnerKey() {
|
118
|
+
return this._key;
|
119
|
+
}
|
120
|
+
get wallet() {
|
121
|
+
return this._wallet;
|
122
|
+
}
|
123
|
+
setWallet(data) {
|
124
|
+
this._wallet = data;
|
125
|
+
}
|
126
|
+
async isAuthenticated() {
|
127
|
+
return !this.getIdentity().getPrincipal().isAnonymous() && this._chain !== null;
|
128
|
+
}
|
129
|
+
async login(options) {
|
130
|
+
var _a, _b, _c;
|
131
|
+
let key = this._key;
|
132
|
+
if (!key) {
|
133
|
+
// Create a new key (whether or not one was in storage).
|
134
|
+
key = Ed25519KeyIdentity.generate();
|
135
|
+
this._key = key;
|
136
|
+
await this._storage.set(KEY_SESSIONSTORAGE_KEY, JSON.stringify(key));
|
137
|
+
}
|
138
|
+
// Create the URL of the IDP. (e.g. https://XXXX/#authorize)
|
139
|
+
const identityProviderUrl = new URL(((_a = options === null || options === void 0 ? void 0 : options.identityProvider) === null || _a === void 0 ? void 0 : _a.toString()) || IDENTITY_PROVIDER_DEFAULT);
|
140
|
+
// Set the correct hash if it isn't already set.
|
141
|
+
identityProviderUrl.hash = IDENTITY_PROVIDER_ENDPOINT;
|
142
|
+
// If `login` has been called previously, then close/remove any previous windows
|
143
|
+
// and event listeners.
|
144
|
+
(_b = this._idpWindow) === null || _b === void 0 ? void 0 : _b.close();
|
145
|
+
this._removeEventListener();
|
146
|
+
// Open a new window with the IDP provider.
|
147
|
+
this._idpWindow =
|
148
|
+
(_c = window.open(identityProviderUrl.toString(), 'idpWindow', this._idpWindowOption)) !== null && _c !== void 0 ? _c : undefined;
|
149
|
+
// Add an event listener to handle responses.
|
150
|
+
return new Promise((resolve, reject) => {
|
151
|
+
this._eventHandler = this._getEventHandler(identityProviderUrl, resolve, reject, options);
|
152
|
+
window.addEventListener('message', this._eventHandler);
|
153
|
+
});
|
154
|
+
}
|
155
|
+
_getEventHandler(identityProviderUrl, resolve, reject, options) {
|
156
|
+
return async (event) => {
|
157
|
+
var _a, _b, _c;
|
158
|
+
if (event.origin !== identityProviderUrl.origin) {
|
159
|
+
return;
|
160
|
+
}
|
161
|
+
const message = event.data;
|
162
|
+
switch (message.kind) {
|
163
|
+
case 'authorize-ready': {
|
164
|
+
// IDP is ready. Send a message to request authorization.
|
165
|
+
const request = {
|
166
|
+
kind: 'authorize-client',
|
167
|
+
sessionPublicKey: new Uint8Array((_a = this._key) === null || _a === void 0 ? void 0 : _a.getPublicKey().toDer()),
|
168
|
+
maxTimeToLive: options === null || options === void 0 ? void 0 : options.maxTimeToLive,
|
169
|
+
permissions: (_b = options === null || options === void 0 ? void 0 : options.permissions) !== null && _b !== void 0 ? _b : [PermissionsType.identity],
|
170
|
+
appId: this._appId,
|
171
|
+
};
|
172
|
+
(_c = this._idpWindow) === null || _c === void 0 ? void 0 : _c.postMessage(request, identityProviderUrl.origin);
|
173
|
+
break;
|
174
|
+
}
|
175
|
+
case 'authorize-client-success':
|
176
|
+
// Create the delegation chain and store it.
|
177
|
+
try {
|
178
|
+
resolve(await this._handleSuccess(message, options === null || options === void 0 ? void 0 : options.onSuccess));
|
179
|
+
// Setting the storage is moved out of _handleSuccess to make
|
180
|
+
// it a sync function. Having _handleSuccess as an async function
|
181
|
+
// messes up the jest tests for some reason.
|
182
|
+
if (this._chain) {
|
183
|
+
await this._storage.set(KEY_SESSIONSTORAGE_DELEGATION, JSON.stringify(this._chain.toJSON()));
|
184
|
+
}
|
185
|
+
if (this._wallet !== undefined) {
|
186
|
+
await this._storage.set(KEY_SESSIONSTORAGE_WALLET, this._wallet);
|
187
|
+
}
|
188
|
+
}
|
189
|
+
catch (err) {
|
190
|
+
reject(this._handleFailure(err.message, options === null || options === void 0 ? void 0 : options.onError));
|
191
|
+
}
|
192
|
+
break;
|
193
|
+
case 'authorize-client-failure':
|
194
|
+
reject(this._handleFailure(message.text, options === null || options === void 0 ? void 0 : options.onError));
|
195
|
+
break;
|
196
|
+
default:
|
197
|
+
break;
|
198
|
+
}
|
199
|
+
};
|
200
|
+
}
|
201
|
+
_handleFailure(errorMessage, onError) {
|
202
|
+
var _a;
|
203
|
+
(_a = this._idpWindow) === null || _a === void 0 ? void 0 : _a.close();
|
204
|
+
onError === null || onError === void 0 ? void 0 : onError(errorMessage);
|
205
|
+
this._removeEventListener();
|
206
|
+
return errorMessage;
|
207
|
+
}
|
208
|
+
_removeEventListener() {
|
209
|
+
if (this._eventHandler) {
|
210
|
+
window.removeEventListener('message', this._eventHandler);
|
211
|
+
}
|
212
|
+
this._eventHandler = undefined;
|
213
|
+
}
|
214
|
+
async logout(options = {}) {
|
215
|
+
_deleteStorage(this._storage);
|
216
|
+
// Reset this auth client to a non-authenticated state.
|
217
|
+
this._identity = new AnonymousIdentity();
|
218
|
+
this._key = null;
|
219
|
+
this._chain = null;
|
220
|
+
this._wallet = undefined;
|
221
|
+
if (options.returnTo) {
|
222
|
+
try {
|
223
|
+
window.history.pushState({}, '', options.returnTo);
|
224
|
+
}
|
225
|
+
catch (e) {
|
226
|
+
window.location.href = options.returnTo;
|
227
|
+
}
|
228
|
+
}
|
229
|
+
}
|
230
|
+
}
|
231
|
+
//
|
232
|
+
//# sourceMappingURL=icAuthClient.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"icAuthClient.js","sourceRoot":"","sources":["../../../src/ic/icAuthClient.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { ActorSubclass, Identity } from '@dfinity/agent';
|
2
|
+
import { InterfaceFactory } from '@dfinity/candid/lib/cjs/idl';
|
3
|
+
import { Principal } from '@dfinity/principal';
|
4
|
+
import { AuthClient } from './icAuthClient';
|
5
|
+
import { ICWindow } from './icWindow';
|
6
|
+
import { ConnectOptions, TransactionOptions } from '../types';
|
7
|
+
declare global {
|
8
|
+
interface Window {
|
9
|
+
ic: IC & any;
|
10
|
+
}
|
11
|
+
}
|
12
|
+
export declare class IC extends ICWindow {
|
13
|
+
#private;
|
14
|
+
static connect(connectOptions: ConnectOptions): Promise<IC>;
|
15
|
+
protected constructor(authClient: AuthClient);
|
16
|
+
isAuthenticated(): Promise<boolean>;
|
17
|
+
get identity(): Identity;
|
18
|
+
get principal(): Principal;
|
19
|
+
get wallet(): string | undefined;
|
20
|
+
private _setWalletProvider;
|
21
|
+
protected getAuthClient(): AuthClient;
|
22
|
+
disconnect: (options?: {
|
23
|
+
returnTo?: string;
|
24
|
+
}) => Promise<void>;
|
25
|
+
queryBalance: () => Promise<bigint>;
|
26
|
+
handleAuthenticated: (ic: IC, { ledgerCanisterId }: {
|
27
|
+
ledgerCanisterId?: string | undefined;
|
28
|
+
}) => Promise<IC>;
|
29
|
+
private injectWindow;
|
30
|
+
handleError(error?: string): void;
|
31
|
+
createActor: <T>(idlFactory: InterfaceFactory, canisterId: string) => ActorSubclass<T>;
|
32
|
+
requestTransfer: (options: TransactionOptions) => Promise<void>;
|
33
|
+
private _getEventHandler;
|
34
|
+
private _handleFailure;
|
35
|
+
private _handleSuccess;
|
36
|
+
}
|
@@ -0,0 +1,188 @@
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
6
|
+
};
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
11
|
+
};
|
12
|
+
var _IC_authClient, _IC_agent, _IC_localLedger, _IC_walletProvider;
|
13
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
14
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
15
|
+
import { Actor, HttpAgent } from '@dfinity/agent';
|
16
|
+
import { AuthClient } from './icAuthClient';
|
17
|
+
import { IDENTITY_PROVIDER_DEFAULT } from './icStorage';
|
18
|
+
import { ICWindow } from './icWindow';
|
19
|
+
import { LedgerConnection } from '../connections/ledgerConnection';
|
20
|
+
import { PermissionsType, TransactionMessageKind, } from '../types';
|
21
|
+
const days = BigInt(1);
|
22
|
+
const hours = BigInt(24);
|
23
|
+
const nanoseconds = BigInt(3600000000000);
|
24
|
+
const WALLET_PROVIDER_DEFAULT = 'https://63k2f-nyaaa-aaaah-aakla-cai.raw.ic0.app';
|
25
|
+
const WALLET_PROVIDER_ENDPOINT = '#transaction';
|
26
|
+
export class IC extends ICWindow {
|
27
|
+
constructor(authClient) {
|
28
|
+
super();
|
29
|
+
_IC_authClient.set(this, void 0);
|
30
|
+
_IC_agent.set(this, void 0);
|
31
|
+
_IC_localLedger.set(this, void 0);
|
32
|
+
_IC_walletProvider.set(this, void 0); // a local ledger to query balance only
|
33
|
+
this.disconnect = async (options = {}) => {
|
34
|
+
await this.getAuthClient().logout(options);
|
35
|
+
};
|
36
|
+
this.queryBalance = async () => {
|
37
|
+
var _a;
|
38
|
+
if (this.wallet === undefined) {
|
39
|
+
throw Error('Wallet address is not found');
|
40
|
+
}
|
41
|
+
if (__classPrivateFieldGet(this, _IC_localLedger, "f") === undefined) {
|
42
|
+
throw Error('Ledger connection faild');
|
43
|
+
}
|
44
|
+
const result = await ((_a = __classPrivateFieldGet(this, _IC_localLedger, "f")) === null || _a === void 0 ? void 0 : _a.getBalance(this.wallet));
|
45
|
+
return result;
|
46
|
+
};
|
47
|
+
this.handleAuthenticated = async (ic, { ledgerCanisterId }) => {
|
48
|
+
const identity = ic.getAuthClient().getIdentity();
|
49
|
+
__classPrivateFieldSet(this, _IC_agent, new HttpAgent({ identity }), "f");
|
50
|
+
if (!process.env.isProduction) {
|
51
|
+
await __classPrivateFieldGet(this, _IC_agent, "f").fetchRootKey();
|
52
|
+
}
|
53
|
+
const actorResult = await LedgerConnection.createActor(ic.getAuthClient().getDelegationIdentity(), ledgerCanisterId);
|
54
|
+
__classPrivateFieldSet(this, _IC_localLedger, LedgerConnection.createConnection(ic.getAuthClient().getInnerKey(), ic.getAuthClient().getDelegationIdentity(), ledgerCanisterId, actorResult.actor, __classPrivateFieldGet(this, _IC_agent, "f")), "f");
|
55
|
+
this.injectWindow();
|
56
|
+
return new IC(ic.getAuthClient());
|
57
|
+
};
|
58
|
+
this.createActor = (idlFactory, canisterId) => {
|
59
|
+
return Actor.createActor(idlFactory, {
|
60
|
+
agent: __classPrivateFieldGet(this, _IC_agent, "f"),
|
61
|
+
canisterId,
|
62
|
+
});
|
63
|
+
};
|
64
|
+
// requestTransfer
|
65
|
+
this.requestTransfer = async (options) => {
|
66
|
+
var _a;
|
67
|
+
const walletProviderUrl = new URL(((_a = options === null || options === void 0 ? void 0 : options.walletProvider) === null || _a === void 0 ? void 0 : _a.toString()) || __classPrivateFieldGet(this, _IC_walletProvider, "f") || WALLET_PROVIDER_DEFAULT);
|
68
|
+
walletProviderUrl.hash = WALLET_PROVIDER_ENDPOINT;
|
69
|
+
this._openWindow(walletProviderUrl.toString(), 'icWindow', 'height=600, width=480, top=0, right=0, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
|
70
|
+
return new Promise((resolve, reject) => {
|
71
|
+
this._eventHandler = this._getEventHandler(walletProviderUrl, resolve, reject, options);
|
72
|
+
window.addEventListener('message', this._eventHandler);
|
73
|
+
});
|
74
|
+
};
|
75
|
+
__classPrivateFieldSet(this, _IC_authClient, authClient, "f");
|
76
|
+
}
|
77
|
+
static async connect(connectOptions) {
|
78
|
+
var _a, _b, _c, _d;
|
79
|
+
const authClient = await AuthClient.create(connectOptions);
|
80
|
+
const newIC = new this(authClient);
|
81
|
+
const provider = (_a = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.identityProvider) !== null && _a !== void 0 ? _a : IDENTITY_PROVIDER_DEFAULT;
|
82
|
+
newIC._setWalletProvider(connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.walletProviderUrl);
|
83
|
+
if (await newIC.isAuthenticated()) {
|
84
|
+
await newIC.handleAuthenticated(newIC, { ledgerCanisterId: connectOptions.ledgerCanisterId });
|
85
|
+
await ((_b = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.onAuthenticated) === null || _b === void 0 ? void 0 : _b.call(connectOptions, newIC));
|
86
|
+
return newIC;
|
87
|
+
}
|
88
|
+
await newIC.getAuthClient().login({
|
89
|
+
identityProvider: provider,
|
90
|
+
// Maximum authorization expiration is 8 days
|
91
|
+
maxTimeToLive: (_c = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.maxTimeToLive) !== null && _c !== void 0 ? _c : days * hours * nanoseconds,
|
92
|
+
permissions: (_d = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.permissions) !== null && _d !== void 0 ? _d : [PermissionsType.identity],
|
93
|
+
onSuccess: async () => {
|
94
|
+
var _a, _b, _c;
|
95
|
+
await newIC.handleAuthenticated(newIC, {
|
96
|
+
ledgerCanisterId: connectOptions.ledgerCanisterId,
|
97
|
+
});
|
98
|
+
(_b = (await ((_a = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.onSuccess) === null || _a === void 0 ? void 0 : _a.call(connectOptions)))) !== null && _b !== void 0 ? _b : (await ((_c = connectOptions === null || connectOptions === void 0 ? void 0 : connectOptions.onAuthenticated) === null || _c === void 0 ? void 0 : _c.call(connectOptions, newIC)));
|
99
|
+
},
|
100
|
+
onError: newIC.handleError,
|
101
|
+
});
|
102
|
+
return newIC;
|
103
|
+
}
|
104
|
+
async isAuthenticated() {
|
105
|
+
const result = await __classPrivateFieldGet(this, _IC_authClient, "f").isAuthenticated();
|
106
|
+
return result;
|
107
|
+
}
|
108
|
+
get identity() {
|
109
|
+
return __classPrivateFieldGet(this, _IC_authClient, "f").getIdentity();
|
110
|
+
}
|
111
|
+
get principal() {
|
112
|
+
return this.identity.getPrincipal();
|
113
|
+
}
|
114
|
+
get wallet() {
|
115
|
+
return __classPrivateFieldGet(this, _IC_authClient, "f").wallet;
|
116
|
+
}
|
117
|
+
_setWalletProvider(provider) {
|
118
|
+
__classPrivateFieldSet(this, _IC_walletProvider, provider, "f");
|
119
|
+
}
|
120
|
+
getAuthClient() {
|
121
|
+
return __classPrivateFieldGet(this, _IC_authClient, "f");
|
122
|
+
}
|
123
|
+
injectWindow(ic) {
|
124
|
+
if (window.ic !== undefined) {
|
125
|
+
let plug;
|
126
|
+
if (window.ic.plug !== undefined) {
|
127
|
+
plug = window.ic.plug;
|
128
|
+
}
|
129
|
+
window.ic = ic !== null && ic !== void 0 ? ic : this;
|
130
|
+
window.ic.plug = plug;
|
131
|
+
}
|
132
|
+
else {
|
133
|
+
window.ic = ic !== null && ic !== void 0 ? ic : this;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
handleError(error) {
|
137
|
+
throw new Error(error);
|
138
|
+
}
|
139
|
+
_getEventHandler(walletProviderUrl, resolve, reject, options) {
|
140
|
+
return async (event) => {
|
141
|
+
var _a;
|
142
|
+
if (event.origin !== walletProviderUrl.origin) {
|
143
|
+
return;
|
144
|
+
}
|
145
|
+
const message = event.data;
|
146
|
+
switch (message.kind) {
|
147
|
+
case TransactionMessageKind.ready: {
|
148
|
+
// IDP is ready. Send a message to request authorization.
|
149
|
+
const request = {
|
150
|
+
kind: TransactionMessageKind.client,
|
151
|
+
from: options.from,
|
152
|
+
to: options.to,
|
153
|
+
amount: options.amount,
|
154
|
+
sendOpts: options.sendOpts,
|
155
|
+
};
|
156
|
+
(_a = this._window) === null || _a === void 0 ? void 0 : _a.postMessage(request, walletProviderUrl.origin);
|
157
|
+
break;
|
158
|
+
}
|
159
|
+
case TransactionMessageKind.success:
|
160
|
+
// Create the delegation chain and store it.
|
161
|
+
try {
|
162
|
+
resolve(this._handleSuccess(message, options.onSuccess));
|
163
|
+
}
|
164
|
+
catch (err) {
|
165
|
+
reject(this._handleFailure(err.message, options.onError));
|
166
|
+
}
|
167
|
+
break;
|
168
|
+
case TransactionMessageKind.fail:
|
169
|
+
reject(this._handleFailure(message.text, options.onError));
|
170
|
+
break;
|
171
|
+
default:
|
172
|
+
break;
|
173
|
+
}
|
174
|
+
};
|
175
|
+
}
|
176
|
+
_handleFailure(errorMessage, onError) {
|
177
|
+
this._remove();
|
178
|
+
onError === null || onError === void 0 ? void 0 : onError(errorMessage);
|
179
|
+
return errorMessage;
|
180
|
+
}
|
181
|
+
_handleSuccess(value, onSuccess) {
|
182
|
+
this._remove();
|
183
|
+
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(value);
|
184
|
+
return value;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
_IC_authClient = new WeakMap(), _IC_agent = new WeakMap(), _IC_localLedger = new WeakMap(), _IC_walletProvider = new WeakMap();
|
188
|
+
//# sourceMappingURL=icConnect.js.map
|