resource.node.ts 2.5 KB

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