UNPKG

@elbwalker/stack-firebase

Version:

Firebase stack for walkerOS

1 lines 4.03 kB
{"version":3,"sources":["../src/index.ts","../src/types/stack.ts"],"sourcesContent":["import type { NodeClient } from '@elbwalker/client-node';\nimport type { FirebaseStack } from './types';\nimport { createNodeClient } from '@elbwalker/client-node';\nimport { tryCatchAsync, validateEvent } from '@elbwalker/utils';\nimport { onRequest } from 'firebase-functions/v2/https';\n\n// Types\nexport * from './types';\n\nexport function firebaseStack(\n customConfig: FirebaseStack.PartialConfig = {},\n): FirebaseStack.Instance {\n const config = getConfig(customConfig);\n const { elb, instance } = createNodeClient(config.client);\n\n const push: FirebaseStack.Push = (options) => {\n return pushFn(instance, options);\n };\n\n const stack: FirebaseStack.Instance = {\n config,\n instance,\n elb,\n push,\n };\n\n return stack;\n}\n\nfunction getConfig(\n customConfig: FirebaseStack.PartialConfig = {},\n): FirebaseStack.Config {\n const defaultConfig: FirebaseStack.Config = {\n client: {},\n };\n\n return { ...defaultConfig, ...customConfig };\n}\n\nconst pushFn: NodeClient.PrependInstance<FirebaseStack.Push> = (\n instance,\n options = {},\n) => {\n return onRequest(options, async (req, res) => {\n // ATTENTION! Never process unknown data from the client\n\n // @TODO add a custom response handler\n // @TODO move validation to the client\n await tryCatchAsync(\n async (body: string, config: NodeClient.Config) => {\n const event = validateEvent(JSON.parse(body), config.contracts);\n\n // @TODO what if it's a command?\n if (event.entity === 'walker') return res.send({ status: 'bad boy' });\n\n const result = await instance.push(event);\n\n res.send({\n status: result.status,\n successful: result.successful.length,\n failed: result.failed.length,\n queued: result.queued.length,\n });\n },\n (error) => {\n // Error handling\n\n error = String(error);\n // eslint-disable-next-line no-console\n const onError = instance.config.onError || console.error;\n onError({ error, body: req.body });\n\n // @TODO add a dead letter queue\n\n res.status(418).send({ error });\n },\n )(req.body, instance.config);\n });\n};\n","import type { NodeClient } from '@elbwalker/client-node';\nimport type { HttpsFunction, HttpsOptions } from 'firebase-functions/v2/https';\n\nexport interface Instance {\n config: Config;\n instance: NodeClient.Instance;\n elb: NodeClient.Elb;\n push: Push;\n}\n\nexport type PartialConfig = Partial<Config>;\nexport interface Config {\n client: NodeClient.InitConfig;\n}\n\nexport interface Push {\n (options?: HttpsOptions): HttpsFunction;\n}\n\nexport type PrependInstance<Fn extends (...args: never) => never> = (\n instance: Instance,\n ...args: Parameters<Fn>\n) => ReturnType<Fn>;\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,eAAe,qBAAqB;AAC7C,SAAS,iBAAiB;;;ACJ1B;;;ADSO,SAAS,cACd,eAA4C,CAAC,GACrB;AACxB,QAAM,SAAS,UAAU,YAAY;AACrC,QAAM,EAAE,KAAK,SAAS,IAAI,iBAAiB,OAAO,MAAM;AAExD,QAAM,OAA2B,CAAC,YAAY;AAC5C,WAAO,OAAO,UAAU,OAAO;AAAA,EACjC;AAEA,QAAM,QAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UACP,eAA4C,CAAC,GACvB;AACtB,QAAM,gBAAsC;AAAA,IAC1C,QAAQ,CAAC;AAAA,EACX;AAEA,SAAO,EAAE,GAAG,eAAe,GAAG,aAAa;AAC7C;AAEA,IAAM,SAAyD,CAC7D,UACA,UAAU,CAAC,MACR;AACH,SAAO,UAAU,SAAS,OAAO,KAAK,QAAQ;AAK5C,UAAM;AAAA,MACJ,OAAO,MAAc,WAA8B;AACjD,cAAM,QAAQ,cAAc,KAAK,MAAM,IAAI,GAAG,OAAO,SAAS;AAG9D,YAAI,MAAM,WAAW,SAAU,QAAO,IAAI,KAAK,EAAE,QAAQ,UAAU,CAAC;AAEpE,cAAM,SAAS,MAAM,SAAS,KAAK,KAAK;AAExC,YAAI,KAAK;AAAA,UACP,QAAQ,OAAO;AAAA,UACf,YAAY,OAAO,WAAW;AAAA,UAC9B,QAAQ,OAAO,OAAO;AAAA,UACtB,QAAQ,OAAO,OAAO;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,MACA,CAAC,UAAU;AAGT,gBAAQ,OAAO,KAAK;AAEpB,cAAM,UAAU,SAAS,OAAO,WAAW,QAAQ;AACnD,gBAAQ,EAAE,OAAO,MAAM,IAAI,KAAK,CAAC;AAIjC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC;AAAA,MAChC;AAAA,IACF,EAAE,IAAI,MAAM,SAAS,MAAM;AAAA,EAC7B,CAAC;AACH;","names":[]}