@multiversx/sdk-web-wallet-cross-window-provider 0.0.4 → 0.0.6
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/out/WindowManager.d.ts +26 -0
- package/out/WindowManager.js +133 -0
- package/out/WindowManager.js.map +1 -0
- package/out/constants.d.ts +3 -0
- package/out/constants.js +13 -0
- package/out/constants.js.map +1 -0
- package/out/crossWindowProvider.d.ts +7 -13
- package/out/crossWindowProvider.js +60 -183
- package/out/crossWindowProvider.js.map +1 -1
- package/out/errors.d.ts +21 -0
- package/out/errors.js +43 -1
- package/out/errors.js.map +1 -1
- package/out/helpers/buildTransactionsQueryString.d.ts +1 -1
- package/out/helpers/buildTransactionsQueryString.js +17 -17
- package/out/helpers/buildTransactionsQueryString.js.map +1 -1
- package/out/types.d.ts +53 -0
- package/out/types.js +29 -0
- package/out/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CrossWindowProviderRequestEnums, CrossWindowProviderResponseEnums, ReplyWithPostMessageType, ResponseTypeMap } from './types';
|
|
2
|
+
export declare class WindowManager {
|
|
3
|
+
private walletUrl;
|
|
4
|
+
private initialized;
|
|
5
|
+
private static _instance;
|
|
6
|
+
walletWindow: Window | null;
|
|
7
|
+
constructor();
|
|
8
|
+
static getInstance(): WindowManager;
|
|
9
|
+
setWalletUrl(url: string): WindowManager;
|
|
10
|
+
init(): Promise<boolean>;
|
|
11
|
+
handshake(): Promise<boolean>;
|
|
12
|
+
private addHandshakeChangeListener;
|
|
13
|
+
listenOnce<T extends CrossWindowProviderResponseEnums>(action: T): Promise<{
|
|
14
|
+
type: T;
|
|
15
|
+
payload: ReplyWithPostMessageType<T>['payload'];
|
|
16
|
+
}>;
|
|
17
|
+
closeConnection(): Promise<boolean>;
|
|
18
|
+
isInitialized(): boolean;
|
|
19
|
+
postMessage<T extends CrossWindowProviderRequestEnums>({ type, payload }: {
|
|
20
|
+
type: T;
|
|
21
|
+
payload: string;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
type: ResponseTypeMap[T] | CrossWindowProviderResponseEnums.cancelResponse;
|
|
24
|
+
payload: ReplyWithPostMessageType<ResponseTypeMap[T]>['payload'];
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WindowManager = void 0;
|
|
13
|
+
const constants_1 = require("./constants");
|
|
14
|
+
const errors_1 = require("./errors");
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
class WindowManager {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.walletUrl = '';
|
|
19
|
+
this.initialized = false;
|
|
20
|
+
this.walletWindow = null;
|
|
21
|
+
window.addEventListener('beforeunload', () => {
|
|
22
|
+
var _a;
|
|
23
|
+
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
24
|
+
});
|
|
25
|
+
window.name = window.name = constants_1.DAPP_WINDOW_NAME;
|
|
26
|
+
WindowManager._instance = this; // TODO: remove singleton
|
|
27
|
+
}
|
|
28
|
+
static getInstance() {
|
|
29
|
+
return WindowManager._instance;
|
|
30
|
+
}
|
|
31
|
+
setWalletUrl(url) {
|
|
32
|
+
this.walletUrl = url;
|
|
33
|
+
return WindowManager._instance;
|
|
34
|
+
}
|
|
35
|
+
init() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
window.name = constants_1.DAPP_WINDOW_NAME;
|
|
38
|
+
this.initialized = true;
|
|
39
|
+
return this.initialized;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
handshake() {
|
|
43
|
+
var _a;
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
46
|
+
this.walletWindow = window.open(this.walletUrl, this.walletUrl);
|
|
47
|
+
const { payload } = yield this.listenOnce(types_1.CrossWindowProviderResponseEnums.handshakeResponse);
|
|
48
|
+
if (!payload) {
|
|
49
|
+
throw new errors_1.ErrCannotEstablishHandshake();
|
|
50
|
+
}
|
|
51
|
+
this.addHandshakeChangeListener();
|
|
52
|
+
return true;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
addHandshakeChangeListener() {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const walletUrl = this.walletUrl;
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
59
|
+
const self = this;
|
|
60
|
+
window.addEventListener('message', function eventHandler(event) {
|
|
61
|
+
var _a;
|
|
62
|
+
try {
|
|
63
|
+
const { type, payload } = event.data;
|
|
64
|
+
const isWalletEvent = event.origin === new URL(walletUrl).origin;
|
|
65
|
+
if (isWalletEvent &&
|
|
66
|
+
type === types_1.CrossWindowProviderResponseEnums.handshakeResponse) {
|
|
67
|
+
if (payload === false) {
|
|
68
|
+
(_a = self.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
69
|
+
self.walletWindow = null;
|
|
70
|
+
window.removeEventListener('message', eventHandler);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (_b) { }
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
listenOnce(action) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
if (!this.walletWindow) {
|
|
81
|
+
throw new errors_1.ErrWalletWindowNotInstantiated();
|
|
82
|
+
}
|
|
83
|
+
return yield new Promise((resolve) => {
|
|
84
|
+
const walletUrl = this.walletUrl;
|
|
85
|
+
window.addEventListener('message', function eventHandler(event) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
const { type, payload } = event.data;
|
|
88
|
+
const isWalletEvent = event.origin === new URL(walletUrl).origin;
|
|
89
|
+
const isCurrentAction = action === type ||
|
|
90
|
+
type === types_1.CrossWindowProviderResponseEnums.cancelResponse; // TODO: check if this is needed
|
|
91
|
+
if (!isCurrentAction) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (isWalletEvent) {
|
|
95
|
+
window.removeEventListener('message', eventHandler);
|
|
96
|
+
resolve({ type, payload });
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
closeConnection() {
|
|
104
|
+
var _a;
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
if (!this.initialized) {
|
|
107
|
+
throw new errors_1.ErrProviderNotInitialized();
|
|
108
|
+
}
|
|
109
|
+
yield this.handshake();
|
|
110
|
+
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
111
|
+
return true;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
isInitialized() {
|
|
115
|
+
return this.initialized;
|
|
116
|
+
}
|
|
117
|
+
postMessage({ type, payload }) {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
yield this.handshake();
|
|
121
|
+
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.postMessage({
|
|
122
|
+
type,
|
|
123
|
+
payload
|
|
124
|
+
}, this.walletUrl);
|
|
125
|
+
const data = yield this.listenOnce(constants_1.responseTypeMap[type]);
|
|
126
|
+
(_b = this.walletWindow) === null || _b === void 0 ? void 0 : _b.close();
|
|
127
|
+
return data;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.WindowManager = WindowManager;
|
|
132
|
+
WindowManager._instance = new WindowManager();
|
|
133
|
+
//# sourceMappingURL=WindowManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowManager.js","sourceRoot":"","sources":["../src/WindowManager.ts"],"names":[],"mappings":"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"}
|
package/out/constants.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DAPP_WINDOW_NAME = exports.responseTypeMap = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
exports.responseTypeMap = {
|
|
6
|
+
[types_1.CrossWindowProviderRequestEnums.signTransactionsRequest]: types_1.CrossWindowProviderResponseEnums.signTransactionsResponse,
|
|
7
|
+
[types_1.CrossWindowProviderRequestEnums.signMessageRequest]: types_1.CrossWindowProviderResponseEnums.signMessageResponse,
|
|
8
|
+
[types_1.CrossWindowProviderRequestEnums.loginRequest]: types_1.CrossWindowProviderResponseEnums.loginResponse,
|
|
9
|
+
[types_1.CrossWindowProviderRequestEnums.logoutRequest]: types_1.CrossWindowProviderResponseEnums.disconnectResponse,
|
|
10
|
+
[types_1.CrossWindowProviderRequestEnums.cancelAction]: types_1.CrossWindowProviderResponseEnums.cancelResponse
|
|
11
|
+
};
|
|
12
|
+
exports.DAPP_WINDOW_NAME = window.location.origin;
|
|
13
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,mCAIiB;AAEJ,QAAA,eAAe,GAAoB;IAC9C,CAAC,uCAA+B,CAAC,uBAAuB,CAAC,EACvD,wCAAgC,CAAC,wBAAwB;IAC3D,CAAC,uCAA+B,CAAC,kBAAkB,CAAC,EAClD,wCAAgC,CAAC,mBAAmB;IACtD,CAAC,uCAA+B,CAAC,YAAY,CAAC,EAC5C,wCAAgC,CAAC,aAAa;IAChD,CAAC,uCAA+B,CAAC,aAAa,CAAC,EAC7C,wCAAgC,CAAC,kBAAkB;IACrD,CAAC,uCAA+B,CAAC,YAAY,CAAC,EAC5C,wCAAgC,CAAC,cAAc;CAClD,CAAC;AAEW,QAAA,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC"}
|
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
import { SignableMessage, Transaction } from '@multiversx/sdk-core';
|
|
2
2
|
interface ICrossWindowWalletAccount {
|
|
3
3
|
address: string;
|
|
4
|
-
name?: string;
|
|
5
4
|
signature?: string;
|
|
6
5
|
}
|
|
7
|
-
export declare const DAPP_WINDOW_NAME: string;
|
|
8
6
|
export declare class CrossWindowProvider {
|
|
9
|
-
private walletUrl;
|
|
10
7
|
account: ICrossWindowWalletAccount;
|
|
11
8
|
private initialized;
|
|
9
|
+
private windowManager;
|
|
12
10
|
private static _instance;
|
|
13
|
-
walletWindow: Window | null;
|
|
14
|
-
private handshakeEstablished;
|
|
15
|
-
private callbackUrl;
|
|
16
11
|
private accessToken;
|
|
17
12
|
private constructor();
|
|
13
|
+
private ensureConnected;
|
|
14
|
+
private disconnect;
|
|
18
15
|
static getInstance(): CrossWindowProvider;
|
|
19
16
|
setAddress(address: string): CrossWindowProvider;
|
|
20
17
|
setWalletUrl(url: string): CrossWindowProvider;
|
|
21
18
|
init(): Promise<boolean>;
|
|
22
|
-
handshake(): Promise<boolean>;
|
|
23
|
-
private onHandshakeChangeListener;
|
|
24
|
-
listenOnce(): Promise<any>;
|
|
25
19
|
login(options?: {
|
|
26
|
-
callbackUrl?: string;
|
|
27
20
|
token?: string;
|
|
28
|
-
}): Promise<
|
|
21
|
+
}): Promise<{
|
|
22
|
+
address: string;
|
|
23
|
+
signature: string | undefined;
|
|
24
|
+
}>;
|
|
29
25
|
logout(): Promise<boolean>;
|
|
30
|
-
private disconnect;
|
|
31
26
|
getAddress(): Promise<string>;
|
|
32
27
|
isInitialized(): boolean;
|
|
33
28
|
isConnected(): Promise<boolean>;
|
|
34
29
|
signTransaction(transaction: Transaction): Promise<Transaction>;
|
|
35
|
-
private ensureConnected;
|
|
36
30
|
signTransactions(transactions: Transaction[]): Promise<Transaction[]>;
|
|
37
31
|
signMessage(message: SignableMessage): Promise<SignableMessage>;
|
|
38
32
|
cancelAction(): void;
|
|
@@ -9,34 +9,31 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.CrossWindowProvider =
|
|
12
|
+
exports.CrossWindowProvider = void 0;
|
|
13
13
|
const sdk_core_1 = require("@multiversx/sdk-core");
|
|
14
14
|
const errors_1 = require("./errors");
|
|
15
15
|
const helpers_1 = require("./helpers");
|
|
16
|
-
|
|
16
|
+
const types_1 = require("./types");
|
|
17
|
+
const WindowManager_1 = require("./WindowManager");
|
|
17
18
|
class CrossWindowProvider {
|
|
18
19
|
constructor() {
|
|
19
|
-
this.walletUrl = '';
|
|
20
20
|
this.account = { address: '' };
|
|
21
21
|
this.initialized = false;
|
|
22
|
-
this.walletWindow = null;
|
|
23
|
-
this.handshakeEstablished = false;
|
|
24
|
-
this.callbackUrl = undefined;
|
|
25
22
|
this.accessToken = undefined;
|
|
26
23
|
if (CrossWindowProvider._instance) {
|
|
27
|
-
throw new
|
|
24
|
+
throw new errors_1.ErrInstantiationFailed();
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
var _a, _b;
|
|
31
|
-
if (this.walletWindow && window.opener) {
|
|
32
|
-
return (_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'mxDappHandshake', payload: false }, // TODO: use const here
|
|
33
|
-
this.walletUrl);
|
|
34
|
-
}
|
|
35
|
-
(_b = this.walletWindow) === null || _b === void 0 ? void 0 : _b.close();
|
|
36
|
-
});
|
|
37
|
-
window.name = window.name = exports.DAPP_WINDOW_NAME;
|
|
26
|
+
this.windowManager = WindowManager_1.WindowManager.getInstance();
|
|
38
27
|
CrossWindowProvider._instance = this;
|
|
39
28
|
}
|
|
29
|
+
ensureConnected() {
|
|
30
|
+
if (!this.account.address) {
|
|
31
|
+
throw new errors_1.ErrAccountNotConnected();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
disconnect() {
|
|
35
|
+
this.account = { address: '' };
|
|
36
|
+
}
|
|
40
37
|
static getInstance() {
|
|
41
38
|
return CrossWindowProvider._instance;
|
|
42
39
|
}
|
|
@@ -45,176 +42,62 @@ class CrossWindowProvider {
|
|
|
45
42
|
return CrossWindowProvider._instance;
|
|
46
43
|
}
|
|
47
44
|
setWalletUrl(url) {
|
|
48
|
-
this.
|
|
45
|
+
this.windowManager.setWalletUrl(url);
|
|
49
46
|
return CrossWindowProvider._instance;
|
|
50
47
|
}
|
|
51
48
|
init() {
|
|
52
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
|
|
54
|
-
this.initialized = true;
|
|
50
|
+
this.initialized = yield this.windowManager.init();
|
|
55
51
|
return this.initialized;
|
|
56
52
|
});
|
|
57
53
|
}
|
|
58
|
-
|
|
59
|
-
var _a, _b;
|
|
54
|
+
login(options = {}) {
|
|
60
55
|
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
-
if (!this.
|
|
62
|
-
|
|
63
|
-
this.walletWindow = window.open(this.walletUrl, this.walletUrl);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
console.log('In HANDSHAKE: ', 'opening Existing window');
|
|
67
|
-
window.open('', this.walletUrl); // TODO: since walletWindow is always closed, is this needed?
|
|
68
|
-
}
|
|
69
|
-
// TODO: is this needed?
|
|
70
|
-
if (this.handshakeEstablished) {
|
|
71
|
-
console.log('In HANDSHAKE: ', 'handshakeEstablished', this.handshakeEstablished);
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
console.log('In HANDSHAKE: ', 'start listening for handshake event from wallet');
|
|
75
|
-
const { type, payload } = yield this.listenOnce();
|
|
76
|
-
if (type !== 'handshake' || !payload) {
|
|
77
|
-
throw new Error('Handshake could not be established');
|
|
56
|
+
if (!this.initialized) {
|
|
57
|
+
throw new errors_1.ErrProviderNotInitialized();
|
|
78
58
|
}
|
|
79
|
-
console.log('In HANDSHAKE: ', 'Listen once event received: ', {
|
|
80
|
-
type,
|
|
81
|
-
payload
|
|
82
|
-
});
|
|
83
|
-
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.postMessage({ type: 'mxDappHandshake', payload: true }, this.walletUrl);
|
|
84
|
-
this.onHandshakeChangeListener();
|
|
85
|
-
const payloadQueryString = helpers_1.buildWalletQueryString({
|
|
86
|
-
params: {
|
|
87
|
-
token: this.accessToken
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
59
|
const isRelogin = yield this.isConnected();
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// TODO: handshake should not handle login logic
|
|
95
|
-
(_b = this.walletWindow) === null || _b === void 0 ? void 0 : _b.postMessage({
|
|
96
|
-
type: 'mxDappConnect',
|
|
97
|
-
payload: { queryString: payloadQueryString, isRelogin }
|
|
98
|
-
}, this.walletUrl);
|
|
99
|
-
console.log('In HANDSHAKE: ', 'Posting mxDappConnect connect intent to wallet', {
|
|
100
|
-
type: 'mxDappConnect',
|
|
101
|
-
payload: { queryString: payloadQueryString, isRelogin }
|
|
102
|
-
});
|
|
103
|
-
if (!isRelogin) {
|
|
104
|
-
console.log('In HANDSHAKE: ', 'Waiting for connect event from wallet ');
|
|
105
|
-
const { type: connectType, payload: { address, signature } } = yield this.listenOnce();
|
|
106
|
-
if (connectType !== 'connect') {
|
|
107
|
-
throw new Error(`Could not connect. received ${connectType} event instead of connect`);
|
|
108
|
-
}
|
|
109
|
-
this.account.address = address;
|
|
110
|
-
this.account.signature = signature;
|
|
111
|
-
console.log('In HANDSHAKE: ', 'Is first login', {
|
|
60
|
+
if (isRelogin) {
|
|
61
|
+
const { address, signature } = this.account;
|
|
62
|
+
return {
|
|
112
63
|
address,
|
|
113
64
|
signature
|
|
114
|
-
}
|
|
65
|
+
};
|
|
115
66
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
onHandshakeChangeListener() {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
console.log('add handshake change listener');
|
|
124
|
-
const walletUrl = this.walletUrl;
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
126
|
-
const self = this;
|
|
127
|
-
window.addEventListener('message', function eventHandler(event) {
|
|
128
|
-
var _a;
|
|
129
|
-
try {
|
|
130
|
-
const { type, payload } = event.data;
|
|
131
|
-
const isWalletEvent = event.origin === new URL(walletUrl).origin;
|
|
132
|
-
if (isWalletEvent && type === 'handshake') {
|
|
133
|
-
console.log('handshake changed! ', payload);
|
|
134
|
-
if (payload === false) {
|
|
135
|
-
(_a = self.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
136
|
-
self.handshakeEstablished = false;
|
|
137
|
-
self.walletWindow = null;
|
|
138
|
-
console.log('remove handshake!!@#s');
|
|
139
|
-
window.removeEventListener('message', eventHandler);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
67
|
+
this.accessToken = options.token;
|
|
68
|
+
const payloadQueryString = helpers_1.buildWalletQueryString({
|
|
69
|
+
params: {
|
|
70
|
+
token: this.accessToken
|
|
142
71
|
}
|
|
143
|
-
catch (_b) { }
|
|
144
72
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
//param for specific action to listen to
|
|
149
|
-
listenOnce() {
|
|
150
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
-
if (!this.walletWindow) {
|
|
152
|
-
throw new Error('Wallet window is not instantiated');
|
|
153
|
-
}
|
|
154
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
155
|
-
const self = this;
|
|
156
|
-
return yield new Promise((resolve) => {
|
|
157
|
-
const walletUrl = this.walletUrl;
|
|
158
|
-
window.addEventListener('message', function eventHandler(event) {
|
|
159
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
-
try {
|
|
161
|
-
const { type, payload } = event.data;
|
|
162
|
-
const isWalletEvent = event.origin === new URL(walletUrl).origin;
|
|
163
|
-
const isRelogin = yield self.isConnected();
|
|
164
|
-
if (isRelogin && type === 'connect') {
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
if (isWalletEvent) {
|
|
168
|
-
window.removeEventListener('message', eventHandler);
|
|
169
|
-
resolve({ type, payload });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (_a) { }
|
|
173
|
-
});
|
|
174
|
-
});
|
|
73
|
+
const { payload: { address, signature } } = yield this.windowManager.postMessage({
|
|
74
|
+
type: types_1.CrossWindowProviderRequestEnums.loginRequest,
|
|
75
|
+
payload: { queryString: payloadQueryString } // TODO: needs to change to plain qyerystirng
|
|
175
76
|
});
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
var _a;
|
|
180
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
181
|
-
if (!this.initialized) {
|
|
182
|
-
throw new Error('Wallet cross window provider is not initialised, call init() first');
|
|
183
|
-
}
|
|
184
|
-
this.callbackUrl = options.callbackUrl;
|
|
185
|
-
this.accessToken = options.token;
|
|
186
|
-
yield this.handshake();
|
|
187
|
-
(_a = this.walletWindow) === null || _a === void 0 ? void 0 : _a.close();
|
|
188
|
-
return this.account.address; // TODO: whee is the signature ?
|
|
77
|
+
this.account.address = address;
|
|
78
|
+
this.account.signature = signature;
|
|
79
|
+
return { address: this.account.address, signature: this.account.signature };
|
|
189
80
|
});
|
|
190
81
|
}
|
|
191
82
|
logout() {
|
|
192
|
-
var _a;
|
|
193
83
|
return __awaiter(this, void 0, void 0, function* () {
|
|
194
84
|
if (!this.initialized) {
|
|
195
|
-
throw new
|
|
85
|
+
throw new errors_1.ErrProviderNotInitialized();
|
|
196
86
|
}
|
|
197
87
|
this.ensureConnected();
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
catch (error) {
|
|
204
|
-
console.warn('CrossWindow origin url is already cleared!', error);
|
|
205
|
-
}
|
|
206
|
-
return true;
|
|
88
|
+
this.disconnect();
|
|
89
|
+
const connectionClosed = yield this.windowManager.closeConnection();
|
|
90
|
+
// TODO: postMessage to wallet to logout
|
|
91
|
+
return connectionClosed;
|
|
207
92
|
});
|
|
208
93
|
}
|
|
209
|
-
disconnect() {
|
|
210
|
-
this.account = { address: '' };
|
|
211
|
-
}
|
|
212
94
|
getAddress() {
|
|
95
|
+
var _a, _b;
|
|
213
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
214
97
|
if (!this.initialized) {
|
|
215
|
-
throw new
|
|
98
|
+
throw new errors_1.ErrProviderNotInitialized();
|
|
216
99
|
}
|
|
217
|
-
return this.account ?
|
|
100
|
+
return (_b = (_a = this.account) === null || _a === void 0 ? void 0 : _a.address) !== null && _b !== void 0 ? _b : '';
|
|
218
101
|
});
|
|
219
102
|
}
|
|
220
103
|
isInitialized() {
|
|
@@ -235,25 +118,20 @@ class CrossWindowProvider {
|
|
|
235
118
|
return signedTransactions[0];
|
|
236
119
|
});
|
|
237
120
|
}
|
|
238
|
-
ensureConnected() {
|
|
239
|
-
if (!this.account.address) {
|
|
240
|
-
throw new errors_1.ErrAccountNotConnected();
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
121
|
signTransactions(transactions) {
|
|
244
|
-
var _a, _b;
|
|
245
122
|
return __awaiter(this, void 0, void 0, function* () {
|
|
246
123
|
this.ensureConnected();
|
|
247
|
-
yield this.handshake();
|
|
248
124
|
const payloadQueryString = helpers_1.buildTransactionsQueryString(transactions);
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
125
|
+
const { type, payload: signedPlainTransactions } = yield this.windowManager.postMessage({
|
|
126
|
+
type: types_1.CrossWindowProviderRequestEnums.signTransactionsRequest,
|
|
127
|
+
payload: payloadQueryString
|
|
128
|
+
});
|
|
129
|
+
if (type === types_1.CrossWindowProviderResponseEnums.cancelResponse) {
|
|
130
|
+
throw new errors_1.ErrTransactionCancelled();
|
|
254
131
|
}
|
|
255
|
-
|
|
256
|
-
|
|
132
|
+
const hasTransactions = (signedPlainTransactions === null || signedPlainTransactions === void 0 ? void 0 : signedPlainTransactions.length) > 0;
|
|
133
|
+
if (!hasTransactions) {
|
|
134
|
+
throw new errors_1.ErrCouldNotSignTransaction();
|
|
257
135
|
}
|
|
258
136
|
const signedTransactions = signedPlainTransactions.map((tx) => {
|
|
259
137
|
const transaction = sdk_core_1.Transaction.fromPlainObject(tx);
|
|
@@ -263,31 +141,30 @@ class CrossWindowProvider {
|
|
|
263
141
|
});
|
|
264
142
|
}
|
|
265
143
|
signMessage(message) {
|
|
266
|
-
var _a, _b;
|
|
267
144
|
return __awaiter(this, void 0, void 0, function* () {
|
|
268
145
|
this.ensureConnected();
|
|
269
|
-
yield this.handshake();
|
|
270
146
|
const payloadQueryString = helpers_1.buildWalletQueryString({
|
|
271
147
|
params: {
|
|
272
148
|
message: message.message.toString()
|
|
273
149
|
}
|
|
274
150
|
});
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
if (status !== 'signed') {
|
|
282
|
-
throw new Error('Could not sign message');
|
|
151
|
+
const { payload: { status, signature } } = yield this.windowManager.postMessage({
|
|
152
|
+
type: types_1.CrossWindowProviderRequestEnums.signMessageRequest,
|
|
153
|
+
payload: payloadQueryString
|
|
154
|
+
});
|
|
155
|
+
if (status !== types_1.SignMessageStatusEnum.signed) {
|
|
156
|
+
throw new errors_1.ErrCouldNotSignMessage();
|
|
283
157
|
}
|
|
284
|
-
message.applySignature(Buffer.from(signature, 'hex'));
|
|
158
|
+
message.applySignature(Buffer.from(String(signature), 'hex'));
|
|
285
159
|
return message;
|
|
286
160
|
});
|
|
287
161
|
}
|
|
288
162
|
cancelAction() {
|
|
289
163
|
var _a;
|
|
290
|
-
(_a = this.
|
|
164
|
+
(_a = this.windowManager) === null || _a === void 0 ? void 0 : _a.postMessage({
|
|
165
|
+
type: types_1.CrossWindowProviderRequestEnums.cancelAction,
|
|
166
|
+
payload: ''
|
|
167
|
+
});
|
|
291
168
|
}
|
|
292
169
|
}
|
|
293
170
|
exports.CrossWindowProvider = CrossWindowProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossWindowProvider.js","sourceRoot":"","sources":["../src/crossWindowProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"crossWindowProvider.js","sourceRoot":"","sources":["../src/crossWindowProvider.ts"],"names":[],"mappings":"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"}
|
package/out/errors.d.ts
CHANGED
|
@@ -11,3 +11,24 @@ export declare class ErrCannotSignSingleTransaction extends Err {
|
|
|
11
11
|
export declare class ErrAccountNotConnected extends Err {
|
|
12
12
|
constructor();
|
|
13
13
|
}
|
|
14
|
+
export declare class ErrCannotEstablishHandshake extends Err {
|
|
15
|
+
constructor();
|
|
16
|
+
}
|
|
17
|
+
export declare class ErrInstantiationFailed extends Err {
|
|
18
|
+
constructor();
|
|
19
|
+
}
|
|
20
|
+
export declare class ErrWalletWindowNotInstantiated extends Err {
|
|
21
|
+
constructor();
|
|
22
|
+
}
|
|
23
|
+
export declare class ErrProviderNotInitialized extends Err {
|
|
24
|
+
constructor();
|
|
25
|
+
}
|
|
26
|
+
export declare class ErrTransactionCancelled extends Err {
|
|
27
|
+
constructor();
|
|
28
|
+
}
|
|
29
|
+
export declare class ErrCouldNotSignTransaction extends Err {
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
|
32
|
+
export declare class ErrCouldNotSignMessage extends Err {
|
|
33
|
+
constructor();
|
|
34
|
+
}
|
package/out/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ErrAccountNotConnected = exports.ErrCannotSignSingleTransaction = exports.Err = void 0;
|
|
3
|
+
exports.ErrCouldNotSignMessage = exports.ErrCouldNotSignTransaction = exports.ErrTransactionCancelled = exports.ErrProviderNotInitialized = exports.ErrWalletWindowNotInstantiated = exports.ErrInstantiationFailed = exports.ErrCannotEstablishHandshake = exports.ErrAccountNotConnected = exports.ErrCannotSignSingleTransaction = exports.Err = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* The base class for exceptions (errors).
|
|
6
6
|
*/
|
|
@@ -24,4 +24,46 @@ class ErrAccountNotConnected extends Err {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
exports.ErrAccountNotConnected = ErrAccountNotConnected;
|
|
27
|
+
class ErrCannotEstablishHandshake extends Err {
|
|
28
|
+
constructor() {
|
|
29
|
+
super('Handshake could not be established');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.ErrCannotEstablishHandshake = ErrCannotEstablishHandshake;
|
|
33
|
+
class ErrInstantiationFailed extends Err {
|
|
34
|
+
constructor() {
|
|
35
|
+
super('Error: Instantiation failed: Use CrossWindowProvider.getInstance() instead of new.');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.ErrInstantiationFailed = ErrInstantiationFailed;
|
|
39
|
+
class ErrWalletWindowNotInstantiated extends Err {
|
|
40
|
+
constructor() {
|
|
41
|
+
super('Wallet window is not instantiated');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.ErrWalletWindowNotInstantiated = ErrWalletWindowNotInstantiated;
|
|
45
|
+
class ErrProviderNotInitialized extends Err {
|
|
46
|
+
constructor() {
|
|
47
|
+
super('Wallet cross window provider is not initialised, call init() first');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.ErrProviderNotInitialized = ErrProviderNotInitialized;
|
|
51
|
+
class ErrTransactionCancelled extends Err {
|
|
52
|
+
constructor() {
|
|
53
|
+
super('Transaction canceled.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.ErrTransactionCancelled = ErrTransactionCancelled;
|
|
57
|
+
class ErrCouldNotSignTransaction extends Err {
|
|
58
|
+
constructor() {
|
|
59
|
+
super('Could not sign transactions');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.ErrCouldNotSignTransaction = ErrCouldNotSignTransaction;
|
|
63
|
+
class ErrCouldNotSignMessage extends Err {
|
|
64
|
+
constructor() {
|
|
65
|
+
super('Could not sign message');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ErrCouldNotSignMessage = ErrCouldNotSignMessage;
|
|
27
69
|
//# sourceMappingURL=errors.js.map
|
package/out/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,GAAI,SAAQ,KAAK;IAG5B,YAAmB,OAAe,EAAE,KAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHjB,UAAK,GAAsB,SAAS,CAAC;QAInC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAPD,kBAOC;AAED,MAAa,8BAA+B,SAAQ,GAAG;IACrD;QACE,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3C,CAAC;CACF;AAJD,wEAIC;AAED,MAAa,sBAAuB,SAAQ,GAAG;IAC7C;QACE,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrC,CAAC;CACF;AAJD,wDAIC"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,GAAI,SAAQ,KAAK;IAG5B,YAAmB,OAAe,EAAE,KAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHjB,UAAK,GAAsB,SAAS,CAAC;QAInC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAPD,kBAOC;AAED,MAAa,8BAA+B,SAAQ,GAAG;IACrD;QACE,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3C,CAAC;CACF;AAJD,wEAIC;AAED,MAAa,sBAAuB,SAAQ,GAAG;IAC7C;QACE,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrC,CAAC;CACF;AAJD,wDAIC;AAED,MAAa,2BAA4B,SAAQ,GAAG;IAClD;QACE,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC9C,CAAC;CACF;AAJD,kEAIC;AAED,MAAa,sBAAuB,SAAQ,GAAG;IAC7C;QACE,KAAK,CACH,oFAAoF,CACrF,CAAC;IACJ,CAAC;CACF;AAND,wDAMC;AAED,MAAa,8BAA+B,SAAQ,GAAG;IACrD;QACE,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,wEAIC;AAED,MAAa,yBAA0B,SAAQ,GAAG;IAChD;QACE,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC9E,CAAC;CACF;AAJD,8DAIC;AAED,MAAa,uBAAwB,SAAQ,GAAG;IAC9C;QACE,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjC,CAAC;CACF;AAJD,0DAIC;AAED,MAAa,0BAA2B,SAAQ,GAAG;IACjD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACvC,CAAC;CACF;AAJD,gEAIC;AAED,MAAa,sBAAuB,SAAQ,GAAG;IAC7C;QACE,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAClC,CAAC;CACF;AAJD,wDAIC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Transaction } from
|
|
1
|
+
import { Transaction } from '@multiversx/sdk-core/out';
|
|
2
2
|
export declare const buildTransactionsQueryString: (transactions: Transaction[]) => string;
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildTransactionsQueryString = void 0;
|
|
4
4
|
const buildWalletQueryString_1 = require("./buildWalletQueryString");
|
|
5
|
+
const prepareWalletTransaction = (transaction) => {
|
|
6
|
+
const plainTransaction = transaction.toPlainObject();
|
|
7
|
+
// We adjust the data field, in order to make it compatible with what the web wallet expects.
|
|
8
|
+
if (plainTransaction.data) {
|
|
9
|
+
plainTransaction.data = Buffer.from(plainTransaction.data, 'base64').toString();
|
|
10
|
+
if (plainTransaction.receiverUsername) {
|
|
11
|
+
plainTransaction.receiverUsername = Buffer.from(plainTransaction.receiverUsername, 'base64').toString();
|
|
12
|
+
}
|
|
13
|
+
if (plainTransaction.senderUsername) {
|
|
14
|
+
plainTransaction.senderUsername = Buffer.from(plainTransaction.senderUsername, 'base64').toString();
|
|
15
|
+
}
|
|
16
|
+
// The web wallet expects the data field to be a string, even if it's empty (early 2023).
|
|
17
|
+
plainTransaction.data = plainTransaction.data || '';
|
|
18
|
+
}
|
|
19
|
+
return plainTransaction;
|
|
20
|
+
};
|
|
5
21
|
const buildTransactionsQueryString = (transactions) => {
|
|
6
22
|
const jsonToSend = {};
|
|
7
23
|
transactions.map((tx) => {
|
|
@@ -15,24 +31,8 @@ const buildTransactionsQueryString = (transactions) => {
|
|
|
15
31
|
}
|
|
16
32
|
});
|
|
17
33
|
return buildWalletQueryString_1.buildWalletQueryString({
|
|
18
|
-
params: jsonToSend
|
|
34
|
+
params: jsonToSend
|
|
19
35
|
});
|
|
20
36
|
};
|
|
21
37
|
exports.buildTransactionsQueryString = buildTransactionsQueryString;
|
|
22
|
-
const prepareWalletTransaction = (transaction) => {
|
|
23
|
-
const plainTransaction = transaction.toPlainObject();
|
|
24
|
-
// We adjust the data field, in order to make it compatible with what the web wallet expects.
|
|
25
|
-
if (plainTransaction.data) {
|
|
26
|
-
plainTransaction.data = Buffer.from(plainTransaction.data, "base64").toString();
|
|
27
|
-
if (plainTransaction.receiverUsername) {
|
|
28
|
-
plainTransaction.receiverUsername = Buffer.from(plainTransaction.receiverUsername, "base64").toString();
|
|
29
|
-
}
|
|
30
|
-
if (plainTransaction.senderUsername) {
|
|
31
|
-
plainTransaction.senderUsername = Buffer.from(plainTransaction.senderUsername, "base64").toString();
|
|
32
|
-
}
|
|
33
|
-
// The web wallet expects the data field to be a string, even if it's empty (early 2023).
|
|
34
|
-
plainTransaction.data = plainTransaction.data || "";
|
|
35
|
-
}
|
|
36
|
-
return plainTransaction;
|
|
37
|
-
};
|
|
38
38
|
//# sourceMappingURL=buildTransactionsQueryString.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildTransactionsQueryString.js","sourceRoot":"","sources":["../../src/helpers/buildTransactionsQueryString.ts"],"names":[],"mappings":";;;AACA,qEAAkE;
|
|
1
|
+
{"version":3,"file":"buildTransactionsQueryString.js","sourceRoot":"","sources":["../../src/helpers/buildTransactionsQueryString.ts"],"names":[],"mappings":";;;AACA,qEAAkE;AAElE,MAAM,wBAAwB,GAAG,CAAC,WAAwB,EAAO,EAAE;IACjE,MAAM,gBAAgB,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC;IAErD,6FAA6F;IAC7F,IAAI,gBAAgB,CAAC,IAAI,EAAE;QACzB,gBAAgB,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CACjC,gBAAgB,CAAC,IAAI,EACrB,QAAQ,CACT,CAAC,QAAQ,EAAE,CAAC;QAEb,IAAI,gBAAgB,CAAC,gBAAgB,EAAE;YACrC,gBAAgB,CAAC,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAC7C,gBAAgB,CAAC,gBAAgB,EACjC,QAAQ,CACT,CAAC,QAAQ,EAAE,CAAC;SACd;QAED,IAAI,gBAAgB,CAAC,cAAc,EAAE;YACnC,gBAAgB,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAC3C,gBAAgB,CAAC,cAAc,EAC/B,QAAQ,CACT,CAAC,QAAQ,EAAE,CAAC;SACd;QACD,yFAAyF;QACzF,gBAAgB,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC;KACrD;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEK,MAAM,4BAA4B,GAAG,CAC1C,YAA2B,EACnB,EAAE;IACV,MAAM,UAAU,GAAQ,EAAE,CAAC;IAC3B,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IACE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC9B,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,EAClC;gBACA,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;aACzB;YAED,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAC1C;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,+CAAsB,CAAC;QAC5B,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;AACL,CAAC,CAAC;AArBW,QAAA,4BAA4B,gCAqBvC"}
|
package/out/types.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { IPlainTransactionObject } from '@multiversx/sdk-core';
|
|
2
|
+
export declare enum CrossWindowProviderRequestEnums {
|
|
3
|
+
signTransactionsRequest = "SIGN_TRANSACTIONS_REQUEST",
|
|
4
|
+
signMessageRequest = "SIGN_MESSAGE_REQUEST",
|
|
5
|
+
loginRequest = "LOGIN_REQUEST",
|
|
6
|
+
logoutRequest = "LOGOUT_REQUEST",
|
|
7
|
+
cancelAction = "CANCEL_ACTION_REQUEST"
|
|
8
|
+
}
|
|
9
|
+
export declare enum CrossWindowProviderResponseEnums {
|
|
10
|
+
handshakeResponse = "HANDSHAKE_RESPONSE",
|
|
11
|
+
loginResponse = "LOGIN_RESPONSE",
|
|
12
|
+
disconnectResponse = "DISCONNECT_RESPONSE",
|
|
13
|
+
cancelResponse = "CANCEL_RESPONSE",
|
|
14
|
+
signTransactionsResponse = "SIGN_TRANSACTIONS_RESPONSE",
|
|
15
|
+
signMessageResponse = "SIGN_MESSAGE_RESPONSE",
|
|
16
|
+
noneResponse = "NONE_RESPONSE"
|
|
17
|
+
}
|
|
18
|
+
export declare enum SignMessageStatusEnum {
|
|
19
|
+
pending = "pending",
|
|
20
|
+
failed = "failed",
|
|
21
|
+
signed = "signed",
|
|
22
|
+
cancelled = "cancelled"
|
|
23
|
+
}
|
|
24
|
+
declare type ReplyWithPostMessageObjectType = {
|
|
25
|
+
[CrossWindowProviderResponseEnums.handshakeResponse]: boolean;
|
|
26
|
+
[CrossWindowProviderResponseEnums.loginResponse]: {
|
|
27
|
+
address: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
signature?: string;
|
|
30
|
+
};
|
|
31
|
+
[CrossWindowProviderResponseEnums.disconnectResponse]: null;
|
|
32
|
+
[CrossWindowProviderResponseEnums.cancelResponse]: {
|
|
33
|
+
address: string;
|
|
34
|
+
};
|
|
35
|
+
[CrossWindowProviderResponseEnums.signTransactionsResponse]: IPlainTransactionObject[];
|
|
36
|
+
[CrossWindowProviderResponseEnums.signMessageResponse]: {
|
|
37
|
+
signature?: string;
|
|
38
|
+
status: SignMessageStatusEnum;
|
|
39
|
+
};
|
|
40
|
+
[CrossWindowProviderResponseEnums.noneResponse]: null;
|
|
41
|
+
};
|
|
42
|
+
export declare type ReplyWithPostMessageType<T extends CrossWindowProviderResponseEnums> = {
|
|
43
|
+
type: T;
|
|
44
|
+
payload: ReplyWithPostMessageObjectType[T];
|
|
45
|
+
};
|
|
46
|
+
export declare type ResponseTypeMap = {
|
|
47
|
+
[CrossWindowProviderRequestEnums.signTransactionsRequest]: CrossWindowProviderResponseEnums.signTransactionsResponse;
|
|
48
|
+
[CrossWindowProviderRequestEnums.signMessageRequest]: CrossWindowProviderResponseEnums.signMessageResponse;
|
|
49
|
+
[CrossWindowProviderRequestEnums.loginRequest]: CrossWindowProviderResponseEnums.loginResponse;
|
|
50
|
+
[CrossWindowProviderRequestEnums.logoutRequest]: CrossWindowProviderResponseEnums.disconnectResponse;
|
|
51
|
+
[CrossWindowProviderRequestEnums.cancelAction]: CrossWindowProviderResponseEnums.cancelResponse;
|
|
52
|
+
};
|
|
53
|
+
export {};
|
package/out/types.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SignMessageStatusEnum = exports.CrossWindowProviderResponseEnums = exports.CrossWindowProviderRequestEnums = void 0;
|
|
4
|
+
var CrossWindowProviderRequestEnums;
|
|
5
|
+
(function (CrossWindowProviderRequestEnums) {
|
|
6
|
+
CrossWindowProviderRequestEnums["signTransactionsRequest"] = "SIGN_TRANSACTIONS_REQUEST";
|
|
7
|
+
CrossWindowProviderRequestEnums["signMessageRequest"] = "SIGN_MESSAGE_REQUEST";
|
|
8
|
+
CrossWindowProviderRequestEnums["loginRequest"] = "LOGIN_REQUEST";
|
|
9
|
+
CrossWindowProviderRequestEnums["logoutRequest"] = "LOGOUT_REQUEST";
|
|
10
|
+
CrossWindowProviderRequestEnums["cancelAction"] = "CANCEL_ACTION_REQUEST";
|
|
11
|
+
})(CrossWindowProviderRequestEnums = exports.CrossWindowProviderRequestEnums || (exports.CrossWindowProviderRequestEnums = {}));
|
|
12
|
+
var CrossWindowProviderResponseEnums;
|
|
13
|
+
(function (CrossWindowProviderResponseEnums) {
|
|
14
|
+
CrossWindowProviderResponseEnums["handshakeResponse"] = "HANDSHAKE_RESPONSE";
|
|
15
|
+
CrossWindowProviderResponseEnums["loginResponse"] = "LOGIN_RESPONSE";
|
|
16
|
+
CrossWindowProviderResponseEnums["disconnectResponse"] = "DISCONNECT_RESPONSE";
|
|
17
|
+
CrossWindowProviderResponseEnums["cancelResponse"] = "CANCEL_RESPONSE";
|
|
18
|
+
CrossWindowProviderResponseEnums["signTransactionsResponse"] = "SIGN_TRANSACTIONS_RESPONSE";
|
|
19
|
+
CrossWindowProviderResponseEnums["signMessageResponse"] = "SIGN_MESSAGE_RESPONSE";
|
|
20
|
+
CrossWindowProviderResponseEnums["noneResponse"] = "NONE_RESPONSE";
|
|
21
|
+
})(CrossWindowProviderResponseEnums = exports.CrossWindowProviderResponseEnums || (exports.CrossWindowProviderResponseEnums = {}));
|
|
22
|
+
var SignMessageStatusEnum;
|
|
23
|
+
(function (SignMessageStatusEnum) {
|
|
24
|
+
SignMessageStatusEnum["pending"] = "pending";
|
|
25
|
+
SignMessageStatusEnum["failed"] = "failed";
|
|
26
|
+
SignMessageStatusEnum["signed"] = "signed";
|
|
27
|
+
SignMessageStatusEnum["cancelled"] = "cancelled";
|
|
28
|
+
})(SignMessageStatusEnum = exports.SignMessageStatusEnum || (exports.SignMessageStatusEnum = {}));
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
package/out/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAEA,IAAY,+BAMX;AAND,WAAY,+BAA+B;IACzC,wFAAqD,CAAA;IACrD,8EAA2C,CAAA;IAC3C,iEAA8B,CAAA;IAC9B,mEAAgC,CAAA;IAChC,yEAAsC,CAAA;AACxC,CAAC,EANW,+BAA+B,GAA/B,uCAA+B,KAA/B,uCAA+B,QAM1C;AAED,IAAY,gCAQX;AARD,WAAY,gCAAgC;IAC1C,4EAAwC,CAAA;IACxC,oEAAgC,CAAA;IAChC,8EAA0C,CAAA;IAC1C,sEAAkC,CAAA;IAClC,2FAAuD,CAAA;IACvD,iFAA6C,CAAA;IAC7C,kEAA8B,CAAA;AAChC,CAAC,EARW,gCAAgC,GAAhC,wCAAgC,KAAhC,wCAAgC,QAQ3C;AAED,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;IACjB,0CAAiB,CAAA;IACjB,gDAAuB,CAAA;AACzB,CAAC,EALW,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAKhC"}
|