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
JavaScript
;
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;