@lumeweb/pinner 0.0.1 → 0.1.0

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 (186) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +690 -28
  3. package/dist/cjs/_virtual/rolldown_runtime.cjs +29 -0
  4. package/dist/cjs/adapters/pinata/adapter.cjs +88 -0
  5. package/dist/cjs/adapters/pinata/adapter.cjs.map +1 -0
  6. package/dist/cjs/adapters/pinata/adapter.d.cts +35 -0
  7. package/dist/cjs/adapters/pinata/builder.cjs +194 -0
  8. package/dist/cjs/adapters/pinata/builder.cjs.map +1 -0
  9. package/dist/cjs/adapters/pinata/index.cjs +3 -0
  10. package/dist/cjs/adapters/pinata/list-builder.cjs +52 -0
  11. package/dist/cjs/adapters/pinata/list-builder.cjs.map +1 -0
  12. package/dist/cjs/blockstore/index.cjs +2 -0
  13. package/dist/cjs/blockstore/unstorage-base.cjs +240 -0
  14. package/dist/cjs/blockstore/unstorage-base.cjs.map +1 -0
  15. package/dist/cjs/blockstore/unstorage-base.d.cts +23 -0
  16. package/dist/cjs/blockstore/unstorage.cjs +39 -0
  17. package/dist/cjs/blockstore/unstorage.cjs.map +1 -0
  18. package/dist/cjs/blockstore/unstorage.d.cts +36 -0
  19. package/dist/cjs/config.d.cts +51 -0
  20. package/dist/cjs/encoder/base64.cjs +38 -0
  21. package/dist/cjs/encoder/base64.cjs.map +1 -0
  22. package/dist/cjs/encoder/csv/csv-formatter.cjs +81 -0
  23. package/dist/cjs/encoder/csv/csv-formatter.cjs.map +1 -0
  24. package/dist/cjs/encoder/csv/field-formatter.cjs +76 -0
  25. package/dist/cjs/encoder/csv/field-formatter.cjs.map +1 -0
  26. package/dist/cjs/encoder/csv/row-formatter.cjs +159 -0
  27. package/dist/cjs/encoder/csv/row-formatter.cjs.map +1 -0
  28. package/dist/cjs/encoder/csv.cjs +44 -0
  29. package/dist/cjs/encoder/csv.cjs.map +1 -0
  30. package/dist/cjs/encoder/error.cjs +19 -0
  31. package/dist/cjs/encoder/error.cjs.map +1 -0
  32. package/dist/cjs/encoder/index.cjs +6 -0
  33. package/dist/cjs/encoder/json.cjs +36 -0
  34. package/dist/cjs/encoder/json.cjs.map +1 -0
  35. package/dist/cjs/encoder/text.cjs +35 -0
  36. package/dist/cjs/encoder/text.cjs.map +1 -0
  37. package/dist/cjs/encoder/url.cjs +39 -0
  38. package/dist/cjs/encoder/url.cjs.map +1 -0
  39. package/dist/cjs/errors/index.cjs +104 -0
  40. package/dist/cjs/errors/index.cjs.map +1 -0
  41. package/dist/cjs/errors/index.d.cts +47 -0
  42. package/dist/cjs/index.cjs +42 -0
  43. package/dist/cjs/index.d.cts +14 -0
  44. package/dist/cjs/pin/client.cjs +96 -0
  45. package/dist/cjs/pin/client.cjs.map +1 -0
  46. package/dist/cjs/pin/index.cjs +1 -0
  47. package/dist/cjs/pinner.cjs +126 -0
  48. package/dist/cjs/pinner.cjs.map +1 -0
  49. package/dist/cjs/pinner.d.cts +77 -0
  50. package/dist/cjs/types/constants.cjs +34 -0
  51. package/dist/cjs/types/constants.cjs.map +1 -0
  52. package/dist/cjs/types/mime-types.cjs +11 -0
  53. package/dist/cjs/types/mime-types.cjs.map +1 -0
  54. package/dist/cjs/types/mime-types.d.cts +7 -0
  55. package/dist/cjs/types/pin.d.cts +74 -0
  56. package/dist/cjs/types/pinata.d.cts +99 -0
  57. package/dist/cjs/types/type-guards.cjs +20 -0
  58. package/dist/cjs/types/type-guards.cjs.map +1 -0
  59. package/dist/cjs/types/type-guards.d.cts +15 -0
  60. package/dist/cjs/types/upload.cjs +18 -0
  61. package/dist/cjs/types/upload.cjs.map +1 -0
  62. package/dist/cjs/types/upload.d.cts +189 -0
  63. package/dist/cjs/upload/base-upload.cjs +135 -0
  64. package/dist/cjs/upload/base-upload.cjs.map +1 -0
  65. package/dist/cjs/upload/builder.cjs +174 -0
  66. package/dist/cjs/upload/builder.cjs.map +1 -0
  67. package/dist/cjs/upload/builder.d.cts +60 -0
  68. package/dist/cjs/upload/car.cjs +129 -0
  69. package/dist/cjs/upload/car.cjs.map +1 -0
  70. package/dist/cjs/upload/car.d.cts +19 -0
  71. package/dist/cjs/upload/constants.cjs +9 -0
  72. package/dist/cjs/upload/constants.cjs.map +1 -0
  73. package/dist/cjs/upload/index.cjs +8 -0
  74. package/dist/cjs/upload/manager.cjs +249 -0
  75. package/dist/cjs/upload/manager.cjs.map +1 -0
  76. package/dist/cjs/upload/manager.d.cts +35 -0
  77. package/dist/cjs/upload/normalize.cjs +28 -0
  78. package/dist/cjs/upload/normalize.cjs.map +1 -0
  79. package/dist/cjs/upload/tus-upload.cjs +74 -0
  80. package/dist/cjs/upload/tus-upload.cjs.map +1 -0
  81. package/dist/cjs/upload/xhr-upload.cjs +41 -0
  82. package/dist/cjs/upload/xhr-upload.cjs.map +1 -0
  83. package/dist/cjs/utils/env.cjs +12 -0
  84. package/dist/cjs/utils/env.cjs.map +1 -0
  85. package/dist/cjs/utils/stream.cjs +141 -0
  86. package/dist/cjs/utils/stream.cjs.map +1 -0
  87. package/dist/cjs/utils/stream.d.cts +23 -0
  88. package/dist/cjs/utils/tus-patch.cjs +50 -0
  89. package/dist/cjs/utils/tus-patch.cjs.map +1 -0
  90. package/dist/cjs/utils/validation.cjs +62 -0
  91. package/dist/cjs/utils/validation.cjs.map +1 -0
  92. package/dist/esm/_virtual/rolldown_runtime.js +8 -0
  93. package/dist/esm/adapters/pinata/adapter.d.ts +35 -0
  94. package/dist/esm/adapters/pinata/adapter.js +87 -0
  95. package/dist/esm/adapters/pinata/adapter.js.map +1 -0
  96. package/dist/esm/adapters/pinata/builder.d.ts +1 -0
  97. package/dist/esm/adapters/pinata/builder.js +187 -0
  98. package/dist/esm/adapters/pinata/builder.js.map +1 -0
  99. package/dist/esm/adapters/pinata/index.d.ts +4 -0
  100. package/dist/esm/adapters/pinata/index.js +3 -0
  101. package/dist/esm/adapters/pinata/list-builder.d.ts +1 -0
  102. package/dist/esm/adapters/pinata/list-builder.js +51 -0
  103. package/dist/esm/adapters/pinata/list-builder.js.map +1 -0
  104. package/dist/esm/blockstore/index.d.ts +2 -0
  105. package/dist/esm/blockstore/index.js +2 -0
  106. package/dist/esm/blockstore/unstorage-base.d.ts +23 -0
  107. package/dist/esm/blockstore/unstorage-base.js +231 -0
  108. package/dist/esm/blockstore/unstorage-base.js.map +1 -0
  109. package/dist/esm/blockstore/unstorage.d.ts +36 -0
  110. package/dist/esm/blockstore/unstorage.js +38 -0
  111. package/dist/esm/blockstore/unstorage.js.map +1 -0
  112. package/dist/esm/config.d.ts +51 -0
  113. package/dist/esm/encoder/base64.js +37 -0
  114. package/dist/esm/encoder/base64.js.map +1 -0
  115. package/dist/esm/encoder/csv/csv-formatter.js +81 -0
  116. package/dist/esm/encoder/csv/csv-formatter.js.map +1 -0
  117. package/dist/esm/encoder/csv/field-formatter.js +75 -0
  118. package/dist/esm/encoder/csv/field-formatter.js.map +1 -0
  119. package/dist/esm/encoder/csv/row-formatter.js +159 -0
  120. package/dist/esm/encoder/csv/row-formatter.js.map +1 -0
  121. package/dist/esm/encoder/csv.js +43 -0
  122. package/dist/esm/encoder/csv.js.map +1 -0
  123. package/dist/esm/encoder/error.js +18 -0
  124. package/dist/esm/encoder/error.js.map +1 -0
  125. package/dist/esm/encoder/index.js +6 -0
  126. package/dist/esm/encoder/json.js +35 -0
  127. package/dist/esm/encoder/json.js.map +1 -0
  128. package/dist/esm/encoder/text.js +34 -0
  129. package/dist/esm/encoder/text.js.map +1 -0
  130. package/dist/esm/encoder/url.js +36 -0
  131. package/dist/esm/encoder/url.js.map +1 -0
  132. package/dist/esm/errors/index.d.ts +47 -0
  133. package/dist/esm/errors/index.js +93 -0
  134. package/dist/esm/errors/index.js.map +1 -0
  135. package/dist/esm/index.d.ts +16 -0
  136. package/dist/esm/index.js +14 -0
  137. package/dist/esm/pin/client.js +95 -0
  138. package/dist/esm/pin/client.js.map +1 -0
  139. package/dist/esm/pin/index.js +1 -0
  140. package/dist/esm/pinner.d.ts +77 -0
  141. package/dist/esm/pinner.js +125 -0
  142. package/dist/esm/pinner.js.map +1 -0
  143. package/dist/esm/types/constants.js +29 -0
  144. package/dist/esm/types/constants.js.map +1 -0
  145. package/dist/esm/types/mime-types.d.ts +7 -0
  146. package/dist/esm/types/mime-types.js +8 -0
  147. package/dist/esm/types/mime-types.js.map +1 -0
  148. package/dist/esm/types/pin.d.ts +74 -0
  149. package/dist/esm/types/pinata.d.ts +99 -0
  150. package/dist/esm/types/type-guards.d.ts +15 -0
  151. package/dist/esm/types/type-guards.js +19 -0
  152. package/dist/esm/types/type-guards.js.map +1 -0
  153. package/dist/esm/types/upload.d.ts +189 -0
  154. package/dist/esm/types/upload.js +16 -0
  155. package/dist/esm/types/upload.js.map +1 -0
  156. package/dist/esm/upload/base-upload.js +132 -0
  157. package/dist/esm/upload/base-upload.js.map +1 -0
  158. package/dist/esm/upload/builder.d.ts +60 -0
  159. package/dist/esm/upload/builder.js +173 -0
  160. package/dist/esm/upload/builder.js.map +1 -0
  161. package/dist/esm/upload/car.d.ts +19 -0
  162. package/dist/esm/upload/car.js +125 -0
  163. package/dist/esm/upload/car.js.map +1 -0
  164. package/dist/esm/upload/constants.js +7 -0
  165. package/dist/esm/upload/constants.js.map +1 -0
  166. package/dist/esm/upload/index.js +8 -0
  167. package/dist/esm/upload/manager.d.ts +35 -0
  168. package/dist/esm/upload/manager.js +248 -0
  169. package/dist/esm/upload/manager.js.map +1 -0
  170. package/dist/esm/upload/normalize.js +28 -0
  171. package/dist/esm/upload/normalize.js.map +1 -0
  172. package/dist/esm/upload/tus-upload.js +72 -0
  173. package/dist/esm/upload/tus-upload.js.map +1 -0
  174. package/dist/esm/upload/xhr-upload.js +39 -0
  175. package/dist/esm/upload/xhr-upload.js.map +1 -0
  176. package/dist/esm/utils/env.js +11 -0
  177. package/dist/esm/utils/env.js.map +1 -0
  178. package/dist/esm/utils/stream.d.ts +23 -0
  179. package/dist/esm/utils/stream.js +134 -0
  180. package/dist/esm/utils/stream.js.map +1 -0
  181. package/dist/esm/utils/tus-patch.js +51 -0
  182. package/dist/esm/utils/tus-patch.js.map +1 -0
  183. package/dist/esm/utils/validation.js +60 -0
  184. package/dist/esm/utils/validation.js.map +1 -0
  185. package/package.json +95 -8
  186. package/public/mockServiceWorker.js +349 -0
@@ -0,0 +1,187 @@
1
+ import { jsonToFile } from "../../encoder/json.js";
2
+ import { base64ToFile } from "../../encoder/base64.js";
3
+ import { urlToFile } from "../../encoder/url.js";
4
+ import "../../encoder/index.js";
5
+ import { validateUrl } from "../../utils/validation.js";
6
+ import { CID } from "multiformats/cid";
7
+
8
+ //#region src/adapters/pinata/builder.ts
9
+ /**
10
+ * Error wrapper for Pinata adapter operations.
11
+ */
12
+ var PinataAdapterError = class extends Error {
13
+ code;
14
+ cause;
15
+ constructor(message, code, cause) {
16
+ super(message);
17
+ this.name = "PinataAdapterError";
18
+ this.code = code;
19
+ this.cause = cause;
20
+ }
21
+ };
22
+ /**
23
+ * Base upload builder with common name/keyvalues functionality.
24
+ */
25
+ var BaseUploadBuilder = class {
26
+ _name;
27
+ _keyvalues;
28
+ constructor(pinner) {
29
+ this.pinner = pinner;
30
+ }
31
+ name(name) {
32
+ this._name = name;
33
+ return this;
34
+ }
35
+ keyvalues(kv) {
36
+ this._keyvalues = kv;
37
+ return this;
38
+ }
39
+ toUploadResult(result) {
40
+ return {
41
+ IpfsHash: result.cid,
42
+ PinSize: result.size,
43
+ Timestamp: result.createdAt.toISOString(),
44
+ isDuplicate: false
45
+ };
46
+ }
47
+ };
48
+ /**
49
+ * File upload builder.
50
+ */
51
+ var FileUploadBuilder = class extends BaseUploadBuilder {
52
+ constructor(pinner, file) {
53
+ super(pinner);
54
+ this.file = file;
55
+ }
56
+ async execute() {
57
+ const result = await this.pinner.uploadAndWait(this.file, {
58
+ name: this._name,
59
+ keyvalues: this._keyvalues
60
+ });
61
+ return this.toUploadResult(result);
62
+ }
63
+ };
64
+ /**
65
+ * File array upload builder.
66
+ */
67
+ var FileArrayUploadBuilder = class extends BaseUploadBuilder {
68
+ constructor(pinner, files) {
69
+ super(pinner);
70
+ this.files = files;
71
+ if (files.length === 0) throw new PinataAdapterError("Cannot upload empty file array", "EMPTY_FILE_ARRAY");
72
+ }
73
+ async execute() {
74
+ try {
75
+ const result = await (await this.pinner.uploadDirectory(this.files, {
76
+ name: this._name,
77
+ keyvalues: this._keyvalues
78
+ })).result;
79
+ return this.toUploadResult(result);
80
+ } catch (error) {
81
+ if (error instanceof Error) throw new PinataAdapterError(`File array upload failed: ${error.message}`, "UPLOAD_FAILED", error);
82
+ throw error;
83
+ }
84
+ }
85
+ };
86
+ /**
87
+ * Encoded upload builder - handles JSON, Base64, and URL uploads using encoders.
88
+ */
89
+ var EncodedUploadBuilder = class extends BaseUploadBuilder {
90
+ constructor(pinner, encoderFn) {
91
+ super(pinner);
92
+ this.encoderFn = encoderFn;
93
+ }
94
+ async execute() {
95
+ try {
96
+ const encoded = await this.encoderFn(this._name, this._keyvalues);
97
+ const result = await this.pinner.uploadAndWait(encoded.file, encoded.options);
98
+ return this.toUploadResult(result);
99
+ } catch (error) {
100
+ if (error instanceof Error) throw new PinataAdapterError(`Upload failed: ${error.message}`, "UPLOAD_FAILED", error);
101
+ throw error;
102
+ }
103
+ }
104
+ };
105
+ /**
106
+ * CID upload builder (pin by CID).
107
+ */
108
+ var CidUploadBuilder = class {
109
+ _name;
110
+ _keyvalues;
111
+ constructor(pinner, cidString) {
112
+ this.pinner = pinner;
113
+ this.cidString = cidString;
114
+ }
115
+ name(name) {
116
+ this._name = name;
117
+ return this;
118
+ }
119
+ keyvalues(kv) {
120
+ this._keyvalues = kv;
121
+ return this;
122
+ }
123
+ async execute() {
124
+ try {
125
+ const cid = CID.parse(this.cidString);
126
+ const generator = await this.pinner.pinByHash(cid, {
127
+ name: this._name,
128
+ metadata: this._keyvalues
129
+ });
130
+ for await (const _ of generator);
131
+ } catch (error) {
132
+ if (error instanceof Error) throw new PinataAdapterError(`CID upload failed: ${error.message}`, "INVALID_CID", error);
133
+ throw error;
134
+ }
135
+ }
136
+ };
137
+ /**
138
+ * Create a file upload builder.
139
+ */
140
+ function createUploadBuilder(pinner, file) {
141
+ return new FileUploadBuilder(pinner, file);
142
+ }
143
+ /**
144
+ * Create a file array upload builder.
145
+ */
146
+ function createFileArrayUploadBuilder(pinner, files) {
147
+ return new FileArrayUploadBuilder(pinner, files);
148
+ }
149
+ /**
150
+ * Create a JSON upload builder.
151
+ */
152
+ function createJsonUploadBuilder(pinner, data) {
153
+ return new EncodedUploadBuilder(pinner, (name, keyvalues) => jsonToFile(data, {
154
+ name,
155
+ keyvalues
156
+ }));
157
+ }
158
+ /**
159
+ * Create a base64 upload builder.
160
+ */
161
+ function createBase64UploadBuilder(pinner, base64String) {
162
+ return new EncodedUploadBuilder(pinner, (name, keyvalues) => base64ToFile(base64String, {
163
+ name,
164
+ keyvalues
165
+ }));
166
+ }
167
+ /**
168
+ * Create a URL upload builder.
169
+ */
170
+ function createUrlUploadBuilder(pinner, urlString, options) {
171
+ validateUrl(urlString);
172
+ return new EncodedUploadBuilder(pinner, (name, keyvalues) => urlToFile(urlString, {
173
+ name,
174
+ keyvalues,
175
+ fetch: options?.fetch
176
+ }));
177
+ }
178
+ /**
179
+ * Create a CID upload builder.
180
+ */
181
+ function createCidUploadBuilder(pinner, cidString) {
182
+ return new CidUploadBuilder(pinner, cidString);
183
+ }
184
+
185
+ //#endregion
186
+ export { PinataAdapterError, createBase64UploadBuilder, createCidUploadBuilder, createFileArrayUploadBuilder, createJsonUploadBuilder, createUploadBuilder, createUrlUploadBuilder };
187
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","names":[],"sources":["../../../../src/adapters/pinata/builder.ts"],"sourcesContent":["import type { Pinner } from \"@/pinner\";\nimport type {\n PinataUploadBuilder,\n PinataUploadResult,\n UrlUploadBuilderOptions,\n} from \"@/types/pinata\";\nimport type { UploadOptions } from \"@/encoder/types\";\nimport { CID } from \"multiformats/cid\";\nimport { base64ToFile, jsonToFile, urlToFile } from \"@/encoder\";\nimport { validateUrl } from \"@/utils/validation\";\n\n/**\n * Error wrapper for Pinata adapter operations.\n */\nexport class PinataAdapterError extends Error {\n code: \"UPLOAD_FAILED\" | \"EMPTY_FILE_ARRAY\" | \"INVALID_CID\";\n cause?: Error;\n\n constructor(\n message: string,\n code: PinataAdapterError[\"code\"],\n cause?: Error,\n ) {\n super(message);\n this.name = \"PinataAdapterError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\n/**\n * Base upload builder with common name/keyvalues functionality.\n */\nabstract class BaseUploadBuilder<\n TResult,\n> implements PinataUploadBuilder<TResult> {\n protected _name?: string;\n protected _keyvalues?: Record<string, string>;\n\n constructor(protected pinner: Pinner) {}\n\n name(name: string): this {\n this._name = name;\n return this;\n }\n\n keyvalues(kv: Record<string, string>): this {\n this._keyvalues = kv;\n return this;\n }\n\n abstract execute(): Promise<TResult>;\n\n protected toUploadResult(result: {\n cid: string;\n size: number;\n createdAt: Date;\n }): PinataUploadResult {\n return {\n IpfsHash: result.cid,\n PinSize: result.size,\n Timestamp: result.createdAt.toISOString(),\n isDuplicate: false,\n };\n }\n}\n\n/**\n * File upload builder.\n */\nclass FileUploadBuilder extends BaseUploadBuilder<PinataUploadResult> {\n constructor(\n pinner: Pinner,\n private file: File,\n ) {\n super(pinner);\n }\n\n async execute(): Promise<PinataUploadResult> {\n const result = await this.pinner.uploadAndWait(this.file, {\n name: this._name,\n keyvalues: this._keyvalues,\n });\n return this.toUploadResult(result);\n }\n}\n\n/**\n * File array upload builder.\n */\nclass FileArrayUploadBuilder extends BaseUploadBuilder<PinataUploadResult> {\n constructor(\n pinner: Pinner,\n private files: File[],\n ) {\n super(pinner);\n if (files.length === 0) {\n throw new PinataAdapterError(\n \"Cannot upload empty file array\",\n \"EMPTY_FILE_ARRAY\",\n );\n }\n }\n\n async execute(): Promise<PinataUploadResult> {\n try {\n const operation = await this.pinner.uploadDirectory(this.files, {\n name: this._name,\n keyvalues: this._keyvalues,\n });\n const result = await operation.result;\n return this.toUploadResult(result);\n } catch (error) {\n if (error instanceof Error) {\n throw new PinataAdapterError(\n `File array upload failed: ${error.message}`,\n \"UPLOAD_FAILED\",\n error,\n );\n }\n throw error;\n }\n }\n}\n\n/**\n * Encoded upload builder - handles JSON, Base64, and URL uploads using encoders.\n */\nclass EncodedUploadBuilder extends BaseUploadBuilder<PinataUploadResult> {\n constructor(\n pinner: Pinner,\n private encoderFn: (\n name?: string,\n keyvalues?: Record<string, string>,\n ) => Promise<{ file: File; options: UploadOptions }>,\n ) {\n super(pinner);\n }\n\n async execute(): Promise<PinataUploadResult> {\n try {\n const encoded = await this.encoderFn(this._name, this._keyvalues);\n const result = await this.pinner.uploadAndWait(\n encoded.file,\n encoded.options,\n );\n return this.toUploadResult(result);\n } catch (error) {\n if (error instanceof Error) {\n throw new PinataAdapterError(\n `Upload failed: ${error.message}`,\n \"UPLOAD_FAILED\",\n error,\n );\n }\n throw error;\n }\n }\n}\n\n/**\n * CID upload builder (pin by CID).\n */\nclass CidUploadBuilder implements PinataUploadBuilder<void> {\n private _name?: string;\n private _keyvalues?: Record<string, string>;\n\n constructor(\n private pinner: Pinner,\n private cidString: string,\n ) {}\n\n name(name: string): this {\n this._name = name;\n return this;\n }\n\n keyvalues(kv: Record<string, string>): this {\n this._keyvalues = kv;\n return this;\n }\n\n async execute(): Promise<void> {\n try {\n const cid = CID.parse(this.cidString);\n const generator = await this.pinner.pinByHash(cid, {\n name: this._name,\n metadata: this._keyvalues,\n });\n for await (const _ of generator) {\n // Pin operation in progress\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new PinataAdapterError(\n `CID upload failed: ${error.message}`,\n \"INVALID_CID\",\n error,\n );\n }\n throw error;\n }\n }\n}\n\n/**\n * Create a file upload builder.\n */\nexport function createUploadBuilder(\n pinner: Pinner,\n file: File,\n): PinataUploadBuilder<PinataUploadResult> {\n return new FileUploadBuilder(pinner, file);\n}\n\n/**\n * Create a file array upload builder.\n */\nexport function createFileArrayUploadBuilder(\n pinner: Pinner,\n files: File[],\n): PinataUploadBuilder<PinataUploadResult> {\n return new FileArrayUploadBuilder(pinner, files);\n}\n\n/**\n * Create a JSON upload builder.\n */\nexport function createJsonUploadBuilder(\n pinner: Pinner,\n data: object,\n): PinataUploadBuilder<PinataUploadResult> {\n return new EncodedUploadBuilder(pinner, (name, keyvalues) =>\n jsonToFile(data, { name, keyvalues }),\n );\n}\n\n/**\n * Create a base64 upload builder.\n */\nexport function createBase64UploadBuilder(\n pinner: Pinner,\n base64String: string,\n): PinataUploadBuilder<PinataUploadResult> {\n return new EncodedUploadBuilder(pinner, (name, keyvalues) =>\n base64ToFile(base64String, { name, keyvalues }),\n );\n}\n\n/**\n * Create a URL upload builder.\n */\nexport function createUrlUploadBuilder(\n pinner: Pinner,\n urlString: string,\n options?: UrlUploadBuilderOptions,\n): PinataUploadBuilder<PinataUploadResult> {\n // Validate URL to prevent SSRF attacks\n validateUrl(urlString);\n\n return new EncodedUploadBuilder(pinner, (name, keyvalues) =>\n urlToFile(urlString, { name, keyvalues, fetch: options?.fetch }),\n );\n}\n\n/**\n * Create a CID upload builder.\n */\nexport function createCidUploadBuilder(\n pinner: Pinner,\n cidString: string,\n): PinataUploadBuilder<void> {\n return new CidUploadBuilder(pinner, cidString);\n}\n"],"mappings":";;;;;;;;;;;AAcA,IAAa,qBAAb,cAAwC,MAAM;CAC5C;CACA;CAEA,YACE,SACA,MACA,OACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,QAAQ;;;;;;AAOjB,IAAe,oBAAf,MAE0C;CACxC,AAAU;CACV,AAAU;CAEV,YAAY,AAAU,QAAgB;EAAhB;;CAEtB,KAAK,MAAoB;AACvB,OAAK,QAAQ;AACb,SAAO;;CAGT,UAAU,IAAkC;AAC1C,OAAK,aAAa;AAClB,SAAO;;CAKT,AAAU,eAAe,QAIF;AACrB,SAAO;GACL,UAAU,OAAO;GACjB,SAAS,OAAO;GAChB,WAAW,OAAO,UAAU,aAAa;GACzC,aAAa;GACd;;;;;;AAOL,IAAM,oBAAN,cAAgC,kBAAsC;CACpE,YACE,QACA,AAAQ,MACR;AACA,QAAM,OAAO;EAFL;;CAKV,MAAM,UAAuC;EAC3C,MAAM,SAAS,MAAM,KAAK,OAAO,cAAc,KAAK,MAAM;GACxD,MAAM,KAAK;GACX,WAAW,KAAK;GACjB,CAAC;AACF,SAAO,KAAK,eAAe,OAAO;;;;;;AAOtC,IAAM,yBAAN,cAAqC,kBAAsC;CACzE,YACE,QACA,AAAQ,OACR;AACA,QAAM,OAAO;EAFL;AAGR,MAAI,MAAM,WAAW,EACnB,OAAM,IAAI,mBACR,kCACA,mBACD;;CAIL,MAAM,UAAuC;AAC3C,MAAI;GAKF,MAAM,SAAS,OAJG,MAAM,KAAK,OAAO,gBAAgB,KAAK,OAAO;IAC9D,MAAM,KAAK;IACX,WAAW,KAAK;IACjB,CAAC,EAC6B;AAC/B,UAAO,KAAK,eAAe,OAAO;WAC3B,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,mBACR,6BAA6B,MAAM,WACnC,iBACA,MACD;AAEH,SAAM;;;;;;;AAQZ,IAAM,uBAAN,cAAmC,kBAAsC;CACvE,YACE,QACA,AAAQ,WAIR;AACA,QAAM,OAAO;EALL;;CAQV,MAAM,UAAuC;AAC3C,MAAI;GACF,MAAM,UAAU,MAAM,KAAK,UAAU,KAAK,OAAO,KAAK,WAAW;GACjE,MAAM,SAAS,MAAM,KAAK,OAAO,cAC/B,QAAQ,MACR,QAAQ,QACT;AACD,UAAO,KAAK,eAAe,OAAO;WAC3B,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,mBACR,kBAAkB,MAAM,WACxB,iBACA,MACD;AAEH,SAAM;;;;;;;AAQZ,IAAM,mBAAN,MAA4D;CAC1D,AAAQ;CACR,AAAQ;CAER,YACE,AAAQ,QACR,AAAQ,WACR;EAFQ;EACA;;CAGV,KAAK,MAAoB;AACvB,OAAK,QAAQ;AACb,SAAO;;CAGT,UAAU,IAAkC;AAC1C,OAAK,aAAa;AAClB,SAAO;;CAGT,MAAM,UAAyB;AAC7B,MAAI;GACF,MAAM,MAAM,IAAI,MAAM,KAAK,UAAU;GACrC,MAAM,YAAY,MAAM,KAAK,OAAO,UAAU,KAAK;IACjD,MAAM,KAAK;IACX,UAAU,KAAK;IAChB,CAAC;AACF,cAAW,MAAM,KAAK;WAGf,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,mBACR,sBAAsB,MAAM,WAC5B,eACA,MACD;AAEH,SAAM;;;;;;;AAQZ,SAAgB,oBACd,QACA,MACyC;AACzC,QAAO,IAAI,kBAAkB,QAAQ,KAAK;;;;;AAM5C,SAAgB,6BACd,QACA,OACyC;AACzC,QAAO,IAAI,uBAAuB,QAAQ,MAAM;;;;;AAMlD,SAAgB,wBACd,QACA,MACyC;AACzC,QAAO,IAAI,qBAAqB,SAAS,MAAM,cAC7C,WAAW,MAAM;EAAE;EAAM;EAAW,CAAC,CACtC;;;;;AAMH,SAAgB,0BACd,QACA,cACyC;AACzC,QAAO,IAAI,qBAAqB,SAAS,MAAM,cAC7C,aAAa,cAAc;EAAE;EAAM;EAAW,CAAC,CAChD;;;;;AAMH,SAAgB,uBACd,QACA,WACA,SACyC;AAEzC,aAAY,UAAU;AAEtB,QAAO,IAAI,qBAAqB,SAAS,MAAM,cAC7C,UAAU,WAAW;EAAE;EAAM;EAAW,OAAO,SAAS;EAAO,CAAC,CACjE;;;;;AAMH,SAAgB,uBACd,QACA,WAC2B;AAC3B,QAAO,IAAI,iBAAiB,QAAQ,UAAU"}
@@ -0,0 +1,4 @@
1
+ import { PinByHashOptions, PinataFile, PinataListBuilder, PinataMetadata, PinataMetadataOptions, PinataPin, PinataUploadBuilder, PinataUploadResult } from "../../types/pinata.js";
2
+ import { PinataAdapter, pinataAdapter } from "./adapter.js";
3
+ import "./builder.js";
4
+ import "./list-builder.js";
@@ -0,0 +1,3 @@
1
+ import { PinataAdapterError } from "./builder.js";
2
+ import { createListBuilder } from "./list-builder.js";
3
+ import { pinataAdapter } from "./adapter.js";
@@ -0,0 +1 @@
1
+ import "../../pinner.js";
@@ -0,0 +1,51 @@
1
+ //#region src/adapters/pinata/list-builder.ts
2
+ /**
3
+ * List builder for listing pins.
4
+ *
5
+ * Note: .pageToken() provides Pinata SDK API compatibility for easier migration.
6
+ * The token is passed through to the underlying IPFS Pinning Service cursor parameter.
7
+ * The server handles the actual pagination logic according to the IPFS Pinning Service spec.
8
+ */
9
+ var PinataListBuilderImpl = class {
10
+ _limit;
11
+ _pageToken;
12
+ _offset;
13
+ constructor(pinner) {
14
+ this.pinner = pinner;
15
+ }
16
+ limit(limit) {
17
+ this._limit = limit;
18
+ return this;
19
+ }
20
+ offset(offset) {
21
+ this._offset = offset;
22
+ return this;
23
+ }
24
+ pageToken(pageToken) {
25
+ this._pageToken = pageToken;
26
+ return this;
27
+ }
28
+ async execute() {
29
+ const options = {};
30
+ if (this._limit !== void 0) options.limit = this._limit;
31
+ if (this._pageToken !== void 0) options.cursor = this._pageToken;
32
+ return (await this.pinner.listPins(options)).map((pin) => ({
33
+ id: pin.cid.toString(),
34
+ ipfsPinHash: pin.cid.toString(),
35
+ size: pin.size || 0,
36
+ name: pin.name || "",
37
+ cid: pin.cid.toString(),
38
+ createdAt: pin.created.toISOString()
39
+ }));
40
+ }
41
+ };
42
+ /**
43
+ * Create a list builder.
44
+ */
45
+ function createListBuilder(pinner) {
46
+ return new PinataListBuilderImpl(pinner);
47
+ }
48
+
49
+ //#endregion
50
+ export { createListBuilder };
51
+ //# sourceMappingURL=list-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-builder.js","names":[],"sources":["../../../../src/adapters/pinata/list-builder.ts"],"sourcesContent":["import type { Pinner } from \"@/pinner\";\nimport type { PinataFile, PinataListBuilder } from \"@/types/pinata\";\nimport type { RemoteLsOptions } from \"@/types/pin\";\n\n/**\n * List builder for listing pins.\n *\n * Note: .pageToken() provides Pinata SDK API compatibility for easier migration.\n * The token is passed through to the underlying IPFS Pinning Service cursor parameter.\n * The server handles the actual pagination logic according to the IPFS Pinning Service spec.\n */\nclass PinataListBuilderImpl implements PinataListBuilder<PinataFile[]> {\n private _limit?: number;\n private _pageToken?: string;\n private _offset?: number;\n\n constructor(private pinner: Pinner) {}\n\n limit(limit: number): this {\n this._limit = limit;\n return this;\n }\n\n offset(offset: number): this {\n this._offset = offset;\n return this;\n }\n\n pageToken(pageToken: string): this {\n this._pageToken = pageToken;\n return this;\n }\n\n async execute(): Promise<PinataFile[]> {\n const options: RemoteLsOptions = {};\n\n if (this._limit !== undefined) {\n options.limit = this._limit;\n }\n\n if (this._pageToken !== undefined) {\n options.cursor = this._pageToken;\n }\n\n const remotePins = await this.pinner.listPins(options);\n\n return remotePins.map((pin) => ({\n id: pin.cid.toString(),\n ipfsPinHash: pin.cid.toString(),\n size: pin.size || 0,\n name: pin.name || \"\",\n cid: pin.cid.toString(),\n createdAt: pin.created.toISOString(),\n }));\n }\n}\n\n/**\n * Create a list builder.\n */\nexport function createListBuilder(\n pinner: Pinner,\n): PinataListBuilder<PinataFile[]> {\n return new PinataListBuilderImpl(pinner);\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,wBAAN,MAAuE;CACrE,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,AAAQ,QAAgB;EAAhB;;CAEpB,MAAM,OAAqB;AACzB,OAAK,SAAS;AACd,SAAO;;CAGT,OAAO,QAAsB;AAC3B,OAAK,UAAU;AACf,SAAO;;CAGT,UAAU,WAAyB;AACjC,OAAK,aAAa;AAClB,SAAO;;CAGT,MAAM,UAAiC;EACrC,MAAM,UAA2B,EAAE;AAEnC,MAAI,KAAK,WAAW,OAClB,SAAQ,QAAQ,KAAK;AAGvB,MAAI,KAAK,eAAe,OACtB,SAAQ,SAAS,KAAK;AAKxB,UAFmB,MAAM,KAAK,OAAO,SAAS,QAAQ,EAEpC,KAAK,SAAS;GAC9B,IAAI,IAAI,IAAI,UAAU;GACtB,aAAa,IAAI,IAAI,UAAU;GAC/B,MAAM,IAAI,QAAQ;GAClB,MAAM,IAAI,QAAQ;GAClB,KAAK,IAAI,IAAI,UAAU;GACvB,WAAW,IAAI,QAAQ,aAAa;GACrC,EAAE;;;;;;AAOP,SAAgB,kBACd,QACiC;AACjC,QAAO,IAAI,sBAAsB,OAAO"}
@@ -0,0 +1,2 @@
1
+ import { UnstorageBlockstoreOptions, setDriverFactory } from "./unstorage-base.js";
2
+ import { createBlockstore, createDatastore } from "./unstorage.js";
@@ -0,0 +1,2 @@
1
+ import { setDriverFactory } from "./unstorage-base.js";
2
+ import { createBlockstore, createDatastore } from "./unstorage.js";
@@ -0,0 +1,23 @@
1
+ import { Driver, Storage } from "unstorage";
2
+ import { Datastore } from "interface-datastore";
3
+
4
+ //#region src/blockstore/unstorage-base.d.ts
5
+ interface UnstorageBlockstoreOptions {
6
+ storage?: Storage;
7
+ prefix?: string;
8
+ driver?: Driver;
9
+ base?: string;
10
+ datastorePrefix?: string;
11
+ }
12
+ /**
13
+ * prefix: Key prefix for blockstore keys (e.g., "blockstore" or "pinner-helia-blocks").
14
+ * This is prepended to CID strings in storage keys.
15
+ *
16
+ * base: Base path for the storage driver (e.g., "pinner:" for IndexedDB, "./.pinner-blocks" for filesystem).
17
+ * This determines where the storage driver stores data.
18
+ */
19
+ type DriverFactory = () => Driver | Promise<Driver>;
20
+ declare function setDriverFactory(factory: DriverFactory | null): void;
21
+ //#endregion
22
+ export { UnstorageBlockstoreOptions, setDriverFactory };
23
+ //# sourceMappingURL=unstorage-base.d.ts.map
@@ -0,0 +1,231 @@
1
+ import { collectAsyncIterable } from "../utils/stream.js";
2
+ import { DEFAULT_BLOCKSTORE_PREFIX } from "../types/constants.js";
3
+ import { BaseBlockstore } from "/home/runner/work/web/web/node_modules/.pnpm/blockstore-core@6.1.2/node_modules/blockstore-core/dist/src/index.js";
4
+ import { CID } from "multiformats/cid";
5
+ import { createStorage } from "unstorage";
6
+ import { Key } from "interface-datastore";
7
+
8
+ //#region src/blockstore/unstorage-base.ts
9
+ let driverFactory = null;
10
+ function setDriverFactory(factory) {
11
+ driverFactory = factory;
12
+ }
13
+ function createStorageWithOptions(options) {
14
+ return options.storage ? options.storage : createStorage({ driver: options.driver });
15
+ }
16
+ async function initializeStorage(storage, options, getDefaultDriver) {
17
+ if (options.storage || options.driver) return;
18
+ const driver = await getDefaultDriver(options.base);
19
+ Object.assign(storage, createStorage({ driver }));
20
+ }
21
+ function createUnstorageBase(options, getDefaultDriver) {
22
+ const storage = createStorageWithOptions(options);
23
+ const initialized = initializeStorage(storage, options, getDefaultDriver);
24
+ async function ensureInitialized() {
25
+ await initialized;
26
+ }
27
+ async function hasItem(key) {
28
+ await ensureInitialized();
29
+ return await storage.hasItem(key);
30
+ }
31
+ async function getItem(key) {
32
+ await ensureInitialized();
33
+ const value = await storage.getItemRaw(key);
34
+ if (value === null) throw new Error(`Item not found: ${key}`);
35
+ return value;
36
+ }
37
+ async function putItem(key, value) {
38
+ await ensureInitialized();
39
+ await storage.setItemRaw(key, value);
40
+ }
41
+ async function deleteItem(key) {
42
+ await ensureInitialized();
43
+ await storage.removeItem(key);
44
+ }
45
+ async function getAllKeys() {
46
+ await ensureInitialized();
47
+ return await storage.getKeys();
48
+ }
49
+ return {
50
+ storage,
51
+ hasItem,
52
+ getItem,
53
+ putItem,
54
+ deleteItem,
55
+ getAllKeys
56
+ };
57
+ }
58
+ function createUnstorageBlockstore(getDefaultDriver) {
59
+ return class UnstorageBlockstore extends BaseBlockstore {
60
+ prefix;
61
+ base;
62
+ constructor(options = {}) {
63
+ super();
64
+ this.prefix = options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;
65
+ this.base = createUnstorageBase(options, getDefaultDriver);
66
+ }
67
+ keyToStorageKey(key) {
68
+ return `${this.prefix}:${key.toString()}`;
69
+ }
70
+ async has(key, _) {
71
+ return await this.base.hasItem(this.keyToStorageKey(key));
72
+ }
73
+ async put(key, val, _) {
74
+ const storageKey = this.keyToStorageKey(key);
75
+ const bytes = val instanceof Uint8Array ? val : await collectAsyncIterable(val);
76
+ await this.base.putItem(storageKey, bytes);
77
+ return key;
78
+ }
79
+ async *putMany(source, options) {
80
+ for await (const { cid, bytes } of source) yield await this.put(cid, bytes, options);
81
+ }
82
+ async *get(key, _) {
83
+ const storageKey = this.keyToStorageKey(key);
84
+ yield await this.base.getItem(storageKey);
85
+ }
86
+ async *getMany(source, options) {
87
+ for await (const cid of source) yield {
88
+ cid,
89
+ bytes: async function* () {
90
+ yield* await this.get(cid, options);
91
+ }.call(this)
92
+ };
93
+ }
94
+ async delete(key, _) {
95
+ await this.base.deleteItem(this.keyToStorageKey(key));
96
+ }
97
+ async *deleteMany(source, options) {
98
+ for await (const cid of source) {
99
+ await this.delete(cid, options);
100
+ yield cid;
101
+ }
102
+ }
103
+ async *getAll(_) {
104
+ const keys = await this.base.getAllKeys();
105
+ for (const key of keys) if (key.startsWith(this.prefix + ":")) {
106
+ const cidString = key.slice(this.prefix.length + 1);
107
+ try {
108
+ const cid = CID.parse(cidString);
109
+ const value = await this.base.getItem(key);
110
+ yield {
111
+ cid,
112
+ bytes: (async function* () {
113
+ yield value;
114
+ })()
115
+ };
116
+ } catch {}
117
+ }
118
+ }
119
+ };
120
+ }
121
+ function createUnstorageDatastore(getDefaultDriver) {
122
+ return class UnstorageDatastore {
123
+ prefix;
124
+ base;
125
+ constructor(options = {}) {
126
+ this.prefix = options.datastorePrefix ?? options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;
127
+ this.base = createUnstorageBase(options, getDefaultDriver);
128
+ }
129
+ keyToStorageKey(key) {
130
+ return `${this.prefix}:${key.toString()}`;
131
+ }
132
+ storageKeyToKey(storageKey) {
133
+ return new Key(storageKey.slice(this.prefix.length + 1));
134
+ }
135
+ async has(key, _) {
136
+ return await this.base.hasItem(this.keyToStorageKey(key));
137
+ }
138
+ async put(key, val, _) {
139
+ await this.base.putItem(this.keyToStorageKey(key), val);
140
+ return key;
141
+ }
142
+ async *putMany(source, options) {
143
+ for await (const { key, value } of source) yield await this.put(key, value, options);
144
+ }
145
+ async get(key, _) {
146
+ const storageKey = this.keyToStorageKey(key);
147
+ try {
148
+ return await this.base.getItem(storageKey);
149
+ } catch (error) {
150
+ throw new Error(`Datastore item not found: ${key.toString()}`);
151
+ }
152
+ }
153
+ async *getMany(source, options) {
154
+ for await (const key of source) yield {
155
+ key,
156
+ value: await this.get(key, options)
157
+ };
158
+ }
159
+ async delete(key, _) {
160
+ await this.base.deleteItem(this.keyToStorageKey(key));
161
+ }
162
+ async *deleteMany(source, options) {
163
+ for await (const key of source) {
164
+ await this.delete(key, options);
165
+ yield key;
166
+ }
167
+ }
168
+ batch() {
169
+ const operations = [];
170
+ const base = this.base;
171
+ const keyToStorageKey = this.keyToStorageKey.bind(this);
172
+ return {
173
+ put(key, value) {
174
+ operations.push({
175
+ type: "put",
176
+ key,
177
+ value
178
+ });
179
+ },
180
+ delete(key) {
181
+ operations.push({
182
+ type: "delete",
183
+ key
184
+ });
185
+ },
186
+ async commit() {
187
+ for (const op of operations) if (op.type === "put" && op.value !== void 0) await base.putItem(keyToStorageKey(op.key), op.value);
188
+ else if (op.type === "delete") await base.deleteItem(keyToStorageKey(op.key));
189
+ operations.length = 0;
190
+ }
191
+ };
192
+ }
193
+ async *query(query, _) {
194
+ const keys = await this.base.getAllKeys();
195
+ for (const key of keys) {
196
+ if (!key.startsWith(this.prefix + ":")) continue;
197
+ const datastoreKey = this.storageKeyToKey(key);
198
+ if (query.prefix && !datastoreKey.toString().startsWith(query.prefix.toString())) continue;
199
+ const value = await this.base.getItem(key);
200
+ if (query.filters) {
201
+ let match = true;
202
+ for (const filter of query.filters) if (!filter({
203
+ key: datastoreKey,
204
+ value
205
+ })) {
206
+ match = false;
207
+ break;
208
+ }
209
+ if (!match) continue;
210
+ }
211
+ yield {
212
+ key: datastoreKey,
213
+ value
214
+ };
215
+ }
216
+ }
217
+ async *queryKeys(query, _) {
218
+ const keys = await this.base.getAllKeys();
219
+ for (const key of keys) {
220
+ if (!key.startsWith(this.prefix + ":")) continue;
221
+ const datastoreKey = this.storageKeyToKey(key);
222
+ if (query.prefix && !datastoreKey.toString().startsWith(query.prefix.toString())) continue;
223
+ yield datastoreKey;
224
+ }
225
+ }
226
+ };
227
+ }
228
+
229
+ //#endregion
230
+ export { createUnstorageBlockstore, createUnstorageDatastore, driverFactory, setDriverFactory };
231
+ //# sourceMappingURL=unstorage-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unstorage-base.js","names":[],"sources":["../../../src/blockstore/unstorage-base.ts"],"sourcesContent":["import { BaseBlockstore } from \"blockstore-core\";\nimport type { InputPair, Pair as BlockstorePair } from \"interface-blockstore\";\nimport type {\n AbortOptions,\n Await,\n AwaitGenerator,\n AwaitIterable,\n} from \"interface-store\";\nimport { CID } from \"multiformats/cid\";\nimport { createStorage, type Driver, type Storage } from \"unstorage\";\nimport { DEFAULT_BLOCKSTORE_PREFIX } from \"@/types/constants\";\nimport type { Batch, Datastore, KeyQuery, Query } from \"interface-datastore\";\nimport { Key, Pair } from \"interface-datastore\";\nimport { collectAsyncIterable } from \"@/utils/stream\";\n\n\n\nexport interface UnstorageBlockstoreOptions {\n storage?: Storage;\n prefix?: string;\n driver?: Driver;\n base?: string;\n datastorePrefix?: string;\n}\n\n/**\n * prefix: Key prefix for blockstore keys (e.g., \"blockstore\" or \"pinner-helia-blocks\").\n * This is prepended to CID strings in storage keys.\n *\n * base: Base path for the storage driver (e.g., \"pinner:\" for IndexedDB, \"./.pinner-blocks\" for filesystem).\n * This determines where the storage driver stores data.\n */\n\ntype DriverFactory = () => Driver | Promise<Driver>;\n\nexport let driverFactory: DriverFactory | null = null;\n\nexport function setDriverFactory(factory: DriverFactory | null): void {\n driverFactory = factory;\n}\n\nfunction createStorageWithOptions(\n options: UnstorageBlockstoreOptions,\n): Storage {\n return options.storage\n ? options.storage\n : createStorage({ driver: options.driver });\n}\n\nasync function initializeStorage(\n storage: Storage,\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): Promise<void> {\n if (options.storage || options.driver) {\n return;\n }\n\n const driver = await getDefaultDriver(options.base);\n Object.assign(storage, createStorage({ driver }));\n}\n\nfunction createUnstorageBase(\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n) {\n const storage = createStorageWithOptions(options);\n const initialized = initializeStorage(storage, options, getDefaultDriver);\n\n async function ensureInitialized(): Promise<void> {\n await initialized;\n }\n\n async function hasItem(key: string): Promise<boolean> {\n await ensureInitialized();\n return await storage.hasItem(key);\n }\n\n async function getItem(key: string): Promise<Uint8Array> {\n await ensureInitialized();\n const value = await storage.getItemRaw<Uint8Array>(key);\n\n if (value === null) {\n throw new Error(`Item not found: ${key}`);\n }\n\n return value;\n }\n\n async function putItem(key: string, value: Uint8Array): Promise<void> {\n await ensureInitialized();\n await storage.setItemRaw(key, value);\n }\n\n async function deleteItem(key: string): Promise<void> {\n await ensureInitialized();\n await storage.removeItem(key);\n }\n\n async function getAllKeys(): Promise<string[]> {\n await ensureInitialized();\n return await storage.getKeys();\n }\n\n return {\n storage,\n hasItem,\n getItem,\n putItem,\n deleteItem,\n getAllKeys,\n };\n}\n\nexport function createUnstorageBlockstore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (\n options?: UnstorageBlockstoreOptions,\n) => InstanceType<typeof BaseBlockstore> {\n return class UnstorageBlockstore extends BaseBlockstore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n super();\n this.prefix = options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: CID): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n async has(key: CID, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(\n key: CID,\n val: Uint8Array | AwaitIterable<Uint8Array>,\n _?: AbortOptions,\n ): Promise<CID> {\n const storageKey = this.keyToStorageKey(key);\n const bytes =\n val instanceof Uint8Array ? val : await collectAsyncIterable(val);\n await this.base.putItem(storageKey, bytes);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<InputPair>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const { cid, bytes } of source) {\n yield await this.put(cid, bytes, options);\n }\n }\n\n async *get(key: CID, _?: AbortOptions): AsyncGenerator<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n const value = await this.base.getItem(storageKey);\n yield value;\n }\n\n async *getMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<BlockstorePair> {\n for await (const cid of source) {\n yield {\n cid,\n bytes: (async function* () {\n yield* await this.get(cid, options);\n }.call(this)),\n };\n }\n }\n\n async delete(key: CID, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const cid of source) {\n await this.delete(cid, options);\n yield cid;\n }\n }\n\n async *getAll(_?: AbortOptions): AwaitGenerator<BlockstorePair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (key.startsWith(this.prefix + \":\")) {\n const cidString = key.slice(this.prefix.length + 1);\n try {\n const cid = CID.parse(cidString);\n const value = await this.base.getItem(key);\n\n yield {\n cid,\n bytes: (async function* () {\n yield value;\n })(),\n };\n } catch {\n // Skip invalid keys\n }\n }\n }\n }\n };\n}\n\nexport function createUnstorageDatastore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (options?: UnstorageBlockstoreOptions) => Datastore {\n return class UnstorageDatastore implements Datastore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n this.prefix =\n options.datastorePrefix ?? options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: Key): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n private storageKeyToKey(storageKey: string): Key {\n return new Key(storageKey.slice(this.prefix.length + 1));\n }\n\n async has(key: Key, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(key: Key, val: Uint8Array, _?: AbortOptions): Promise<Key> {\n await this.base.putItem(this.keyToStorageKey(key), val);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<Pair>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const { key, value } of source) {\n yield await this.put(key, value, options);\n }\n }\n\n async get(key: Key, _?: AbortOptions): Promise<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n try {\n return await this.base.getItem(storageKey);\n } catch (error) {\n throw new Error(`Datastore item not found: ${key.toString()}`);\n }\n }\n\n async *getMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Pair> {\n for await (const key of source) {\n yield {\n key,\n value: await this.get(key, options),\n };\n }\n }\n\n async delete(key: Key, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const key of source) {\n await this.delete(key, options);\n yield key;\n }\n }\n\n batch(): Batch {\n const operations: Array<{\n type: \"put\" | \"delete\";\n key: Key;\n value?: Uint8Array;\n }> = [];\n const base = this.base;\n const keyToStorageKey = this.keyToStorageKey.bind(this);\n\n return {\n put(key: Key, value: Uint8Array): void {\n operations.push({ type: \"put\", key, value });\n },\n delete(key: Key): void {\n operations.push({ type: \"delete\", key });\n },\n async commit(): Promise<void> {\n for (const op of operations) {\n if (op.type === \"put\" && op.value !== undefined) {\n await base.putItem(keyToStorageKey(op.key), op.value);\n } else if (op.type === \"delete\") {\n await base.deleteItem(keyToStorageKey(op.key));\n }\n }\n operations.length = 0;\n },\n };\n }\n\n async *query(query: Query, _?: AbortOptions): AsyncGenerator<Pair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n const value = await this.base.getItem(key);\n\n if (query.filters) {\n let match = true;\n for (const filter of query.filters) {\n if (!filter({ key: datastoreKey, value })) {\n match = false;\n break;\n }\n }\n if (!match) continue;\n }\n\n yield {\n key: datastoreKey,\n value,\n };\n }\n }\n\n async *queryKeys(query: KeyQuery, _?: AbortOptions): AsyncGenerator<Key> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n yield datastoreKey;\n }\n }\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { UnstorageBlockstoreOptions, setDriverFactory } from "./unstorage-base.js";
2
+ import * as interface_datastore0 from "interface-datastore";
3
+ import * as multiformats0 from "multiformats";
4
+ import * as interface_store0 from "interface-store";
5
+ import * as interface_blockstore0 from "interface-blockstore";
6
+
7
+ //#region src/blockstore/unstorage.d.ts
8
+ declare function createBlockstore(options?: UnstorageBlockstoreOptions): {
9
+ new (instanceOptions?: UnstorageBlockstoreOptions): {
10
+ has(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.Await<boolean>;
11
+ put(key: multiformats0.CID, val: Uint8Array | interface_store0.AwaitIterable<Uint8Array>, options?: interface_store0.AbortOptions): interface_store0.Await<multiformats0.CID>;
12
+ putMany(source: interface_store0.AwaitIterable<interface_blockstore0.InputPair>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<multiformats0.CID>;
13
+ get(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<Uint8Array>;
14
+ getMany(source: interface_store0.AwaitIterable<multiformats0.CID>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<interface_blockstore0.Pair>;
15
+ delete(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.Await<void>;
16
+ deleteMany(source: interface_store0.AwaitIterable<multiformats0.CID>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<multiformats0.CID>;
17
+ getAll(options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<interface_blockstore0.Pair>;
18
+ };
19
+ };
20
+ declare function createDatastore(options?: UnstorageBlockstoreOptions): {
21
+ new (instanceOptions?: UnstorageBlockstoreOptions): {
22
+ batch(): interface_datastore0.Batch<{}>;
23
+ query(query: interface_datastore0.Query, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Pair>;
24
+ queryKeys(query: interface_datastore0.KeyQuery, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key>;
25
+ has(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<boolean>;
26
+ put(key: interface_datastore0.Key, val: Uint8Array<ArrayBufferLike>, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<interface_datastore0.Key>;
27
+ putMany(source: interface_store0.AwaitIterable<interface_datastore0.Pair>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key, any, any>;
28
+ get(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<Uint8Array<ArrayBufferLike>>;
29
+ getMany(source: interface_store0.AwaitIterable<interface_datastore0.Key>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Pair, any, any>;
30
+ delete(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<void>;
31
+ deleteMany(source: interface_store0.AwaitIterable<interface_datastore0.Key>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key, any, any>;
32
+ };
33
+ };
34
+ //#endregion
35
+ export { createBlockstore, createDatastore };
36
+ //# sourceMappingURL=unstorage.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { DEFAULT_BLOCKSTORE_BASE, DEFAULT_BLOCKSTORE_FS_BASE } from "../types/constants.js";
2
+ import { createUnstorageBlockstore, createUnstorageDatastore, driverFactory, setDriverFactory } from "./unstorage-base.js";
3
+
4
+ //#region src/blockstore/unstorage.ts
5
+ function isBrowser() {
6
+ return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
7
+ }
8
+ async function getDefaultDriver(base) {
9
+ if (driverFactory) return await driverFactory();
10
+ if (isBrowser()) return (await import("unstorage/drivers/indexedb")).default({ base: base ?? DEFAULT_BLOCKSTORE_BASE });
11
+ else return (await import("unstorage/drivers/fs-lite")).default({ base: base ?? DEFAULT_BLOCKSTORE_FS_BASE });
12
+ }
13
+ function createBlockstore(options) {
14
+ const BlockstoreClass = createUnstorageBlockstore(getDefaultDriver);
15
+ return class extends BlockstoreClass {
16
+ constructor(instanceOptions) {
17
+ super({
18
+ ...options,
19
+ ...instanceOptions
20
+ });
21
+ }
22
+ };
23
+ }
24
+ function createDatastore(options) {
25
+ const DatastoreClass = createUnstorageDatastore(getDefaultDriver);
26
+ return class extends DatastoreClass {
27
+ constructor(instanceOptions) {
28
+ super({
29
+ ...options,
30
+ ...instanceOptions
31
+ });
32
+ }
33
+ };
34
+ }
35
+
36
+ //#endregion
37
+ export { createBlockstore, createDatastore };
38
+ //# sourceMappingURL=unstorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unstorage.js","names":[],"sources":["../../../src/blockstore/unstorage.ts"],"sourcesContent":["import {\n createUnstorageBlockstore,\n createUnstorageDatastore,\n driverFactory,\n setDriverFactory,\n type UnstorageBlockstoreOptions,\n} from \"./unstorage-base\";\nimport {\n DEFAULT_BLOCKSTORE_BASE,\n DEFAULT_BLOCKSTORE_FS_BASE,\n} from \"@/types/constants\";\n\nfunction isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n}\n\nasync function getDefaultDriver(base?: string) {\n // Use driverFactory override if set (typically by tests to inject in-memory driver)\n if (driverFactory) {\n return await driverFactory();\n }\n\n if (isBrowser()) {\n return (await import(\"unstorage/drivers/indexedb\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_BASE,\n });\n } else {\n return (await import(\"unstorage/drivers/fs-lite\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_FS_BASE,\n });\n }\n}\n\nexport function createBlockstore(options?: UnstorageBlockstoreOptions) {\n const BlockstoreClass = createUnstorageBlockstore(getDefaultDriver);\n return class extends BlockstoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport function createDatastore(options?: UnstorageBlockstoreOptions) {\n const DatastoreClass = createUnstorageDatastore(getDefaultDriver);\n return class extends DatastoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport { setDriverFactory };\nexport type { UnstorageBlockstoreOptions } from \"./unstorage-base\";\n"],"mappings":";;;;AAYA,SAAS,YAAqB;AAC5B,QACE,OAAO,WAAW,eAAe,OAAO,OAAO,iBAAiB;;AAIpE,eAAe,iBAAiB,MAAe;AAE7C,KAAI,cACF,QAAO,MAAM,eAAe;AAG9B,KAAI,WAAW,CACb,SAAQ,MAAM,OAAO,+BAA+B,QAAQ,EAC1D,MAAM,QAAQ,yBACf,CAAC;KAEF,SAAQ,MAAM,OAAO,8BAA8B,QAAQ,EACzD,MAAM,QAAQ,4BACf,CAAC;;AAIN,SAAgB,iBAAiB,SAAsC;CACrE,MAAM,kBAAkB,0BAA0B,iBAAiB;AACnE,QAAO,cAAc,gBAAgB;EACnC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC;;;;AAK/C,SAAgB,gBAAgB,SAAsC;CACpE,MAAM,iBAAiB,yBAAyB,iBAAiB;AACjE,QAAO,cAAc,eAAe;EAClC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC"}