resource.node.ts 2.4 KB

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