otp-gen-agent
Version:
A small and secure one time password (otp) generator for Javascript based on nanoid
1 lines • 4.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/constants.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\nimport {\n ITEM_ALPHABET,\n OTP_LENGTH,\n WEBHOOK_EVENTS,\n} from './constants.js';\n\nexport type WebhookEvent = typeof WEBHOOK_EVENTS[keyof typeof WEBHOOK_EVENTS];\n\nexport interface OtpOptions {\n length?: number;\n chars?: string;\n}\n\nexport interface BulkOtpOptions extends OtpOptions {}\n\nexport type WebhookHandler = (event: WebhookEvent, data: Record<string, unknown>) => void | Promise<void>;\n\nconst nid = customAlphabet(ITEM_ALPHABET, OTP_LENGTH);\n\nlet webhookHandler: WebhookHandler | null = null;\n\nexport const setWebhookHandler = (handler: WebhookHandler): void => {\n if (typeof handler !== 'function') {\n throw new Error('Webhook handler must be a function');\n }\n\n webhookHandler = handler;\n};\n\nconst triggerWebhook = async (event: WebhookEvent, data: Record<string, unknown>): Promise<void> => {\n if (webhookHandler) {\n try {\n await webhookHandler(event, data);\n } catch (error) {\n throw new Error('Error in running Webhook handler');\n }\n }\n};\n\nexport const otpGen = async (): Promise<string> => {\n const otp = nid();\n\n await triggerWebhook(WEBHOOK_EVENTS.OTP_GENERATED, { otp });\n return otp;\n};\n\nexport const customOtpGen = async ({\n length = OTP_LENGTH,\n chars = ITEM_ALPHABET,\n}: OtpOptions = {}): Promise<string> => {\n if (!Number.isInteger(length) || length <= 0) {\n throw new Error('otp length must be greater than 0');\n }\n\n const idGen = customAlphabet(chars, length);\n const otp = idGen();\n\n await triggerWebhook(WEBHOOK_EVENTS.OTP_GENERATED, { otp });\n return otp;\n};\n\nconst YIELD_EVERY = 1000;\n\nconst yieldToEventLoop = () => new Promise<void>(resolve => setTimeout(resolve, 0));\n\nexport const bulkOtpGen = async (count: number = 0, opts: BulkOtpOptions = {}): Promise<string[]> => {\n if (!Number.isInteger(count) || count <= 0) {\n throw new Error('count must be greater than 0');\n }\n\n const { length = OTP_LENGTH, chars = ITEM_ALPHABET } = opts;\n\n if (!Number.isInteger(length) || length <= 0) {\n throw new Error('otp length must be greater than 0');\n }\n\n const idGen = customAlphabet(chars, length);\n const idArr: string[] = new Array(count);\n\n for (let i = 0; i < count; i++) {\n idArr[i] = idGen();\n\n if ((i + 1) % YIELD_EVERY === 0) {\n await yieldToEventLoop();\n }\n }\n\n await triggerWebhook(WEBHOOK_EVENTS.OTP_BULK_GENERATED, { count, otps: idArr });\n return idArr;\n};\n\nexport { WEBHOOK_EVENTS };\n","export const ITEM_ALPHABET = '0123456789';\nexport const OTP_LENGTH = 6;\n\nexport const WEBHOOK_EVENTS = {\n OTP_GENERATED: 'otp-generated',\n OTP_BULK_GENERATED: 'bulk-otp-generated',\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;;;ACAxB,IAAM,gBAAgB;AACtB,IAAM,aAAa;AAEnB,IAAM,iBAAiB;AAAA,EAC5B,eAAe;AAAA,EACf,oBAAoB;AACtB;;;ADYA,IAAM,UAAM,8BAAe,eAAe,UAAU;AAEpD,IAAI,iBAAwC;AAErC,IAAM,oBAAoB,CAAC,YAAkC;AAClE,MAAI,OAAO,YAAY,YAAY;AACjC,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,mBAAiB;AACnB;AAEA,IAAM,iBAAiB,OAAO,OAAqB,SAAiD;AAClG,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,eAAe,OAAO,IAAI;AAAA,IAClC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,EACF;AACF;AAEO,IAAM,SAAS,YAA6B;AACjD,QAAM,MAAM,IAAI;AAEhB,QAAM,eAAe,eAAe,eAAe,EAAE,IAAI,CAAC;AAC1D,SAAO;AACT;AAEO,IAAM,eAAe,OAAO;AAAA,EACjC,SAAS;AAAA,EACT,QAAQ;AACV,IAAgB,CAAC,MAAuB;AACtC,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,YAAQ,8BAAe,OAAO,MAAM;AAC1C,QAAM,MAAM,MAAM;AAElB,QAAM,eAAe,eAAe,eAAe,EAAE,IAAI,CAAC;AAC1D,SAAO;AACT;AAEA,IAAM,cAAc;AAEpB,IAAM,mBAAmB,MAAM,IAAI,QAAc,aAAW,WAAW,SAAS,CAAC,CAAC;AAE3E,IAAM,aAAa,OAAO,QAAgB,GAAG,OAAuB,CAAC,MAAyB;AACnG,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,QAAM,EAAE,SAAS,YAAY,QAAQ,cAAc,IAAI;AAEvD,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,YAAQ,8BAAe,OAAO,MAAM;AAC1C,QAAM,QAAkB,IAAI,MAAM,KAAK;AAEvC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,CAAC,IAAI,MAAM;AAEjB,SAAK,IAAI,KAAK,gBAAgB,GAAG;AAC/B,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,eAAe,eAAe,oBAAoB,EAAE,OAAO,MAAM,MAAM,CAAC;AAC9E,SAAO;AACT;","names":[]}