UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 3.06 kB
{"version":3,"file":"namespaces.mjs","names":[],"sources":["../../../src/libs/kv/namespaces.ts"],"sourcesContent":["import { bytesToHex, randomBytes } from \"@noble/hashes/utils.js\";\nimport type { ServiceContext } from \"../../utils/services/types.js\";\nimport cacheKeys from \"./cache-keys.js\";\n\nconst DEFAULT_NAMESPACE_TOKEN = \"0\";\n\nconst createNamespaceToken = () => {\n\treturn `${Date.now()}:${bytesToHex(randomBytes(16))}`;\n};\n\n/**\n * Returns the current token for a namespace.\n * Uses a stable default token when the namespace has not been initialized.\n */\nexport const getNamespaceToken = async (\n\tcontext: ServiceContext,\n\tnamespace: string,\n) => {\n\tconst token = await context.kv.get<string>(context, {\n\t\tkey: cacheKeys.namespace.token(namespace),\n\t\thash: true,\n\t});\n\n\treturn token ?? DEFAULT_NAMESPACE_TOKEN;\n};\n\n/**\n * Returns current tokens for multiple namespaces in a single call.\n */\nexport const getNamespaceTokens = async (\n\tcontext: ServiceContext,\n\tnamespaces: string[],\n) => {\n\tconst uniqueNamespaces = Array.from(new Set(namespaces));\n\tconst tokens = await context.kv.getMany<string>(context, {\n\t\tkeys: uniqueNamespaces.map((namespace) => ({\n\t\t\tkey: cacheKeys.namespace.token(namespace),\n\t\t\thash: true,\n\t\t})),\n\t});\n\tconst tokenPairs = uniqueNamespaces.map((namespace, index) => [\n\t\tnamespace,\n\t\ttokens[index]?.value ?? DEFAULT_NAMESPACE_TOKEN,\n\t]);\n\n\treturn Object.fromEntries(tokenPairs);\n};\n\n/**\n * Rotates a namespace token so any keys derived from that token become stale.\n */\nexport const invalidateNamespace = async (\n\tcontext: ServiceContext,\n\tnamespace: string,\n) => {\n\tawait context.kv.set(context, {\n\t\tkey: cacheKeys.namespace.token(namespace),\n\t\tvalue: createNamespaceToken(),\n\t\thash: true,\n\t});\n};\n\n/**\n * Rotates tokens for multiple namespaces.\n */\nexport const invalidateNamespaces = async (\n\tcontext: ServiceContext,\n\tnamespaces: string[],\n) => {\n\tawait context.kv.setMany(context, {\n\t\titems: Array.from(new Set(namespaces)).map((namespace) => ({\n\t\t\tkey: cacheKeys.namespace.token(namespace),\n\t\t\tvalue: createNamespaceToken(),\n\t\t\thash: true,\n\t\t})),\n\t});\n};\n"],"mappings":"qGAIA,MAEM,MACE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAW,EAAY,EAAE,CAAC,IAOtC,EAAoB,MAChC,EACA,IAOO,MALa,EAAQ,GAAG,IAAY,EAAS,CACnD,IAAK,EAAU,UAAU,MAAM,CAAS,EACxC,KAAM,EACP,CAAC,GAEe,IAMJ,EAAqB,MACjC,EACA,IACI,CACJ,IAAM,EAAmB,MAAM,KAAK,IAAI,IAAI,CAAU,CAAC,EACjD,EAAS,MAAM,EAAQ,GAAG,QAAgB,EAAS,CACxD,KAAM,EAAiB,IAAK,IAAe,CAC1C,IAAK,EAAU,UAAU,MAAM,CAAS,EACxC,KAAM,EACP,EAAE,CACH,CAAC,EACK,EAAa,EAAiB,KAAK,EAAW,IAAU,CAC7D,EACA,EAAO,EAAM,EAAE,OAAS,GACzB,CAAC,EAED,OAAO,OAAO,YAAY,CAAU,CACrC,EAKa,EAAsB,MAClC,EACA,IACI,CACJ,MAAM,EAAQ,GAAG,IAAI,EAAS,CAC7B,IAAK,EAAU,UAAU,MAAM,CAAS,EACxC,MAAO,EAAqB,EAC5B,KAAM,EACP,CAAC,CACF,EAKa,EAAuB,MACnC,EACA,IACI,CACJ,MAAM,EAAQ,GAAG,QAAQ,EAAS,CACjC,MAAO,MAAM,KAAK,IAAI,IAAI,CAAU,CAAC,CAAC,CAAC,IAAK,IAAe,CAC1D,IAAK,EAAU,UAAU,MAAM,CAAS,EACxC,MAAO,EAAqB,EAC5B,KAAM,EACP,EAAE,CACH,CAAC,CACF"}