@decaf-ts/integrations 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/integrations.cjs +1 -1
  2. package/docker/azure-blob-compose.yml +21 -0
  3. package/docker/gcs-blob-compose.yml +21 -0
  4. package/docker/ipfs-compose.yml +25 -0
  5. package/docker/minio-compose.yml +25 -0
  6. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +293 -0
  7. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -0
  8. package/lib/cjs/blob/azure/index.cjs +24 -0
  9. package/lib/cjs/blob/azure/index.cjs.map +1 -0
  10. package/lib/cjs/blob/core/BlobErrors.cjs +74 -0
  11. package/lib/cjs/blob/core/BlobErrors.cjs.map +1 -0
  12. package/lib/cjs/blob/core/BlobKey.cjs +37 -0
  13. package/lib/cjs/blob/core/BlobKey.cjs.map +1 -0
  14. package/lib/cjs/blob/core/BlobStoreFactory.cjs +57 -0
  15. package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +1 -0
  16. package/lib/cjs/blob/core/BlobStoreService.cjs +42 -0
  17. package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -0
  18. package/lib/cjs/blob/core/BlobTypes.cjs +4 -0
  19. package/lib/cjs/blob/core/BlobTypes.cjs.map +1 -0
  20. package/lib/cjs/blob/core/BlobValue.cjs +72 -0
  21. package/lib/cjs/blob/core/BlobValue.cjs.map +1 -0
  22. package/lib/cjs/blob/core/index.cjs +29 -0
  23. package/lib/cjs/blob/core/index.cjs.map +1 -0
  24. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +272 -0
  25. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -0
  26. package/lib/cjs/blob/gcp/index.cjs +24 -0
  27. package/lib/cjs/blob/gcp/index.cjs.map +1 -0
  28. package/lib/cjs/blob/index.cjs +25 -0
  29. package/lib/cjs/blob/index.cjs.map +1 -0
  30. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +182 -0
  31. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +1 -0
  32. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +27 -0
  33. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +1 -0
  34. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +35 -0
  35. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +1 -0
  36. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +45 -0
  37. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +1 -0
  38. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +35 -0
  39. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +1 -0
  40. package/lib/cjs/blob/ipfs/index.cjs +28 -0
  41. package/lib/cjs/blob/ipfs/index.cjs.map +1 -0
  42. package/lib/cjs/blob/local/LocalBlobStoreService.cjs +288 -0
  43. package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +1 -0
  44. package/lib/cjs/blob/local/index.cjs +24 -0
  45. package/lib/cjs/blob/local/index.cjs.map +1 -0
  46. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +146 -0
  47. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +1 -0
  48. package/lib/cjs/blob/memory/index.cjs +24 -0
  49. package/lib/cjs/blob/memory/index.cjs.map +1 -0
  50. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +14 -0
  51. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +1 -0
  52. package/lib/cjs/blob/s3/R2BlobStoreService.cjs +14 -0
  53. package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +1 -0
  54. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +322 -0
  55. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -0
  56. package/lib/cjs/blob/s3/index.cjs +26 -0
  57. package/lib/cjs/blob/s3/index.cjs.map +1 -0
  58. package/lib/cjs/docker/DockerComposeService.cjs +3 -3
  59. package/lib/cjs/docker/DockerComposeService.cjs.map +1 -1
  60. package/lib/cjs/docker/index.cjs +1 -1
  61. package/lib/cjs/docker/index.cjs.map +1 -1
  62. package/lib/cjs/index.cjs +4 -4
  63. package/lib/cjs/index.cjs.map +1 -1
  64. package/lib/cjs/keycloak/index.cjs +1 -1
  65. package/lib/cjs/keycloak/index.cjs.map +1 -1
  66. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +1 -1
  67. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +1 -1
  68. package/lib/cjs/keycloak/services/KeycloakClientService.cjs +1 -1
  69. package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +1 -1
  70. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +1 -1
  71. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +1 -1
  72. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +1 -1
  73. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +1 -1
  74. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +1 -1
  75. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +1 -1
  76. package/lib/cjs/keycloak/services/KeycloakService.cjs +1 -1
  77. package/lib/cjs/keycloak/services/KeycloakService.cjs.map +1 -1
  78. package/lib/cjs/keycloak/services/KeycloakUserService.cjs +1 -1
  79. package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +1 -1
  80. package/lib/cjs/keycloak/services/index.cjs +1 -1
  81. package/lib/cjs/keycloak/services/index.cjs.map +1 -1
  82. package/lib/cjs/keycloak/types.cjs +1 -1
  83. package/lib/cjs/keycloak/types.cjs.map +1 -1
  84. package/lib/cjs/kibana/helpers.cjs +1 -1
  85. package/lib/cjs/kibana/helpers.cjs.map +1 -1
  86. package/lib/cjs/kibana/index.cjs +1 -1
  87. package/lib/cjs/kibana/index.cjs.map +1 -1
  88. package/lib/cjs/kibana/services/KibanaAuthService.cjs +1 -1
  89. package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +1 -1
  90. package/lib/cjs/kibana/services/KibanaDashboardService.cjs +1 -1
  91. package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +1 -1
  92. package/lib/cjs/kibana/services/KibanaDataViewService.cjs +1 -1
  93. package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +1 -1
  94. package/lib/cjs/kibana/services/KibanaRoleService.cjs +1 -1
  95. package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +1 -1
  96. package/lib/cjs/kibana/services/KibanaService.cjs +1 -1
  97. package/lib/cjs/kibana/services/KibanaService.cjs.map +1 -1
  98. package/lib/cjs/kibana/services/KibanaSpaceService.cjs +1 -1
  99. package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +1 -1
  100. package/lib/cjs/kibana/services/KibanaUserService.cjs +1 -1
  101. package/lib/cjs/kibana/services/KibanaUserService.cjs.map +1 -1
  102. package/lib/cjs/kibana/services/index.cjs +1 -1
  103. package/lib/cjs/kibana/services/index.cjs.map +1 -1
  104. package/lib/cjs/kibana/types.cjs +1 -1
  105. package/lib/cjs/kibana/types.cjs.map +1 -1
  106. package/lib/cjs/nest/authService.cjs +1 -1
  107. package/lib/cjs/nest/authService.cjs.map +1 -1
  108. package/lib/cjs/nest/index.cjs +1 -1
  109. package/lib/cjs/nest/index.cjs.map +1 -1
  110. package/lib/cjs/nest/keycloakAuthHandler.cjs +1 -1
  111. package/lib/cjs/nest/keycloakAuthHandler.cjs.map +1 -1
  112. package/lib/cjs/nest/keycloakModule.cjs +1 -1
  113. package/lib/cjs/nest/keycloakModule.cjs.map +1 -1
  114. package/lib/cjs/nest/types.cjs +1 -1
  115. package/lib/cjs/nest/types.cjs.map +1 -1
  116. package/lib/cjs/nest/utils.cjs +1 -1
  117. package/lib/cjs/nest/utils.cjs.map +1 -1
  118. package/lib/cjs/secrets/aws/AwsSecretService.cjs +1 -1
  119. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
  120. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +1 -1
  121. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +1 -1
  122. package/lib/cjs/secrets/aws/index.cjs +1 -1
  123. package/lib/cjs/secrets/aws/index.cjs.map +1 -1
  124. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +1 -1
  125. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
  126. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +1 -1
  127. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +1 -1
  128. package/lib/cjs/secrets/azure/index.cjs +1 -1
  129. package/lib/cjs/secrets/azure/index.cjs.map +1 -1
  130. package/lib/cjs/secrets/core/SecretErrors.cjs +1 -1
  131. package/lib/cjs/secrets/core/SecretErrors.cjs.map +1 -1
  132. package/lib/cjs/secrets/core/SecretName.cjs +1 -1
  133. package/lib/cjs/secrets/core/SecretName.cjs.map +1 -1
  134. package/lib/cjs/secrets/core/SecretReference.cjs +1 -1
  135. package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
  136. package/lib/cjs/secrets/core/SecretSerialization.cjs +1 -1
  137. package/lib/cjs/secrets/core/SecretSerialization.cjs.map +1 -1
  138. package/lib/cjs/secrets/core/SecretService.cjs +1 -1
  139. package/lib/cjs/secrets/core/SecretService.cjs.map +1 -1
  140. package/lib/cjs/secrets/core/SecretTypes.cjs +1 -1
  141. package/lib/cjs/secrets/core/SecretTypes.cjs.map +1 -1
  142. package/lib/cjs/secrets/core/index.cjs +1 -1
  143. package/lib/cjs/secrets/core/index.cjs.map +1 -1
  144. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +1 -1
  145. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
  146. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +1 -1
  147. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +1 -1
  148. package/lib/cjs/secrets/gcp/index.cjs +1 -1
  149. package/lib/cjs/secrets/gcp/index.cjs.map +1 -1
  150. package/lib/cjs/secrets/index.cjs +1 -1
  151. package/lib/cjs/secrets/index.cjs.map +1 -1
  152. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +1 -1
  153. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +1 -1
  154. package/lib/cjs/secrets/model/ModelSecretService.cjs +3 -3
  155. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
  156. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +1 -1
  157. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +1 -1
  158. package/lib/cjs/secrets/model/Secret.cjs +1 -1
  159. package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
  160. package/lib/cjs/secrets/model/index.cjs +1 -1
  161. package/lib/cjs/secrets/model/index.cjs.map +1 -1
  162. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +1 -1
  163. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
  164. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +1 -1
  165. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +1 -1
  166. package/lib/cjs/secrets/onepassword/index.cjs +1 -1
  167. package/lib/cjs/secrets/onepassword/index.cjs.map +1 -1
  168. package/lib/cjs/secrets/vault/VaultSecretService.cjs +1 -1
  169. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
  170. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +1 -1
  171. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +1 -1
  172. package/lib/cjs/secrets/vault/index.cjs +1 -1
  173. package/lib/cjs/secrets/vault/index.cjs.map +1 -1
  174. package/lib/cjs/utils.cjs +1 -1
  175. package/lib/cjs/utils.cjs.map +1 -1
  176. package/lib/esm/blob/azure/AzureBlobStoreService.js +288 -0
  177. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -0
  178. package/lib/esm/blob/azure/index.js +7 -0
  179. package/lib/esm/blob/azure/index.js.map +1 -0
  180. package/lib/esm/blob/core/BlobErrors.js +61 -0
  181. package/lib/esm/blob/core/BlobErrors.js.map +1 -0
  182. package/lib/esm/blob/core/BlobKey.js +32 -0
  183. package/lib/esm/blob/core/BlobKey.js.map +1 -0
  184. package/lib/esm/blob/core/BlobStoreFactory.js +52 -0
  185. package/lib/esm/blob/core/BlobStoreFactory.js.map +1 -0
  186. package/lib/esm/blob/core/BlobStoreService.js +37 -0
  187. package/lib/esm/blob/core/BlobStoreService.js.map +1 -0
  188. package/lib/esm/blob/core/BlobTypes.js +2 -0
  189. package/lib/esm/blob/core/BlobTypes.js.map +1 -0
  190. package/lib/esm/blob/core/BlobValue.js +66 -0
  191. package/lib/esm/blob/core/BlobValue.js.map +1 -0
  192. package/lib/esm/blob/core/index.js +12 -0
  193. package/lib/esm/blob/core/index.js.map +1 -0
  194. package/lib/esm/blob/gcp/GcsBlobStoreService.js +267 -0
  195. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -0
  196. package/lib/esm/blob/gcp/index.js +7 -0
  197. package/lib/esm/blob/gcp/index.js.map +1 -0
  198. package/lib/esm/blob/index.js +8 -0
  199. package/lib/esm/blob/index.js.map +1 -0
  200. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +177 -0
  201. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +1 -0
  202. package/lib/esm/blob/ipfs/IpfsKeyIndex.js +23 -0
  203. package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +1 -0
  204. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +30 -0
  205. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +1 -0
  206. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +40 -0
  207. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +1 -0
  208. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +30 -0
  209. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +1 -0
  210. package/lib/esm/blob/ipfs/index.js +11 -0
  211. package/lib/esm/blob/ipfs/index.js.map +1 -0
  212. package/lib/esm/blob/local/LocalBlobStoreService.js +283 -0
  213. package/lib/esm/blob/local/LocalBlobStoreService.js.map +1 -0
  214. package/lib/esm/blob/local/index.js +7 -0
  215. package/lib/esm/blob/local/index.js.map +1 -0
  216. package/lib/esm/blob/memory/MemoryBlobStoreService.js +141 -0
  217. package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +1 -0
  218. package/lib/esm/blob/memory/index.js +7 -0
  219. package/lib/esm/blob/memory/index.js.map +1 -0
  220. package/lib/esm/blob/s3/MinioBlobStoreService.js +9 -0
  221. package/lib/esm/blob/s3/MinioBlobStoreService.js.map +1 -0
  222. package/lib/esm/blob/s3/R2BlobStoreService.js +9 -0
  223. package/lib/esm/blob/s3/R2BlobStoreService.js.map +1 -0
  224. package/lib/esm/blob/s3/S3BlobStoreService.js +317 -0
  225. package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -0
  226. package/lib/esm/blob/s3/index.js +9 -0
  227. package/lib/esm/blob/s3/index.js.map +1 -0
  228. package/lib/esm/docker/DockerComposeService.js +2 -2
  229. package/lib/esm/docker/DockerComposeService.js.map +1 -1
  230. package/lib/esm/index.js +3 -3
  231. package/lib/esm/secrets/model/ModelSecretService.js +1 -1
  232. package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
  233. package/lib/types/blob/azure/AzureBlobStoreService.d.cts +25 -0
  234. package/lib/types/blob/azure/AzureBlobStoreService.d.mts +25 -0
  235. package/lib/types/blob/azure/index.d.cts +6 -0
  236. package/lib/types/blob/azure/index.d.mts +6 -0
  237. package/lib/types/blob/core/BlobErrors.d.cts +14 -0
  238. package/lib/types/blob/core/BlobErrors.d.mts +14 -0
  239. package/lib/types/blob/core/BlobKey.d.cts +9 -0
  240. package/lib/types/blob/core/BlobKey.d.mts +9 -0
  241. package/lib/types/blob/core/BlobStoreFactory.d.cts +5 -0
  242. package/lib/types/blob/core/BlobStoreFactory.d.mts +5 -0
  243. package/lib/types/blob/core/BlobStoreService.d.cts +28 -0
  244. package/lib/types/blob/core/BlobStoreService.d.mts +28 -0
  245. package/lib/types/blob/core/BlobTypes.d.cts +122 -0
  246. package/lib/types/blob/core/BlobTypes.d.mts +122 -0
  247. package/lib/types/blob/core/BlobValue.d.cts +13 -0
  248. package/lib/types/blob/core/BlobValue.d.mts +13 -0
  249. package/lib/types/blob/core/index.d.cts +11 -0
  250. package/lib/types/blob/core/index.d.mts +11 -0
  251. package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +25 -0
  252. package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +25 -0
  253. package/lib/types/blob/gcp/index.d.cts +6 -0
  254. package/lib/types/blob/gcp/index.d.mts +6 -0
  255. package/lib/types/blob/index.d.cts +7 -0
  256. package/lib/types/blob/index.d.mts +7 -0
  257. package/lib/types/blob/ipfs/IpfsBlobStoreService.d.cts +26 -0
  258. package/lib/types/blob/ipfs/IpfsBlobStoreService.d.mts +26 -0
  259. package/lib/types/blob/ipfs/IpfsKeyIndex.d.cts +9 -0
  260. package/lib/types/blob/ipfs/IpfsKeyIndex.d.mts +9 -0
  261. package/lib/types/blob/ipfs/LocalJsonIpfsKeyIndex.d.cts +11 -0
  262. package/lib/types/blob/ipfs/LocalJsonIpfsKeyIndex.d.mts +11 -0
  263. package/lib/types/blob/ipfs/MemoryIpfsKeyIndex.d.cts +15 -0
  264. package/lib/types/blob/ipfs/MemoryIpfsKeyIndex.d.mts +15 -0
  265. package/lib/types/blob/ipfs/PostgresIpfsKeyIndex.d.cts +11 -0
  266. package/lib/types/blob/ipfs/PostgresIpfsKeyIndex.d.mts +11 -0
  267. package/lib/types/blob/ipfs/index.d.cts +10 -0
  268. package/lib/types/blob/ipfs/index.d.mts +10 -0
  269. package/lib/types/blob/local/LocalBlobStoreService.d.cts +30 -0
  270. package/lib/types/blob/local/LocalBlobStoreService.d.mts +30 -0
  271. package/lib/types/blob/local/index.d.cts +6 -0
  272. package/lib/types/blob/local/index.d.mts +6 -0
  273. package/lib/types/blob/memory/MemoryBlobStoreService.d.cts +28 -0
  274. package/lib/types/blob/memory/MemoryBlobStoreService.d.mts +28 -0
  275. package/lib/types/blob/memory/index.d.cts +6 -0
  276. package/lib/types/blob/memory/index.d.mts +6 -0
  277. package/lib/types/blob/s3/MinioBlobStoreService.d.cts +8 -0
  278. package/lib/types/blob/s3/MinioBlobStoreService.d.mts +8 -0
  279. package/lib/types/blob/s3/R2BlobStoreService.d.cts +8 -0
  280. package/lib/types/blob/s3/R2BlobStoreService.d.mts +8 -0
  281. package/lib/types/blob/s3/S3BlobStoreService.d.cts +25 -0
  282. package/lib/types/blob/s3/S3BlobStoreService.d.mts +25 -0
  283. package/lib/types/blob/s3/index.d.cts +8 -0
  284. package/lib/types/blob/s3/index.d.mts +8 -0
  285. package/lib/types/docker/DockerComposeService.d.cts +6 -0
  286. package/lib/types/docker/DockerComposeService.d.mts +6 -0
  287. package/lib/types/index.d.cts +2 -2
  288. package/lib/types/index.d.mts +2 -2
  289. package/package.json +92 -7
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/service
3
+ * @summary IPFS blob store service.
4
+ * @description Blob store backed by an IPFS (Kubo) node. Because the blob API is key/value CRUD-like
5
+ * and IPFS is content-addressed, an IpfsKeyIndex maps logical keys to CIDs.
6
+ */
7
+ import { create as kuboCreate } from "kubo-rpc-client";
8
+ import { UnsupportedError, } from "@decaf-ts/core";
9
+ import { ConflictError, InternalError, NotFoundError, ValidationError, } from "@decaf-ts/db-decorators";
10
+ import { BlobStoreService } from "./../core/BlobStoreService.js";
11
+ import { collectToBuffer, computeSha256, toAsyncIterable } from "./../core/BlobValue.js";
12
+ import { createIpfsKeyIndex } from "./IpfsKeyIndex.js";
13
+ export class IpfsBlobStoreService extends BlobStoreService {
14
+ async initialize(...args) {
15
+ const { log } = (await this.logCtx(args, "initialize", true)).for(this.initialize);
16
+ const config = this.getConfigFromArgs(...args);
17
+ const apiUrl = config.apiUrl || "http://localhost:5001";
18
+ const client = kuboCreate({ url: apiUrl });
19
+ this.index = createIpfsKeyIndex(config.keyIndex);
20
+ this._config = config;
21
+ this._client = client;
22
+ log.verbose(`Initialized IPFS blob store ${config.sourceId}`);
23
+ return { config, client };
24
+ }
25
+ async put(key, value, options = {}, ...args) {
26
+ const { log } = (await this.logCtx(args, "put", true)).for(this.put);
27
+ log.verbose(`Putting blob ${key}`);
28
+ const physicalKey = this.physicalKey(key);
29
+ if (this.config.encryptedOnly && options.metadata?.encrypted !== "true") {
30
+ throw new ValidationError("IPFS blob store requires encrypted payloads");
31
+ }
32
+ if (options.ifNotExists && (await this.has(key))) {
33
+ throw new ConflictError(`Blob already exists: ${key}`);
34
+ }
35
+ const buffer = await collectToBuffer(value);
36
+ if (options.expectedSha256) {
37
+ const sha256 = await computeSha256(buffer);
38
+ if (options.expectedSha256 !== sha256) {
39
+ throw new ValidationError(`Checksum mismatch for ${key}`);
40
+ }
41
+ }
42
+ try {
43
+ const addResult = await this.client.add(buffer);
44
+ const cid = addResult.cid.toString();
45
+ const size = addResult.size;
46
+ if (this.config.pinByDefault !== false) {
47
+ try {
48
+ await this.client.pin.add(cid);
49
+ }
50
+ catch (e) {
51
+ log.silly(`Pin failed for ${cid}: ${e.message}`);
52
+ }
53
+ }
54
+ const metadata = {
55
+ contentLength: size,
56
+ sha256: undefined,
57
+ cid,
58
+ contentType: options.contentType,
59
+ custom: options.metadata,
60
+ };
61
+ await this.index.set(physicalKey, cid, metadata);
62
+ return {
63
+ key,
64
+ uri: `ipfs://${cid}`,
65
+ provider: this.provider,
66
+ sourceId: this.sourceId,
67
+ metadata,
68
+ };
69
+ }
70
+ catch (error) {
71
+ throw this.parseError(error);
72
+ }
73
+ }
74
+ async get(key, options = {}, ...args) {
75
+ const { log } = (await this.logCtx(args, "get", true)).for(this.get);
76
+ log.verbose(`Getting blob ${key}`);
77
+ const physicalKey = this.physicalKey(key);
78
+ const cid = await this.index.get(physicalKey);
79
+ if (!cid) {
80
+ throw new NotFoundError(`Blob not found: ${key}`);
81
+ }
82
+ const metadata = await this.index.stat(physicalKey);
83
+ const catIterable = this.client.cat(cid);
84
+ void options;
85
+ return {
86
+ key,
87
+ value: toAsyncIterable(catIterable),
88
+ uri: `ipfs://${cid}`,
89
+ provider: this.provider,
90
+ sourceId: this.sourceId,
91
+ metadata,
92
+ };
93
+ }
94
+ async has(key, ...args) {
95
+ const { log } = (await this.logCtx(args, "has", true)).for(this.has);
96
+ log.verbose(`Checking blob ${key}`);
97
+ const physicalKey = this.physicalKey(key);
98
+ return Boolean(await this.index.get(physicalKey));
99
+ }
100
+ async stat(key, ...args) {
101
+ const { log } = (await this.logCtx(args, "stat", true)).for(this.stat);
102
+ log.verbose(`Statting blob ${key}`);
103
+ const physicalKey = this.physicalKey(key);
104
+ try {
105
+ return await this.index.stat(physicalKey);
106
+ }
107
+ catch {
108
+ throw new NotFoundError(`Blob not found: ${key}`);
109
+ }
110
+ }
111
+ async delete(key, ...args) {
112
+ const { log } = (await this.logCtx(args, "delete", true)).for(this.delete);
113
+ log.verbose(`Deleting blob ${key}`);
114
+ const physicalKey = this.physicalKey(key);
115
+ const cid = await this.index.get(physicalKey);
116
+ if (cid) {
117
+ try {
118
+ await this.client.pin.rm(cid);
119
+ }
120
+ catch (e) {
121
+ log.silly(`Unpin failed for ${cid}: ${e.message}`);
122
+ }
123
+ }
124
+ await this.index.delete(physicalKey);
125
+ }
126
+ async copy(fromKey, toKey, options = {}, ...args) {
127
+ const { log } = (await this.logCtx(args, "copy", true)).for(this.copy);
128
+ log.verbose(`Copying blob ${fromKey} to ${toKey}`);
129
+ const source = await this.get(fromKey);
130
+ return this.put(toKey, source.value, options);
131
+ }
132
+ async list(options = {}, ...args) {
133
+ const { log } = (await this.logCtx(args, "list", true)).for(this.list);
134
+ log.verbose("Listing blobs");
135
+ const prefix = options.prefix ? this.physicalKey(options.prefix) : undefined;
136
+ return this.index.list(prefix, options.limit, options.cursor);
137
+ }
138
+ async url(key, options = {}, ...args) {
139
+ const { log } = (await this.logCtx(args, "url", true)).for(this.url);
140
+ log.verbose(`Building url for blob ${key}`);
141
+ if (options.operation && options.operation !== "get") {
142
+ throw new UnsupportedError("IPFS does not support PUT urls through this API");
143
+ }
144
+ const physicalKey = this.physicalKey(key);
145
+ const cid = await this.index.get(physicalKey);
146
+ if (!cid) {
147
+ throw new NotFoundError(`Blob not found: ${key}`);
148
+ }
149
+ if (!this.config.gatewayUrl) {
150
+ throw new UnsupportedError("No IPFS gateway configured");
151
+ }
152
+ return {
153
+ url: `${this.config.gatewayUrl.replace(/\/$/, "")}/ipfs/${cid}`,
154
+ method: "GET",
155
+ expiresAt: new Date(Date.now() + (options.expiresInSeconds ?? 300) * 1000),
156
+ };
157
+ }
158
+ parseError(error) {
159
+ const err = error;
160
+ if (err instanceof NotFoundError ||
161
+ err instanceof ConflictError ||
162
+ err instanceof ValidationError ||
163
+ err instanceof InternalError) {
164
+ return err;
165
+ }
166
+ const message = err.message || "Unknown error";
167
+ const lower = message.toLowerCase();
168
+ if (lower.includes("not found") || lower.includes("does not exist")) {
169
+ return new NotFoundError(err);
170
+ }
171
+ if (lower.includes("already exists") || lower.includes("conflict")) {
172
+ return new ConflictError(err);
173
+ }
174
+ return new InternalError(`IPFS error: ${message}`);
175
+ }
176
+ }
177
+ //# sourceMappingURL=IpfsBlobStoreService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpfsBlobStoreService.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/IpfsBlobStoreService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/key-index
3
+ * @summary IPFS key index abstraction.
4
+ * @description Maps logical blob keys to content-addressed CIDs since the blob API is key/value CRUD-like
5
+ * while IPFS is content-addressed.
6
+ */
7
+ import { UnsupportedError } from "@decaf-ts/core";
8
+ import { MemoryIpfsKeyIndex } from "./MemoryIpfsKeyIndex.js";
9
+ import { PostgresIpfsKeyIndex } from "./PostgresIpfsKeyIndex.js";
10
+ import { LocalJsonIpfsKeyIndex } from "./LocalJsonIpfsKeyIndex.js";
11
+ export function createIpfsKeyIndex(config) {
12
+ switch (config.provider) {
13
+ case "memory":
14
+ return new MemoryIpfsKeyIndex();
15
+ case "postgres":
16
+ return new PostgresIpfsKeyIndex(config.connectionRef);
17
+ case "local-json":
18
+ return new LocalJsonIpfsKeyIndex(config.path);
19
+ default:
20
+ throw new UnsupportedError(`Unsupported IPFS key index provider: ${config.provider}`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=IpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/IpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMlD,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,oBAAoB,EAAE,kCAA+B;AAC9D,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAchE,MAAM,UAAU,kBAAkB,CAChC,MAA0B;IAE1B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,KAAK,UAAU;YACb,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC;QACzD,KAAK,YAAY;YACf,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC;QACjD;YACE,MAAM,IAAI,gBAAgB,CACxB,wCAAyC,MAAc,CAAC,QAAQ,EAAE,CACnE,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/local-json-index
3
+ * @summary Local JSON-file-backed IPFS key index (stub).
4
+ * @description Documented placeholder; full file implementation is deferred per the spec.
5
+ */
6
+ import { InternalError } from "@decaf-ts/db-decorators";
7
+ export class LocalJsonIpfsKeyIndex {
8
+ constructor(path) {
9
+ this.path = path;
10
+ if (!path) {
11
+ throw new InternalError("LocalJsonIpfsKeyIndex requires a path");
12
+ }
13
+ }
14
+ async get(key) {
15
+ throw new InternalError(`Implement local JSON IPFS key lookup for ${key} at ${this.path}`);
16
+ }
17
+ async set(key, cid, metadata) {
18
+ throw new InternalError(`Implement local JSON IPFS key set for ${key} (cid=${cid}, metadata=${JSON.stringify(metadata)}) at ${this.path}`);
19
+ }
20
+ async delete(key) {
21
+ throw new InternalError(`Implement local JSON IPFS key delete for ${key} at ${this.path}`);
22
+ }
23
+ async list(prefix, limit, cursor) {
24
+ throw new InternalError(`Implement local JSON IPFS key list (prefix=${prefix}, limit=${limit}, cursor=${cursor}) at ${this.path}`);
25
+ }
26
+ async stat(key) {
27
+ throw new InternalError(`Implement local JSON IPFS key stat for ${key} at ${this.path}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=LocalJsonIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalJsonIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/LocalJsonIpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,OAAO,qBAAqB;IAChC,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,aAAa,CAAC,uCAAuC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,aAAa,CACrB,4CAA4C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,MAAM,IAAI,aAAa,CACrB,yCAAyC,GAAG,SAAS,GAAG,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAClH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,aAAa,CACrB,4CAA4C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAe,EACf,KAAc,EACd,MAAe;QAEf,MAAM,IAAI,aAAa,CACrB,8CAA8C,MAAM,WAAW,KAAK,YAAY,MAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,aAAa,CACrB,0CAA0C,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAChE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ export class MemoryIpfsKeyIndex {
2
+ constructor() {
3
+ this.values = new Map();
4
+ }
5
+ async get(key) {
6
+ return this.values.get(key)?.cid;
7
+ }
8
+ async set(key, cid, metadata) {
9
+ this.values.set(key, {
10
+ cid,
11
+ metadata: { ...metadata, cid },
12
+ });
13
+ }
14
+ async delete(key) {
15
+ this.values.delete(key);
16
+ }
17
+ async list(prefix = "", limit = 1000, cursor) {
18
+ const all = Array.from(this.values.keys())
19
+ .filter((k) => (prefix ? k.startsWith(prefix) : true))
20
+ .sort();
21
+ const startIndex = cursor ? Number(cursor) : 0;
22
+ const slice = all.slice(startIndex, startIndex + limit);
23
+ const nextCursor = startIndex + limit < all.length ? String(startIndex + limit) : undefined;
24
+ return {
25
+ items: slice.map((key) => ({
26
+ key,
27
+ metadata: this.values.get(key)?.metadata,
28
+ })),
29
+ cursor: nextCursor,
30
+ };
31
+ }
32
+ async stat(key) {
33
+ const entry = this.values.get(key);
34
+ if (!entry) {
35
+ throw new Error(`Blob not found: ${key}`);
36
+ }
37
+ return entry.metadata;
38
+ }
39
+ }
40
+ //# sourceMappingURL=MemoryIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/MemoryIpfsKeyIndex.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,kBAAkB;IAA/B;QACmB,WAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAiD1D,CAAC;IA/CC,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;YACnB,GAAG;YACH,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAM,GAAG,EAAE,EACX,KAAK,GAAG,IAAI,EACZ,MAAe;QAEf,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACrD,IAAI,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;QACxD,MAAM,UAAU,GACd,UAAU,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,GAAG;gBACH,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ;aACzC,CAAC,CAAC;YACH,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module integrations/blob/ipfs/postgres-index
3
+ * @summary Postgres-backed IPFS key index (stub).
4
+ * @description Documented placeholder; full SQL implementation is deferred per the spec.
5
+ */
6
+ import { InternalError } from "@decaf-ts/db-decorators";
7
+ export class PostgresIpfsKeyIndex {
8
+ constructor(connectionRef) {
9
+ this.connectionRef = connectionRef;
10
+ if (!connectionRef) {
11
+ throw new InternalError("PostgresIpfsKeyIndex requires a connectionRef");
12
+ }
13
+ }
14
+ async get(key) {
15
+ throw new InternalError(`Implement Postgres IPFS key lookup for ${key}`);
16
+ }
17
+ async set(key, cid, metadata) {
18
+ throw new InternalError(`Implement Postgres IPFS key set for ${key} (cid=${cid}, metadata=${JSON.stringify(metadata)})`);
19
+ }
20
+ async delete(key) {
21
+ throw new InternalError(`Implement Postgres IPFS key delete for ${key}`);
22
+ }
23
+ async list(prefix, limit, cursor) {
24
+ throw new InternalError(`Implement Postgres IPFS key list (prefix=${prefix}, limit=${limit}, cursor=${cursor})`);
25
+ }
26
+ async stat(key) {
27
+ throw new InternalError(`Implement Postgres IPFS key stat for ${key}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=PostgresIpfsKeyIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresIpfsKeyIndex.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/PostgresIpfsKeyIndex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,OAAO,oBAAoB;IAC/B,YAA6B,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;QAChD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,CACrB,+CAA+C,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,aAAa,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,GAAW,EACX,QAAuB;QAEvB,MAAM,IAAI,aAAa,CACrB,uCAAuC,GAAG,SAAS,GAAG,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,aAAa,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAe,EACf,KAAc,EACd,MAAe;QAEf,MAAM,IAAI,aAAa,CACrB,4CAA4C,MAAM,WAAW,KAAK,YAAY,MAAM,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,aAAa,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @module integrations/blob/ipfs
3
+ * @summary IPFS blob store exports.
4
+ * @description Re-exports the IPFS blob store service and key-index abstraction.
5
+ */
6
+ export * from "./IpfsBlobStoreService.js";
7
+ export * from "./IpfsKeyIndex.js";
8
+ export * from "./MemoryIpfsKeyIndex.js";
9
+ export * from "./PostgresIpfsKeyIndex.js";
10
+ export * from "./LocalJsonIpfsKeyIndex.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/blob/ipfs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,0CAAuC;AACvC,kCAA+B;AAC/B,wCAAqC;AACrC,0CAAuC;AACvC,2CAAwC"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * @module integrations/blob/local/service
3
+ * @summary Local filesystem blob store service.
4
+ * @description Filesystem-backed blob store wrapping node:fs with atomic writes and path-traversal protection.
5
+ */
6
+ import { ForbiddenError, UnsupportedError } from "@decaf-ts/core";
7
+ import { ConflictError, InternalError, NotFoundError, ValidationError, } from "@decaf-ts/db-decorators";
8
+ import { getCrypto } from "@decaf-ts/crypto/common";
9
+ import { createReadStream, createWriteStream, promises as fs, } from "fs";
10
+ import { dirname, join, relative, resolve, sep } from "path";
11
+ import { BlobStoreService } from "./../core/BlobStoreService.js";
12
+ export class LocalBlobStoreService extends BlobStoreService {
13
+ async initialize(...args) {
14
+ const config = this.getConfigFromArgs(...args);
15
+ if (!config.rootPath) {
16
+ throw new InternalError("LocalBlobStoreService requires a rootPath");
17
+ }
18
+ await fs.mkdir(config.rootPath, { recursive: true });
19
+ this._config = config;
20
+ this._client = { root: resolve(config.rootPath) };
21
+ return { config, client: this._client };
22
+ }
23
+ async put(key, value, options = {}, ...args) {
24
+ const { log } = (await this.logCtx(args, "put", true)).for(this.put);
25
+ log.verbose(`Putting blob ${key}`);
26
+ const targetPath = this.safePath(key);
27
+ if (options.ifNotExists) {
28
+ try {
29
+ await fs.stat(targetPath);
30
+ throw new ConflictError(`Blob already exists: ${key}`);
31
+ }
32
+ catch (e) {
33
+ if (e.code !== "ENOENT")
34
+ throw e;
35
+ }
36
+ }
37
+ await fs.mkdir(dirname(targetPath), { recursive: true });
38
+ const buffer = await collectToBufferLocal(value);
39
+ const crypto = (await getCrypto());
40
+ const sha256 = crypto.createHash("sha256").update(buffer).digest("hex");
41
+ if (options.expectedSha256 && options.expectedSha256 !== sha256) {
42
+ throw new ValidationError(`Checksum mismatch for ${key}`);
43
+ }
44
+ await this.atomicWrite(targetPath, buffer);
45
+ const metadata = {
46
+ contentType: options.contentType,
47
+ contentLength: buffer.length,
48
+ sha256,
49
+ custom: options.metadata,
50
+ };
51
+ return {
52
+ key,
53
+ uri: this.uri(key, "file"),
54
+ provider: this.provider,
55
+ sourceId: this.sourceId,
56
+ metadata,
57
+ };
58
+ }
59
+ async get(key, options = {}, ...args) {
60
+ const { log } = (await this.logCtx(args, "get", true)).for(this.get);
61
+ log.verbose(`Getting blob ${key}`);
62
+ const targetPath = this.safePath(key);
63
+ const stat = await this.safeStat(targetPath);
64
+ if (!stat) {
65
+ throw new NotFoundError(`Blob not found: ${key}`);
66
+ }
67
+ const stream = createReadStream(targetPath, {
68
+ start: options.range?.start,
69
+ end: options.range?.end,
70
+ });
71
+ const metadata = {
72
+ contentLength: stat.size,
73
+ };
74
+ return {
75
+ key,
76
+ value: streamToAsyncIterable(stream),
77
+ uri: this.uri(key, "file"),
78
+ provider: this.provider,
79
+ sourceId: this.sourceId,
80
+ metadata,
81
+ };
82
+ }
83
+ async has(key, ...args) {
84
+ const { log } = (await this.logCtx(args, "has", true)).for(this.has);
85
+ log.verbose(`Checking blob ${key}`);
86
+ const targetPath = this.safePath(key);
87
+ return Boolean(await this.safeStat(targetPath));
88
+ }
89
+ async stat(key, ...args) {
90
+ const { log } = (await this.logCtx(args, "stat", true)).for(this.stat);
91
+ log.verbose(`Statting blob ${key}`);
92
+ const targetPath = this.safePath(key);
93
+ const stat = await this.safeStat(targetPath);
94
+ if (!stat) {
95
+ throw new NotFoundError(`Blob not found: ${key}`);
96
+ }
97
+ return { contentLength: stat.size };
98
+ }
99
+ async delete(key, ...args) {
100
+ const { log } = (await this.logCtx(args, "delete", true)).for(this.delete);
101
+ log.verbose(`Deleting blob ${key}`);
102
+ const targetPath = this.safePath(key);
103
+ try {
104
+ await fs.unlink(targetPath);
105
+ }
106
+ catch (e) {
107
+ if (e.code !== "ENOENT")
108
+ throw e;
109
+ }
110
+ }
111
+ async copy(fromKey, toKey, options = {}, ...args) {
112
+ const { log } = (await this.logCtx(args, "copy", true)).for(this.copy);
113
+ log.verbose(`Copying blob ${fromKey} to ${toKey}`);
114
+ const fromPath = this.safePath(fromKey);
115
+ const fromStat = await this.safeStat(fromPath);
116
+ if (!fromStat) {
117
+ throw new NotFoundError(`Blob not found: ${fromKey}`);
118
+ }
119
+ const buffer = await fs.readFile(fromPath);
120
+ return this.put(toKey, buffer, options);
121
+ }
122
+ async list(options = {}, ...args) {
123
+ const { log } = (await this.logCtx(args, "list", true)).for(this.list);
124
+ log.verbose("Listing blobs");
125
+ const prefix = options.prefix ? this.physicalKey(options.prefix) : "";
126
+ const root = this.client.root;
127
+ const baseDir = prefix ? join(root, prefix) : root;
128
+ const allFiles = [];
129
+ await walkDir(baseDir, allFiles);
130
+ const keys = allFiles
131
+ .map((f) => {
132
+ const rel = relative(root, f).split(sep).join("/");
133
+ return prefix ? rel : rel;
134
+ })
135
+ .filter((k) => (prefix ? k.startsWith(prefix) : true))
136
+ .sort();
137
+ const limit = options.limit ?? 1000;
138
+ const startIndex = options.cursor ? Number(options.cursor) : 0;
139
+ const slice = keys.slice(startIndex, startIndex + limit);
140
+ const nextCursor = startIndex + limit < keys.length
141
+ ? String(startIndex + limit)
142
+ : undefined;
143
+ return {
144
+ items: slice.map((k) => ({ key: k })),
145
+ cursor: nextCursor,
146
+ };
147
+ }
148
+ async url(key, options = {}, ...args) {
149
+ const { log } = (await this.logCtx(args, "url", true)).for(this.url);
150
+ log.verbose(`Building url for blob ${key}`);
151
+ if (options.operation && options.operation !== "get") {
152
+ throw new UnsupportedError("Local blob store does not support PUT urls");
153
+ }
154
+ return {
155
+ url: this.uri(key, "file"),
156
+ method: "GET",
157
+ expiresAt: new Date(Date.now() + (options.expiresInSeconds ?? 300) * 1000),
158
+ };
159
+ }
160
+ parseError(error) {
161
+ const err = error;
162
+ if (err instanceof NotFoundError ||
163
+ err instanceof ConflictError ||
164
+ err instanceof ValidationError ||
165
+ err instanceof InternalError) {
166
+ return err;
167
+ }
168
+ const message = err.message || "Unknown error";
169
+ const lower = message.toLowerCase();
170
+ const code = err.code;
171
+ if (code === "ENOENT" || lower.includes("not found")) {
172
+ return new NotFoundError(err);
173
+ }
174
+ if (code === "EEXIST" || lower.includes("already exists")) {
175
+ return new ConflictError(err);
176
+ }
177
+ if (code === "EACCES" || code === "EPERM" || lower.includes("permission")) {
178
+ return new ForbiddenError(err);
179
+ }
180
+ if (code === "ENAMETOOLONG" || lower.includes("invalid")) {
181
+ return new ValidationError(err);
182
+ }
183
+ return new InternalError(err);
184
+ }
185
+ safePath(key) {
186
+ const physical = this.physicalKey(key);
187
+ const root = this.client.root;
188
+ const target = resolve(root, physical);
189
+ const rel = relative(root, target);
190
+ if (rel.startsWith("..") || rel === "" || rel === "." || rel.startsWith(`..${sep}`)) {
191
+ throw new ValidationError(`Blob key escapes root path: ${key}`);
192
+ }
193
+ return target;
194
+ }
195
+ async safeStat(path) {
196
+ try {
197
+ const stat = await fs.stat(path);
198
+ if (stat.isFile())
199
+ return { size: stat.size };
200
+ return undefined;
201
+ }
202
+ catch (e) {
203
+ if (e.code === "ENOENT")
204
+ return undefined;
205
+ throw e;
206
+ }
207
+ }
208
+ async atomicWrite(targetPath, buffer) {
209
+ const crypto = (await getCrypto());
210
+ const tmpPath = `${targetPath}.${crypto.randomBytes(6).toString("hex")}.tmp`;
211
+ const stream = createWriteStream(tmpPath);
212
+ await new Promise((resolve, reject) => {
213
+ stream.on("error", reject);
214
+ stream.on("finish", () => resolve());
215
+ stream.end(buffer);
216
+ });
217
+ try {
218
+ await fs.rename(tmpPath, targetPath);
219
+ }
220
+ catch (e) {
221
+ try {
222
+ await fs.unlink(tmpPath);
223
+ }
224
+ catch {
225
+ /* ignore */
226
+ }
227
+ throw e;
228
+ }
229
+ }
230
+ }
231
+ async function collectToBufferLocal(value) {
232
+ if (value instanceof Uint8Array)
233
+ return Buffer.from(value);
234
+ if (value instanceof Buffer)
235
+ return value;
236
+ if (typeof value?.[Symbol.asyncIterator] === "function") {
237
+ const chunks = [];
238
+ for await (const chunk of value) {
239
+ chunks.push(Buffer.from(chunk));
240
+ }
241
+ return Buffer.concat(chunks);
242
+ }
243
+ if (typeof value?.getReader === "function") {
244
+ const reader = value.getReader();
245
+ const chunks = [];
246
+ let result = await reader.read();
247
+ while (!result.done) {
248
+ chunks.push(Buffer.from(result.value));
249
+ result = await reader.read();
250
+ }
251
+ return Buffer.concat(chunks);
252
+ }
253
+ throw new ValidationError(`Unsupported blob value type: ${typeof value}`);
254
+ }
255
+ async function* streamToAsyncIterable(stream) {
256
+ for await (const chunk of stream) {
257
+ yield chunk;
258
+ }
259
+ }
260
+ async function walkDir(dir, acc) {
261
+ let entries;
262
+ try {
263
+ entries = await fs.readdir(dir);
264
+ }
265
+ catch (e) {
266
+ if (e.code === "ENOENT")
267
+ return;
268
+ throw e;
269
+ }
270
+ for (const entry of entries) {
271
+ if (entry.endsWith(".tmp"))
272
+ continue;
273
+ const full = join(dir, entry);
274
+ const stat = await fs.stat(full);
275
+ if (stat.isDirectory()) {
276
+ await walkDir(full, acc);
277
+ }
278
+ else {
279
+ acc.push(full);
280
+ }
281
+ }
282
+ }
283
+ //# sourceMappingURL=LocalBlobStoreService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalBlobStoreService.js","sourceRoot":"","sources":["../../../../src/blob/local/LocalBlobStoreService.ts"],"names":[],"mappings":"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"}