UNPKG

5.39 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signatur/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from 'crypto';\n\nimport type {\n DecodedData,\n SignaturOptions,\n SignaturReturnError,\n UnknownRecord,\n} from './custom_typings.js';\n\nexport class SignaturError extends Error {\n public type: string;\n\n constructor(type: string, message: string) {\n super();\n\n this.name = 'SignaturError';\n this.message = message;\n this.type = type;\n }\n\n public toJSON(): SignaturReturnError {\n return {\n error: {\n type: this.type,\n message: this.message,\n },\n };\n }\n}\n\nfunction urlSafeBase64(s: string) {\n return s.replace(/\\+/gi, '-').replace(/\\//gi, '_').replace(/=/gi, '');\n}\n\nexport function signSync<T = UnknownRecord>(\n data: T,\n secret: string,\n options?: SignaturOptions\n) {\n const { separator = '.' }: SignaturOptions = options || {};\n\n if (null == data) {\n throw new TypeError(\n `Expected 'data' to be defined, but received '${JSON.stringify(data)}'`);\n }\n\n if ('string' !== typeof(secret) || !secret.length) {\n throw new TypeError(`Expected 'secret' to be defined, but received '${secret}'`);\n }\n\n const stringData = JSON.stringify({ data });\n const encoded = Buffer.from(stringData, 'utf8').toString('base64');\n const signature = createHmac('sha256', secret).update(stringData).digest('base64');\n\n return urlSafeBase64(`${encoded}${separator}${signature}`);\n}\n\nexport function unsignSync<T = UnknownRecord>(\n signature: string,\n secret: string,\n options?: SignaturOptions\n): T {\n const { separator = '.' } = options || {} as SignaturOptions;\n\n if ('string' !== typeof(signature) || !signature.length) {\n throw new TypeError(`Expected 'signature' to be defined, but received '${signature}'`);\n }\n\n if ('string' !== typeof(secret) || !secret.length) {\n throw new TypeError(`Expected 'secret' to be defined, but received '${secret}'`);\n }\n\n const [hash, enc] = signature.split(separator, 2);\n const decoded = Buffer.from(\n (hash + '==='.slice((hash.length + 3) % 4))\n .replace(/\\-/gi, '+')\n .replace(/_/gi, '/'), 'base64')\n .toString('utf8');\n const signedDecoded = urlSafeBase64(\n createHmac('sha256', secret).update(decoded).digest('base64'));\n\n if (enc !== signedDecoded) {\n throw new SignaturError('invalid_signature', 'Signature not match');\n }\n\n return (JSON.parse(decoded) as DecodedData<T>).data;\n}\n\nexport async function sign<T = UnknownRecord>(\n data: T,\n secret: string,\n options?: SignaturOptions\n) {\n return signSync<T>(data, secret, options);\n}\n\nexport async function unsign<T = UnknownRecord>(\n signature: string,\n secret: string,\n options?: SignaturOptions\n): Promise<T> {\n return unsignSync<T>(signature, secret, options);\n}\n"]}
\No newline at end of file