UNPKG

sign-in-with-ethereum-parser

Version:

Parse Messages that conform to EIP-4361: Sign In with Ethereum (SIWE)

128 lines (127 loc) 5.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isUri = exports.ParsedMessage = void 0; const siwe_grammar_1 = require("./siwe-grammar"); const callbacks_1 = require("./callbacks"); const node_exports_1 = __importDefault(require("apg-js/src/apg-lib/node-exports")); const grammarObj = new siwe_grammar_1.grammar(); class ParsedMessage { // and display it on an HTML page. constructor(msg) { const parser = new node_exports_1.default.parser(); parser.callbacks["sign-in-with-ethereum"] = callbacks_1.cb.signInWithEtherium; parser.callbacks["oscheme"] = callbacks_1.cb.oscheme; parser.callbacks["domain"] = callbacks_1.cb.domain; parser.callbacks["LF"] = callbacks_1.cb.lineno; parser.callbacks["ex-title"] = callbacks_1.cb.exTitle; parser.callbacks["nb-title"] = callbacks_1.cb.nbTitle; parser.callbacks["ri-title"] = callbacks_1.cb.riTitle; parser.callbacks["re-title"] = callbacks_1.cb.reTitle; parser.callbacks["address"] = callbacks_1.cb.address; parser.callbacks["statement"] = callbacks_1.cb.statement; parser.callbacks["empty-statement"] = callbacks_1.cb.emptyStatement; parser.callbacks["version"] = callbacks_1.cb.version; parser.callbacks["chain-id"] = callbacks_1.cb.chainId; parser.callbacks["nonce"] = callbacks_1.cb.nonce; parser.callbacks["issued-at"] = callbacks_1.cb.issuedAt; parser.callbacks["expiration-time"] = callbacks_1.cb.expirationTime; parser.callbacks["not-before"] = callbacks_1.cb.notBefore; parser.callbacks["request-id"] = callbacks_1.cb.requestId; parser.callbacks["uri"] = callbacks_1.cb.uri; parser.callbacks["uri-r"] = callbacks_1.cb.uriR; parser.callbacks["resource"] = callbacks_1.cb.resource; parser.callbacks["scheme"] = callbacks_1.cb.scheme; parser.callbacks["userinfo-at"] = callbacks_1.cb.userinfo; parser.callbacks["host"] = callbacks_1.cb.host; parser.callbacks["IP-literal"] = callbacks_1.cb.ipLiteral; parser.callbacks["port"] = callbacks_1.cb.port; parser.callbacks["path-abempty"] = callbacks_1.cb.pathAbempty; parser.callbacks["path-absolute"] = callbacks_1.cb.pathAbsolute; parser.callbacks["path-rootless"] = callbacks_1.cb.pathRootless; parser.callbacks["path-empty"] = callbacks_1.cb.pathEmpty; parser.callbacks["query"] = callbacks_1.cb.query; parser.callbacks["fragment"] = callbacks_1.cb.fragment; parser.callbacks["IPv4address"] = callbacks_1.cb.ipv4; parser.callbacks["nodcolon"] = callbacks_1.cb.nodcolon; parser.callbacks["dcolon"] = callbacks_1.cb.dcolon; parser.callbacks["h16"] = callbacks_1.cb.h16; parser.callbacks["h16c"] = callbacks_1.cb.h16; parser.callbacks["h16n"] = callbacks_1.cb.h16; parser.callbacks["h16cn"] = callbacks_1.cb.h16; parser.callbacks["dec-octet"] = callbacks_1.cb.decOctet; parser.callbacks["dec-digit"] = callbacks_1.cb.decDigit; // initialize parsed elements const elements = { errors: [], lineno: 1, scheme: undefined, domain: undefined, address: undefined, statement: undefined, uri: undefined, version: undefined, chainId: undefined, nonce: undefined, issuedAt: undefined, expirationTime: undefined, notBefore: undefined, requestId: undefined, resources: undefined, uriElements: { scheme: undefined, userinfo: undefined, host: undefined, port: undefined, path: undefined, query: undefined, fragment: undefined, }, }; const result = parser.parse(grammarObj, 0, msg, elements); let throwMsg = ""; for (let i = 0; i < elements.errors.length; i += 1) { throwMsg += elements.errors[i] + "\n"; } if (!result.success) { throwMsg += `Invalid message: ${JSON.stringify(result)}`; } if (throwMsg !== "") { throw new Error(throwMsg); } this.scheme = elements.scheme; this.domain = elements.domain; this.address = elements.address; this.statement = elements.statement; this.uri = elements.uri; this.version = elements.version; this.chainId = elements.chainId; this.nonce = elements.nonce; this.issuedAt = elements.issuedAt; this.expirationTime = elements.expirationTime; this.notBefore = elements.notBefore; this.requestId = elements.requestId; this.resources = elements.resources; this.uriElements = elements.uriElements; } } exports.ParsedMessage = ParsedMessage; const isUri = (uri) => { const parser = new node_exports_1.default.parser(); parser.callbacks["IP-literal"] = callbacks_1.cb.ipLiteral; parser.callbacks["IPv4address"] = callbacks_1.cb.ipv4; parser.callbacks["nodcolon"] = callbacks_1.cb.nodcolon; parser.callbacks["dcolon"] = callbacks_1.cb.dcolon; parser.callbacks["h16"] = callbacks_1.cb.h16; parser.callbacks["h16c"] = callbacks_1.cb.h16; parser.callbacks["h16n"] = callbacks_1.cb.h16; parser.callbacks["h16cn"] = callbacks_1.cb.h16; parser.callbacks["dec-octet"] = callbacks_1.cb.decOctet; parser.callbacks["dec-digit"] = callbacks_1.cb.decDigit; const data = { errors: [] }; const result = parser.parse(grammarObj, "uri-r", uri, data); return result.success; }; exports.isUri = isUri;