{"version":3,"sources":["../../../src/instance/index.ts"],"names":["#hooks","Instance","#instance","settings","pino","id","#id","EquippedError","input","v","cachePipe","jobsPipe","dbPipe","serverTypePipe","runHooks","error","envValidity"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/instance/index.min.cjs","sourcesContent":["import pino, { type Logger } from 'pino'\nimport { ulid } from 'ulid'\nimport { type ConditionalObjectKeys, type Pipe, type PipeInput, v } from 'valleyed'\n\nimport { EquippedError } from '../errors'\nimport { type HookCb, type HookEvent, type HookRecord, runHooks } from './hooks'\nimport {\n\tcachePipe,\n\ttype CacheTypes,\n\tdbPipe,\n\ttype DbTypes,\n\teventBusPipe,\n\ttype EventBusTypes,\n\tinstanceSettingsPipe,\n\tjobsPipe,\n\ttype JobTypes,\n\tserverTypePipe,\n\ttype ServerTypes,\n\ttype Settings,\n\ttype SettingsInput,\n} from './settings'\n\nexport class Instance {\n\tstatic #id: string | undefined\n\tstatic #instance: Instance\n\tstatic #hooks: Partial<Record<HookEvent, HookRecord[]>> = {}\n\treadonly settings: Readonly<Settings>\n\treadonly log: Logger<never>\n\n\tprivate constructor(settings: Settings) {\n\t\tInstance.#instance = this\n\t\tthis.settings = Object.freeze(settings)\n\t\tthis.log = pino<never>({\n\t\t\tlevel: this.settings.log.level,\n\t\t\tserializers: {\n\t\t\t\terr: pino.stdSerializers.err,\n\t\t\t\terror: pino.stdSerializers.err,\n\t\t\t\treq: pino.stdSerializers.req,\n\t\t\t\tres: pino.stdSerializers.res,\n\t\t\t},\n\t\t\tmixin: () => ({\n\t\t\t\tinstanceId: Instance.#id,\n\t\t\t}),\n\t\t})\n\t\tInstance.#registerOnExitHandler()\n\t}\n\n\talias(id: string) {\n\t\tif (Instance.#id !== undefined) return Instance.crash(new EquippedError('Instance already has an alias', {}))\n\t\tInstance.#id = id\n\t}\n\n\tget id() {\n\t\tif (Instance.#id === undefined) return Instance.crash(new EquippedError('Instance doesnt have an alias yet', {}))\n\t\treturn Instance.#id\n\t}\n\n\tgetScopedName(name: string, key = '.') {\n\t\treturn [this.settings.app.name, name].join(key)\n\t}\n\n\tcreateCache<T extends keyof CacheTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof cachePipe>>, { type: T }>>) {\n\t\treturn v.assert(cachePipe(), input) as CacheTypes[T]\n\t}\n\n\tcreateJobs<T extends keyof JobTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof jobsPipe>>, { type: T }>>) {\n\t\treturn v.assert(jobsPipe(), input) as JobTypes[T]\n\t}\n\n\tcreateEventBus<T extends keyof EventBusTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof eventBusPipe>>, { type: T }>>) {\n\t\treturn v.assert(eventBusPipe(), input) as EventBusTypes[T]\n\t}\n\n\tcreateDb<T extends keyof DbTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof dbPipe>>, { db: { type: T } }>>) {\n\t\treturn v.assert(dbPipe(), input) as DbTypes[T]\n\t}\n\n\tcreateServer<T extends keyof ServerTypes>(input: ConditionalObjectKeys<Extract<PipeInput<ReturnType<typeof serverTypePipe>>, { type: T }>>) {\n\t\treturn v.assert(serverTypePipe(), input) as ServerTypes[T]\n\t}\n\n\tasync start() {\n\t\ttry {\n\t\t\tawait runHooks(Instance.#hooks['setup'] ?? [])\n\t\t\tawait runHooks(Instance.#hooks['start'] ?? [])\n\t\t} catch (error) {\n\t\t\tInstance.crash(new EquippedError(`Error starting instance`, {}, error))\n\t\t}\n\t}\n\n\tstatic envs<E extends object>(envsPipe: Pipe<unknown, E>): E {\n\t\tconst envValidity = v.validate(envsPipe, process.env)\n\t\tif (!envValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Environment variables are not valid\\n${envValidity.error.toString()}`, {\n\t\t\t\t\tmessages: envValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn envValidity.value\n\t}\n\n\tstatic create(settings: SettingsInput) {\n\t\tif (Instance.#instance) return Instance.crash(new EquippedError('Instance has been initialized already', {}))\n\t\tconst settingsValidity = v.validate(instanceSettingsPipe(), settings)\n\t\tif (!settingsValidity.valid) {\n\t\t\tInstance.crash(\n\t\t\t\tnew EquippedError(`Settings are not valid\\n${settingsValidity.error.toString()}`, {\n\t\t\t\t\tmessages: settingsValidity.error.messages,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t\treturn new Instance(settingsValidity.value)\n\t}\n\n\tstatic get() {\n\t\tif (!Instance.#instance)\n\t\t\treturn Instance.crash(\n\t\t\t\tnew EquippedError('Has not been initialized. Make sure an instance has been created before you get an instance', {}),\n\t\t\t)\n\t\treturn Instance.#instance\n\t}\n\n\tstatic on(event: HookEvent, cb: HookCb, order: number) {\n\t\tInstance.#hooks[event] ??= []\n\t\tInstance.#hooks[event].push({ cb, order })\n\t}\n\n\tstatic #registerOnExitHandler() {\n\t\tconst signals = {\n\t\t\tSIGHUP: 1,\n\t\t\tSIGINT: 2,\n\t\t\tSIGTERM: 15,\n\t\t}\n\n\t\tObject.entries(signals).forEach(([signal, code]) => {\n\t\t\tprocess.on(signal, async () => {\n\t\t\t\tawait runHooks(Instance.#hooks['close'] ?? [], () => {})\n\t\t\t\tprocess.exit(128 + code)\n\t\t\t})\n\t\t})\n\t}\n\n\tstatic resolveBeforeCrash<T>(cb: () => Promise<T>) {\n\t\tconst value = cb()\n\t\tInstance.on('close', async () => await value, 10)\n\t\treturn value\n\t}\n\n\tstatic crash(error: EquippedError): never {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(error)\n\t\tprocess.exit(1)\n\t}\n\n\tstatic createId(opts?: { prefix?: string; time?: Date }) {\n\t\treturn `${opts?.prefix ?? ''}${ulid(opts?.time?.getTime())}`\n\t}\n}\n"]}