UNPKG

fsl-authorization

Version:
627 lines (626 loc) 34 kB
import { __assign, __awaiter, __generator } from "tslib"; import { omit } from 'lodash'; import { verifyMessage, verifyTypedData } from 'ethers/lib/utils'; import { v4 as uuidv4 } from 'uuid'; import { Transaction, VersionedTransaction } from '@solana/web3.js'; var clearLoopObserver = function (clientWindow, handleMessage) { var interval = setInterval(function () { if (!clientWindow || clientWindow.closed) { clearInterval(interval); window.removeEventListener('message', handleMessage); } }, 500); return interval; }; var checkWindowOpenStatus = function (clientWindow, reject, msg) { if (msg === void 0) { msg = 'The pop-up cannot be ejected'; } var id = setTimeout(function () { clearTimeout(id); if (!clientWindow) { reject(msg); } }, 2000); }; var envPromiseCheckWrapper = function (callback, clientWindow, msg) { return new Promise(function (resolve, reject) { checkWindowOpenStatus(clientWindow, reject, msg); callback(resolve, reject); }); }; var FSLAuthorization = /** @class */ (function () { function FSLAuthorization(opt) { this.windowFeatures = "left=".concat(window.screen.width / 2 - 200, ",top=").concat(window.screen.height / 2 - 500, ",width=500,height=800,popup=1"); var responseType = opt.responseType, appKey = opt.appKey, redirectUri = opt.redirectUri, scope = opt.scope, state = opt.state, usePopup = opt.usePopup, domain = opt.domain, isApp = opt.isApp; this.appKey = appKey; this.responseType = responseType; this.redirectUri = redirectUri; this.scope = scope; this.usePopup = usePopup; this.state = state; this.domain = domain; this.isApp = isApp; } FSLAuthorization.init = function (opt) { return new FSLAuthorization(opt); }; FSLAuthorization.prototype.signIn = function (args) { return __awaiter(this, void 0, void 0, function () { var callUrl, commonArgs, key, clientWindow_1; return __generator(this, function (_a) { callUrl = new URL("".concat(this.domain || 'https://id.fsl.com', "/login/fslUsers")); commonArgs = { response_type: this.responseType, appkey: this.appKey, scope: this.scope, state: this.state, is_app: this.isApp ? '1' : undefined, withState: (args === null || args === void 0 ? void 0 : args.withState) ? '1' : undefined, }; for (key in commonArgs) { if (commonArgs[key]) { callUrl.searchParams.append(key, commonArgs[key]); } } if (!this.usePopup) { callUrl.searchParams.append('redirect_uri', this.redirectUri); location.href = callUrl.toString(); return [2 /*return*/, Promise.resolve(null)]; } else { callUrl.searchParams.append('use_popup', '1'); if (this.isApp) { callUrl.searchParams.append('redirect_uri', this.redirectUri); } clientWindow_1 = window.open(callUrl.toString(), this.isApp ? '_blank' : "signWindow", this.windowFeatures); if (this.isApp) { return [2 /*return*/, Promise.resolve(null)]; } return [2 /*return*/, envPromiseCheckWrapper(function (resolve) { var handleMessage = function (e) { if (e.data.type === 'fsl_login') { resolve(e.data.data); window.removeEventListener('message', handleMessage); } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow_1, handleMessage); }, clientWindow_1)]; } return [2 /*return*/]; }); }); }; FSLAuthorization.prototype.signInV2 = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.signIn({ withState: true })]; }); }); }; FSLAuthorization.evmVerifyMessage = function (msg, signature) { return verifyMessage(msg, signature); }; FSLAuthorization.evmVerifyTypedData = function (domain, types, message, signature) { return verifyTypedData(domain, types, message, signature); }; FSLAuthorization.prototype.callEvmSign = function (args) { return __awaiter(this, void 0, void 0, function () { var msg, chainId, chain, rpc, signDigest, callUrl, type, uuid, url, clientWindow; return __generator(this, function (_a) { msg = args.msg, chainId = args.chainId, chain = args.chain, rpc = args.rpc, signDigest = args.signDigest; callUrl = new URL("".concat(args.domain || this.domain || 'https://id.fsl.com', "/authorization/sign")); switch (true) { case msg instanceof Uint8Array: type = 'unit8Array'; break; case msg instanceof Uint16Array: type = 'unit16Array'; break; case msg instanceof Uint32Array: type = 'unit32Array'; break; default: type = ''; } uuid = uuidv4(); callUrl.searchParams.append('arguments', encodeURIComponent(JSON.stringify({ id: uuid, appKey: this.appKey, rpc: rpc, chainId: chainId, chain: chain, }))); if (args.uid) { callUrl.searchParams.append('uid', args.uid + ''); } url = callUrl.toString(); clientWindow = window.open(url, "evmSignWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ id: uuid, msg: msg, type: type, signDigest: signDigest ? 1 : undefined, }), }, '*'); return; } else { resolve(e.data.data); } } else { reject(e.data.data); } window.removeEventListener('message', handleMessage); } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow)]; }); }); }; FSLAuthorization.prototype.callEvmSignDigest = function (args) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.callEvmSign(__assign(__assign({}, args), { signDigest: true }))]; }); }); }; FSLAuthorization.prototype.signTransaction = function (args) { return __awaiter(this, void 0, void 0, function () { var callUrl, url, clientWindow; return __generator(this, function (_a) { callUrl = new URL("".concat(args.domain || this.domain || 'https://id.fsl.com', "/authorization/trade")); callUrl.searchParams.append('arguments', JSON.stringify(__assign(__assign({}, omit(args, 'domain', 'uid')), { onlySign: 'onlySign', appKey: this.appKey }))); if (args.uid) { callUrl.searchParams.append('uid', args.uid + ''); } url = callUrl.toString(); clientWindow = window.open(url, "signEvmContractWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { resolve(e.data.data); } else { reject(e.data.data); } window.removeEventListener('message', handleMessage); } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow)]; }); }); }; FSLAuthorization.prototype.callEvmContract = function (args) { return __awaiter(this, void 0, void 0, function () { var callUrl, url; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!(window.callContractWindow && !window.callContractWindow.closed)) return [3 /*break*/, 2]; if (window.callContractHandler) { window.removeEventListener('message', window.callContractHandler); window.callContractHandler = null; } if (window.callContractInterval) { clearInterval(window.callContractInterval); window.callContractInterval = void 0; } window.callContractWindow.close(); return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(function () { resolve(true); }, 1000); })]; case 1: _a.sent(); _a.label = 2; case 2: callUrl = new URL("".concat(args.domain || this.domain || 'https://id.fsl.com', "/authorization/trade")); args.confirmed = args.confirmed || false; callUrl.searchParams.append('arguments', JSON.stringify(__assign(__assign({}, omit(args, 'domain', 'uid')), { appKey: this.appKey }))); if (args.uid) { callUrl.searchParams.append('uid', args.uid + ''); } url = callUrl.toString(); window.callContractWindow = window.open(url, "evmContractWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { window.callContractHandler = function (e) { if (e.data.type === 'fsl_auth') { if (e.data.data && typeof e.data.data === 'object' && 'transactionHash' in e.data.data) { resolve(e.data.data); } else { reject(e.data.data); } window.callContractHandler && window.removeEventListener('message', window.callContractHandler); } }; window.addEventListener('message', window.callContractHandler, false); window.callContractInterval = clearLoopObserver(window.callContractWindow, window.callContractHandler); }, window.callContractWindow)]; } }); }); }; FSLAuthorization.prototype.signTypedData = function (args) { return __awaiter(this, void 0, void 0, function () { var domain, types, message, mockDomain, chain, chainId, uid, uuid, callUrl, url, clientWindow; var _this = this; return __generator(this, function (_a) { domain = args.domain, types = args.types, message = args.message, mockDomain = args.mockDomain, chain = args.chain, chainId = args.chainId, uid = args.uid; uuid = uuidv4(); callUrl = new URL("".concat(mockDomain || this.domain || 'https://id.fsl.com', "/authorization/sign-v4")); callUrl.searchParams.append('arguments', encodeURIComponent(JSON.stringify({ id: uuid, }))); if (uid) { callUrl.searchParams.append('uid', uid + ''); } url = callUrl.toString(); clientWindow = window.open(url, "typedSignWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ message: message, chain: chain, chainId: chainId, types: types, domain: domain, id: uuid, appKey: _this.appKey, }), }, '*'); } else { resolve(e.data.data); window.removeEventListener('message', handleMessage); } } else { reject(e.data.data); window.removeEventListener('message', handleMessage); } } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow)]; }); }); }; FSLAuthorization.prototype.callEvmContractByCallData = function (args) { return __awaiter(this, void 0, void 0, function () { var uuid, contractAddress, callData, chainId, gasLimit, value, chain, rpc, domain, nonce, onlySign, maxPriorityFeePerGasValue, maxFeePerGasValue, uid, _a, confirmed, callUrl, url, clientWindow; var _this = this; return __generator(this, function (_b) { uuid = uuidv4(); contractAddress = args.contractAddress, callData = args.callData, chainId = args.chainId, gasLimit = args.gasLimit, value = args.value, chain = args.chain, rpc = args.rpc, domain = args.domain, nonce = args.nonce, onlySign = args.onlySign, maxPriorityFeePerGasValue = args.maxPriorityFeePerGasValue, maxFeePerGasValue = args.maxFeePerGasValue, uid = args.uid, _a = args.confirmed, confirmed = _a === void 0 ? false : _a; callUrl = new URL("".concat(domain || this.domain || 'https://id.fsl.com', "/authorization/call-data")); callUrl.searchParams.append('arguments', JSON.stringify({ id: uuid, onlySign: onlySign ? 'onlySign' : undefined, })); if (uid) { callUrl.searchParams.append('uid', uid + ''); } url = callUrl.toString(); clientWindow = window.open(url, "callDataWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ contractAddress: contractAddress, callData: callData, chainId: chainId, gasLimit: gasLimit, value: value, chain: chain, rpc: rpc, nonce: nonce, maxFeePerGasValue: maxFeePerGasValue, maxPriorityFeePerGasValue: maxPriorityFeePerGasValue, id: uuid, confirmed: confirmed, appKey: _this.appKey, }), }, '*'); } else { resolve(e.data.data); window.removeEventListener('message', handleMessage); } } else if (typeof e.data.data === 'object' && 'transactionHash' in e.data.data) { resolve(e.data.data); window.removeEventListener('message', handleMessage); } else { reject(e.data.data); window.removeEventListener('message', handleMessage); } } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow)]; }); }); }; FSLAuthorization.prototype.signCallDataTransaction = function (args) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.callEvmContractByCallData(__assign(__assign({}, args), { onlySign: true }))]; }); }); }; FSLAuthorization.prototype.signSolMessage = function (args) { var msg = args.msg, domain = args.domain, uid = args.uid; var callUrl = new URL("".concat(domain || this.domain || 'https://id.fsl.com', "/authorization/sol-sign")); callUrl.searchParams.append('arguments', encodeURIComponent(JSON.stringify({ msg: msg, appKey: this.appKey, }))); if (uid) { callUrl.searchParams.append('uid', uid + ''); } var url = callUrl.toString(); var clientWindow = window.open(url, "signSolMsgWindow", this.windowFeatures); return envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (e.data.data && typeof e.data.data === 'object' && 'length' in e.data.data) { resolve(e.data.data); } else { reject(e.data.data); } window.removeEventListener('message', handleMessage); } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow); }; FSLAuthorization.prototype.callSolInstructions = function (args) { var _this = this; var domain = args.domain, instructions = args.instructions, keypairs = args.keypairs, rpc = args.rpc, unitPrice = args.unitPrice, unitLimit = args.unitLimit, onlySign = args.onlySign, uid = args.uid; var uuid = uuidv4(); var callUrl = new URL("".concat(domain || this.domain || 'https://id.fsl.com', "/authorization/sol-trade")); callUrl.searchParams.append('arguments', JSON.stringify({ appKey: this.appKey, rpc: rpc, onlySign: onlySign ? 'onlySign' : void 0, id: uuid, })); if (uid) { callUrl.searchParams.append('uid', uid + ''); } var url = callUrl.toString(); var clientWindow = window.open(url, "signSolCallWindow", this.windowFeatures); return envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ instructions: instructions, keypairs: keypairs, unitLimit: unitLimit, unitPrice: unitPrice, id: uuid, }), }, '*'); } else { resolve(e.data.data); window.removeEventListener('message', handleMessage); } } else { reject(e.data.data); window.removeEventListener('message', handleMessage); } } return [2 /*return*/]; }); }); }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow); }; FSLAuthorization.prototype.signSolInstructions = function (args) { return this.callSolInstructions(__assign(__assign({}, args), { onlySign: true })); }; FSLAuthorization.prototype.signSolTransaction = function (args) { var _this = this; var transactions = args.transactions, uid = args.uid; var bufferStrs = []; var versions = []; try { bufferStrs = transactions.map(function (item) { if (item.version === 0) { versions.push(0); return Buffer.from(item.serialize({ verifySignatures: false })).toString('base64'); } else { versions.push('legacy'); return item.serialize({ verifySignatures: false }).toString('base64'); } }); } catch (err) { return Promise.reject(err.message); } var uuid = uuidv4(); var callUrl = new URL("".concat(this.domain || 'https://id.fsl.com', "/authorization/sol-transaction")); callUrl.searchParams.append('arguments', JSON.stringify({ id: uuid, })); if (uid) { callUrl.searchParams.append('uid', uid + ''); } var url = callUrl.toString(); var clientWindow = window.open(url, "signSolTrsWindow", this.windowFeatures); return envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { return __awaiter(_this, void 0, void 0, function () { var handledBufferStrs, transactions_1, i, newTransaction, newTransaction; return __generator(this, function (_a) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ appKey: this.appKey, transactions: bufferStrs, versions: versions, id: uuid, }), }, '*'); } } else if (Array.isArray(e.data.data)) { handledBufferStrs = e.data.data; transactions_1 = []; try { for (i = 0; i < versions.length; i++) { if (versions[i] === 0) { newTransaction = VersionedTransaction.deserialize(Buffer.from(handledBufferStrs[i], 'base64')); transactions_1.push(newTransaction); } else { newTransaction = Transaction.from(Buffer.from(handledBufferStrs[i], 'base64')); transactions_1.push(newTransaction); } } } catch (err) { console.log(err.message); } resolve(transactions_1); window.removeEventListener('message', handleMessage); } else { reject(e.data.data); window.removeEventListener('message', handleMessage); } } return [2 /*return*/]; }); }); }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow); }; FSLAuthorization.prototype.callEvmContractV2 = function (args) { return __awaiter(this, void 0, void 0, function () { var contractAddress, methodName, abi, chainId, chain, value, gasLimit, params, to, rpc, domain, nonce, maxPriorityFeePerGasValue, maxFeePerGasValue, onlySign, uid, id, callUrl, url, clientWindow; return __generator(this, function (_a) { contractAddress = args.contractAddress, methodName = args.methodName, abi = args.abi, chainId = args.chainId, chain = args.chain, value = args.value, gasLimit = args.gasLimit, params = args.params, to = args.to, rpc = args.rpc, domain = args.domain, nonce = args.nonce, maxPriorityFeePerGasValue = args.maxPriorityFeePerGasValue, maxFeePerGasValue = args.maxFeePerGasValue, onlySign = args.onlySign, uid = args.uid; id = uuidv4(); callUrl = new URL("".concat(domain || this.domain || 'https://id.fsl.com', "/authorization/trade-v2")); callUrl.searchParams.append('arguments', JSON.stringify({ appKey: this.appKey, onlySign: onlySign ? 'onlySign' : undefined, chainId: chainId, chain: chain, rpc: rpc, id: id, })); if (uid) { callUrl.searchParams.append('uid', uid + ''); } url = callUrl.toString(); clientWindow = window.open(url, "evmContractWindow", this.windowFeatures); return [2 /*return*/, envPromiseCheckWrapper(function (resolve, reject) { var handleMessage = function (e) { if (e.data.type === 'fsl_auth') { if (typeof e.data.data === 'string') { if (e.data.data === 'done') { clientWindow && clientWindow.postMessage({ type: 'fsl_params', data: JSON.stringify({ contractAddress: contractAddress, methodName: methodName, abi: abi, value: value, gasLimit: gasLimit, params: params, to: to, nonce: nonce, maxPriorityFeePerGasValue: maxPriorityFeePerGasValue, maxFeePerGasValue: maxFeePerGasValue, id: id, }), }, '*'); } else { resolve(e.data.data); window.removeEventListener('message', handleMessage); } } else if (e.data.data && typeof e.data.data === 'object' && 'transactionHash' in e.data.data) { resolve(e.data.data); window.removeEventListener('message', handleMessage); } else { reject(e.data.data); window.removeEventListener('message', handleMessage); } } }; window.addEventListener('message', handleMessage, false); clearLoopObserver(clientWindow, handleMessage); }, clientWindow)]; }); }); }; FSLAuthorization.prototype.signEvmContractV2 = function (args) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.callEvmContractV2(__assign(__assign({}, args), { onlySign: true }))]; }); }); }; return FSLAuthorization; }()); export default FSLAuthorization;