UNPKG

@metamask/providers

Version:

A JavaScript Ethereum provider that connects to the wallet over a stream

1 lines 5.99 kB
{"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AACA,+DAAoE;AACpE,qDAAiD;AAOjD,4FAAqF;AASrF,YAAY;AAEZ,wGAAwG;AAC3F,QAAA,aAAa,GACxB,sGAAsG,CAAC;AAEzG,uCAAuC;AAC1B,QAAA,UAAU,GACrB,0EAA0E,CAAC;AAE7E,sCAAsC;AACtC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEvC,QAAA,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,kBAAkB,EAAE,+CAA+C;CACpE,CAAC,CAAC;AAEH,oBAAoB;AAEpB;;;;;;GAMG;AACI,MAAM,4BAA4B,GAAG,CAAC,SAAsB,OAAO,EAAE,EAAE,CAAC;IAC7E,IAAA,yCAAuB,GAAE;IACzB,qBAAqB,CAAC,MAAM,CAAC;IAC7B,IAAA,uDAA0B,EAAC,MAAM,CAAC;CACnC,CAAC;AAJW,QAAA,4BAA4B,gCAIvC;AAEF;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,GAAgB;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QACjC,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG,sBAAS,CAAC,cAAc,CAAC;gBACxC,OAAO,EAAE,kDAAkD;gBAC3D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,qDAAqD;AAC9C,MAAM,qBAAqB,GAChC,CACE,OAA8B,EAC9B,MAA+B,EAC/B,YAAY,GAAG,IAAI,EACnB,EAAE,CACJ,CAAC,KAAY,EAAE,QAAsC,EAAQ,EAAE;IAC7D,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAdS,QAAA,qBAAqB,yBAc9B;AAEJ;;;;;;GAMG;AACI,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CACpE,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AADjE,QAAA,cAAc,kBACmD;AAE9E;;;;;;GAMG;AACI,MAAM,qBAAqB,GAAG,CACnC,cAAuB,EACU,EAAE,CACnC,OAAO,cAAc,KAAK,QAAQ;IAClC,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,KAAK,SAAS,CAAC,CAAC;AAJnE,QAAA,qBAAqB,yBAI8C;AAEzE,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAAvB,QAAA,IAAI,QAAmB","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { createIdRemapMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n Json,\n JsonRpcParams,\n PendingJsonRpcResponse,\n} from '@metamask/utils';\n\nimport { createRpcWarningMiddleware } from './middleware/createRpcWarningMiddleware';\n\nexport type Maybe<Type> = Partial<Type> | null | undefined;\n\nexport type ConsoleLike = Pick<\n Console,\n 'log' | 'warn' | 'error' | 'debug' | 'info' | 'trace'\n>;\n\n// Constants\n\n// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5\nexport const UUID_V4_REGEX =\n /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;\n\n// https://stackoverflow.com/a/20204811\nexport const FQDN_REGEX =\n /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\\.)+[a-zA-Z]{2,63}$)/u;\n\n// https://stackoverflow.com/a/9523559\nconst POSITIVE_INTEGER_REGEX = /^(\\d*[1-9]\\d*|0)$/u;\n\nexport const EMITTED_NOTIFICATIONS = Object.freeze([\n 'eth_subscription', // per eth-json-rpc-filters/subscriptionManager\n]);\n\n// Utility functions\n\n/**\n * Gets the default middleware for external providers, consisting of an ID\n * remapping middleware and an error middleware.\n *\n * @param logger - The logger to use in the error middleware.\n * @returns An array of @metamask/json-rpc-engine middleware functions.\n */\nexport const getDefaultExternalMiddleware = (logger: ConsoleLike = console) => [\n createIdRemapMiddleware(),\n createErrorMiddleware(logger),\n createRpcWarningMiddleware(logger),\n];\n\n/**\n * A `json-rpc-engine` middleware that logs RPC errors and validates the request\n * method.\n *\n * @param log - The logging API to use.\n * @returns A @metamask/json-rpc-engine middleware function.\n */\nfunction createErrorMiddleware(\n log: ConsoleLike,\n): JsonRpcMiddleware<JsonRpcParams, Json> {\n return (request, response, next) => {\n // json-rpc-engine will terminate the request when it notices this error\n if (typeof request.method !== 'string' || !request.method) {\n response.error = rpcErrors.invalidRequest({\n message: `The request 'method' must be a non-empty string.`,\n data: request,\n });\n }\n\n next((done) => {\n const { error } = response;\n if (!error) {\n return done();\n }\n log.warn(`MetaMask - RPC Error: ${error.message}`, error);\n return done();\n });\n };\n}\n\n// resolve response.result or response, reject errors\nexport const getRpcPromiseCallback =\n (\n resolve: (value?: any) => void,\n reject: (error?: Error) => void,\n unwrapResult = true,\n ) =>\n (error: Error, response: PendingJsonRpcResponse<Json>): void => {\n if (error || response.error) {\n reject(error || response.error);\n } else {\n !unwrapResult || Array.isArray(response)\n ? resolve(response)\n : resolve(response.result);\n }\n };\n\n/**\n * Checks whether the given chain ID is valid, meaning if it is non-empty,\n * '0x'-prefixed string.\n *\n * @param chainId - The chain ID to validate.\n * @returns Whether the given chain ID is valid.\n */\nexport const isValidChainId = (chainId: unknown): chainId is string =>\n Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');\n\n/**\n * Checks whether the given network version is valid, meaning if it is non-empty\n * integer string or the value 'loading'.\n *\n * @param networkVersion - The network version to validate.\n * @returns Whether the given network version is valid.\n */\nexport const isValidNetworkVersion = (\n networkVersion: unknown,\n): networkVersion is string | null =>\n typeof networkVersion === 'string' &&\n (POSITIVE_INTEGER_REGEX.test(networkVersion) || networkVersion === 'loading');\n\nexport const NOOP = () => undefined;\n"]}