resource.node.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import type { KVNamespaceListOptions, KVNamespaceListResult, KVNamespacePutOptions } from "@cloudflare/workers-types"
  2. import { Resource as ResourceBase } from "sst"
  3. import Cloudflare from "cloudflare"
  4. export const Resource = new Proxy(
  5. {},
  6. {
  7. get(_target, prop: keyof typeof ResourceBase) {
  8. const value = ResourceBase[prop]
  9. // @ts-ignore
  10. if ("type" in value && value.type === "sst.cloudflare.Kv") {
  11. const client = new Cloudflare({
  12. apiToken: ResourceBase.CLOUDFLARE_API_TOKEN.value,
  13. })
  14. // @ts-ignore
  15. const namespaceId = value.namespaceId
  16. const accountId = ResourceBase.CLOUDFLARE_DEFAULT_ACCOUNT_ID.value
  17. return {
  18. get: (k: string | string[]) => {
  19. const isMulti = Array.isArray(k)
  20. return client.kv.namespaces
  21. .bulkGet(namespaceId, {
  22. keys: Array.isArray(k) ? k : [k],
  23. account_id: accountId,
  24. })
  25. .then((result) => (isMulti ? new Map(Object.entries(result?.values ?? {})) : result?.values?.[k]))
  26. },
  27. put: (k: string, v: string, opts?: KVNamespacePutOptions) =>
  28. client.kv.namespaces.values.update(namespaceId, k, {
  29. account_id: accountId,
  30. value: v,
  31. expiration: opts?.expiration,
  32. expiration_ttl: opts?.expirationTtl,
  33. metadata: opts?.metadata,
  34. }),
  35. delete: (k: string) =>
  36. client.kv.namespaces.values.delete(namespaceId, k, {
  37. account_id: accountId,
  38. }),
  39. list: (opts?: KVNamespaceListOptions): Promise<KVNamespaceListResult<unknown, string>> =>
  40. client.kv.namespaces.keys
  41. .list(namespaceId, {
  42. account_id: accountId,
  43. prefix: opts?.prefix ?? undefined,
  44. })
  45. .then((result) => {
  46. return {
  47. keys: result.result,
  48. list_complete: true,
  49. cacheStatus: null,
  50. }
  51. }),
  52. }
  53. }
  54. return value
  55. },
  56. },
  57. ) as Record<string, any>