@lumeweb/pinner 0.1.0 → 0.1.3
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.
- package/README.md +197 -18
- package/dist/esm/_virtual/{rolldown_runtime.js → _rolldown/runtime.js} +2 -2
- package/dist/esm/adapters/pinata/index.d.ts +4 -4
- package/dist/esm/adapters/pinata/index.js +6 -3
- package/dist/esm/adapters/pinata/legacy/adapter.d.ts +73 -0
- package/dist/esm/adapters/pinata/legacy/adapter.js +124 -0
- package/dist/esm/adapters/pinata/legacy/adapter.js.map +1 -0
- package/dist/esm/adapters/pinata/legacy/index.d.ts +1 -0
- package/dist/esm/adapters/pinata/legacy/index.js +1 -0
- package/dist/esm/adapters/pinata/shared/index.d.ts +1 -0
- package/dist/esm/adapters/pinata/shared/index.js +1 -0
- package/dist/esm/adapters/pinata/shared/types.d.ts +218 -0
- package/dist/esm/adapters/pinata/shared/utils.d.ts +1 -0
- package/dist/esm/adapters/pinata/shared/utils.js +78 -0
- package/dist/esm/adapters/pinata/shared/utils.js.map +1 -0
- package/dist/esm/adapters/pinata/v2/adapter-interface.d.ts +197 -0
- package/dist/esm/adapters/pinata/v2/adapter.d.ts +16 -0
- package/dist/esm/adapters/pinata/v2/adapter.js +636 -0
- package/dist/esm/adapters/pinata/v2/adapter.js.map +1 -0
- package/dist/esm/adapters/pinata/v2/index.d.ts +3 -0
- package/dist/esm/adapters/pinata/v2/index.js +1 -0
- package/dist/esm/adapters/pinata/v2/types.d.ts +308 -0
- package/dist/esm/api/generated/schemas/iPNSKeyListResponse.d.ts +46 -0
- package/dist/esm/api/generated/schemas/iPNSKeyListResponseResponse.d.ts +10 -0
- package/dist/esm/api/generated/schemas/iPNSKeyRequest.d.ts +43 -0
- package/dist/esm/api/generated/schemas/iPNSKeyResponse.d.ts +46 -0
- package/dist/esm/api/generated/schemas/iPNSPublishRequest.d.ts +44 -0
- package/dist/esm/api/generated/schemas/iPNSPublishResponse.d.ts +46 -0
- package/dist/esm/api/generated/schemas/iPNSResolveResponse.d.ts +47 -0
- package/dist/esm/api/generated/schemas/sSLStatusInfo.d.ts +45 -0
- package/dist/esm/api/generated/schemas/websiteConfigResponse.d.ts +43 -0
- package/dist/esm/api/generated/schemas/websiteItem.d.ts +23 -0
- package/dist/esm/api/generated/schemas/websiteItemResponse.d.ts +10 -0
- package/dist/esm/api/generated/schemas/websiteRequest.d.ts +45 -0
- package/dist/esm/api/generated/schemas/websiteResponse.d.ts +23 -0
- package/dist/esm/api/generated/schemas/websiteUpdateRequest.d.ts +45 -0
- package/dist/esm/api/generated/schemas/websiteValidateResponse.d.ts +45 -0
- package/dist/esm/api/ipns.d.ts +28 -0
- package/dist/esm/api/ipns.js +83 -0
- package/dist/esm/api/ipns.js.map +1 -0
- package/dist/esm/api/websites.d.ts +48 -0
- package/dist/esm/api/websites.js +168 -0
- package/dist/esm/api/websites.js.map +1 -0
- package/dist/esm/blockstore/unstorage-base.d.ts +4 -1
- package/dist/esm/blockstore/unstorage-base.js +3 -3
- package/dist/esm/blockstore/unstorage-base.js.map +1 -1
- package/dist/esm/blockstore/unstorage.d.ts +3 -31
- package/dist/esm/blockstore/unstorage.js +2 -2
- package/dist/esm/blockstore/unstorage.js.map +1 -1
- package/dist/esm/encoder/base64.js.map +1 -1
- package/dist/esm/encoder/csv/row-formatter.js.map +1 -1
- package/dist/esm/encoder/csv.js.map +1 -1
- package/dist/esm/encoder/json.js.map +1 -1
- package/dist/esm/encoder/text.js.map +1 -1
- package/dist/esm/encoder/url.js.map +1 -1
- package/dist/esm/index.d.ts +7 -5
- package/dist/esm/index.js +5 -2
- package/dist/esm/pin/client.js +8 -5
- package/dist/esm/pin/client.js.map +1 -1
- package/dist/esm/pinner.d.ts +16 -0
- package/dist/esm/pinner.js +24 -0
- package/dist/esm/pinner.js.map +1 -1
- package/dist/esm/types/constants.js +6 -2
- package/dist/esm/types/constants.js.map +1 -1
- package/dist/esm/types/pin.d.ts +4 -1
- package/dist/esm/types/type-guards.d.ts +0 -1
- package/dist/esm/types/upload.d.ts +0 -1
- package/dist/esm/upload/base-upload.js +3 -3
- package/dist/esm/upload/base-upload.js.map +1 -1
- package/dist/esm/upload/builder.d.ts +0 -1
- package/dist/esm/upload/car.js +3 -3
- package/dist/esm/upload/car.js.map +1 -1
- package/dist/esm/upload/manager.js +5 -5
- package/dist/esm/upload/manager.js.map +1 -1
- package/dist/esm/upload/normalize.js +1 -1
- package/dist/esm/upload/normalize.js.map +1 -1
- package/dist/esm/utils/stream.d.ts +0 -3
- package/dist/esm/utils/tus-patch.js +2 -2
- package/dist/esm/utils/tus-patch.js.map +1 -1
- package/dist/esm/utils/validation.js.map +1 -1
- package/package.json +33 -32
- package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -29
- package/dist/cjs/adapters/pinata/adapter.cjs +0 -88
- package/dist/cjs/adapters/pinata/adapter.cjs.map +0 -1
- package/dist/cjs/adapters/pinata/adapter.d.cts +0 -35
- package/dist/cjs/adapters/pinata/builder.cjs +0 -194
- package/dist/cjs/adapters/pinata/builder.cjs.map +0 -1
- package/dist/cjs/adapters/pinata/index.cjs +0 -3
- package/dist/cjs/adapters/pinata/list-builder.cjs +0 -52
- package/dist/cjs/adapters/pinata/list-builder.cjs.map +0 -1
- package/dist/cjs/blockstore/index.cjs +0 -2
- package/dist/cjs/blockstore/unstorage-base.cjs +0 -240
- package/dist/cjs/blockstore/unstorage-base.cjs.map +0 -1
- package/dist/cjs/blockstore/unstorage-base.d.cts +0 -23
- package/dist/cjs/blockstore/unstorage.cjs +0 -39
- package/dist/cjs/blockstore/unstorage.cjs.map +0 -1
- package/dist/cjs/blockstore/unstorage.d.cts +0 -36
- package/dist/cjs/config.d.cts +0 -51
- package/dist/cjs/encoder/base64.cjs +0 -38
- package/dist/cjs/encoder/base64.cjs.map +0 -1
- package/dist/cjs/encoder/csv/csv-formatter.cjs +0 -81
- package/dist/cjs/encoder/csv/csv-formatter.cjs.map +0 -1
- package/dist/cjs/encoder/csv/field-formatter.cjs +0 -76
- package/dist/cjs/encoder/csv/field-formatter.cjs.map +0 -1
- package/dist/cjs/encoder/csv/row-formatter.cjs +0 -159
- package/dist/cjs/encoder/csv/row-formatter.cjs.map +0 -1
- package/dist/cjs/encoder/csv.cjs +0 -44
- package/dist/cjs/encoder/csv.cjs.map +0 -1
- package/dist/cjs/encoder/error.cjs +0 -19
- package/dist/cjs/encoder/error.cjs.map +0 -1
- package/dist/cjs/encoder/index.cjs +0 -6
- package/dist/cjs/encoder/json.cjs +0 -36
- package/dist/cjs/encoder/json.cjs.map +0 -1
- package/dist/cjs/encoder/text.cjs +0 -35
- package/dist/cjs/encoder/text.cjs.map +0 -1
- package/dist/cjs/encoder/url.cjs +0 -39
- package/dist/cjs/encoder/url.cjs.map +0 -1
- package/dist/cjs/errors/index.cjs +0 -104
- package/dist/cjs/errors/index.cjs.map +0 -1
- package/dist/cjs/errors/index.d.cts +0 -47
- package/dist/cjs/index.cjs +0 -42
- package/dist/cjs/index.d.cts +0 -14
- package/dist/cjs/pin/client.cjs +0 -96
- package/dist/cjs/pin/client.cjs.map +0 -1
- package/dist/cjs/pin/index.cjs +0 -1
- package/dist/cjs/pinner.cjs +0 -126
- package/dist/cjs/pinner.cjs.map +0 -1
- package/dist/cjs/pinner.d.cts +0 -77
- package/dist/cjs/types/constants.cjs +0 -34
- package/dist/cjs/types/constants.cjs.map +0 -1
- package/dist/cjs/types/mime-types.cjs +0 -11
- package/dist/cjs/types/mime-types.cjs.map +0 -1
- package/dist/cjs/types/mime-types.d.cts +0 -7
- package/dist/cjs/types/pin.d.cts +0 -74
- package/dist/cjs/types/pinata.d.cts +0 -99
- package/dist/cjs/types/type-guards.cjs +0 -20
- package/dist/cjs/types/type-guards.cjs.map +0 -1
- package/dist/cjs/types/type-guards.d.cts +0 -15
- package/dist/cjs/types/upload.cjs +0 -18
- package/dist/cjs/types/upload.cjs.map +0 -1
- package/dist/cjs/types/upload.d.cts +0 -189
- package/dist/cjs/upload/base-upload.cjs +0 -135
- package/dist/cjs/upload/base-upload.cjs.map +0 -1
- package/dist/cjs/upload/builder.cjs +0 -174
- package/dist/cjs/upload/builder.cjs.map +0 -1
- package/dist/cjs/upload/builder.d.cts +0 -60
- package/dist/cjs/upload/car.cjs +0 -129
- package/dist/cjs/upload/car.cjs.map +0 -1
- package/dist/cjs/upload/car.d.cts +0 -19
- package/dist/cjs/upload/constants.cjs +0 -9
- package/dist/cjs/upload/constants.cjs.map +0 -1
- package/dist/cjs/upload/index.cjs +0 -8
- package/dist/cjs/upload/manager.cjs +0 -249
- package/dist/cjs/upload/manager.cjs.map +0 -1
- package/dist/cjs/upload/manager.d.cts +0 -35
- package/dist/cjs/upload/normalize.cjs +0 -28
- package/dist/cjs/upload/normalize.cjs.map +0 -1
- package/dist/cjs/upload/tus-upload.cjs +0 -74
- package/dist/cjs/upload/tus-upload.cjs.map +0 -1
- package/dist/cjs/upload/xhr-upload.cjs +0 -41
- package/dist/cjs/upload/xhr-upload.cjs.map +0 -1
- package/dist/cjs/utils/env.cjs +0 -12
- package/dist/cjs/utils/env.cjs.map +0 -1
- package/dist/cjs/utils/stream.cjs +0 -141
- package/dist/cjs/utils/stream.cjs.map +0 -1
- package/dist/cjs/utils/stream.d.cts +0 -23
- package/dist/cjs/utils/tus-patch.cjs +0 -50
- package/dist/cjs/utils/tus-patch.cjs.map +0 -1
- package/dist/cjs/utils/validation.cjs +0 -62
- package/dist/cjs/utils/validation.cjs.map +0 -1
- package/dist/esm/adapters/pinata/adapter.d.ts +0 -35
- package/dist/esm/adapters/pinata/adapter.js +0 -87
- package/dist/esm/adapters/pinata/adapter.js.map +0 -1
- package/dist/esm/adapters/pinata/builder.d.ts +0 -1
- package/dist/esm/adapters/pinata/builder.js +0 -187
- package/dist/esm/adapters/pinata/builder.js.map +0 -1
- package/dist/esm/adapters/pinata/list-builder.d.ts +0 -1
- package/dist/esm/adapters/pinata/list-builder.js +0 -51
- package/dist/esm/adapters/pinata/list-builder.js.map +0 -1
- package/dist/esm/types/pinata.d.ts +0 -99
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stream.cjs","names":["isNodeEnvironment"],"sources":["../../../src/utils/stream.ts"],"sourcesContent":["import type { AwaitIterable } from \"interface-store\";\nimport { isNodeEnvironment } from \"./env\";\n\n/**\n * Convert a ReadableStream to a Blob.\n */\nexport async function streamToBlob(\n stream: ReadableStream<Uint8Array>,\n mimeType: string,\n): Promise<Blob> {\n const chunks: Uint8Array[] = [];\n const reader = stream.getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n return new Blob(chunks as any, { type: mimeType });\n}\n\n/**\n * Calculate the total size of a ReadableStream by consuming it.\n */\nexport async function calculateStreamSize(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): Promise<bigint> {\n let size = 0n;\n const reader = stream.getReader();\n\n while (true) {\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n size += BigInt(value.length);\n }\n\n return size;\n}\n\n/**\n * Convert an async generator to a ReadableStream.\n */\nexport function asyncGeneratorToReadableStream<T>(\n generator: AsyncGenerator<T>,\n): ReadableStream<T> {\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const item of generator) {\n controller.enqueue(item);\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n/**\n * Convert a ReadableStream to an async iterable.\n */\nexport async function* readableStreamToAsyncIterable<T>(\n stream: ReadableStream<T>,\n): AsyncIterable<T> {\n const reader = stream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Convert a web ReadableStream to a Node.js stream.Readable\n * This is needed for Node.js environments where tus-js-client expects Node streams.\n */\nexport async function readableStreamToNodeStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<import(\"stream\").Readable> {\n if (!isNodeEnvironment()) {\n throw new Error(\n \"readableStreamToNodeStream can only be used in Node.js environment\",\n );\n }\n\n const { Readable } = await import(\"stream\");\n\n // Create a single reader for the entire stream lifecycle\n // The read() method is called multiple times by Node.js, so we cannot\n // call getReader() inside it - that would create multiple readers and\n // cause \"ReadableStream is locked\" errors\n const reader = stream.getReader();\n\n return new Readable({\n async read() {\n try {\n const { done, value } = await reader.read();\n if (done) {\n reader.releaseLock();\n this.push(null);\n } else {\n this.push(Buffer.from(value));\n }\n } catch (error) {\n reader.releaseLock();\n this.destroy(error as Error);\n }\n },\n\n // Ensure reader is released if stream is destroyed\n destroy(error, callback) {\n try {\n reader.releaseLock();\n } catch (e) {\n // Ignore errors during cleanup\n }\n if (callback) callback(error);\n },\n });\n}\n\n/**\n * Convert a ReadableStream to a Blob using the Response API.\n * This is the preferred method in browser environments as it's built-in and efficient.\n */\nexport async function streamToBlobViaResponse(\n stream: ReadableStream<Uint8Array>,\n): Promise<Blob> {\n return new Response(stream).blob();\n}\n\n/**\n * Convert a File to a ReadableStream of Uint8Array without loading entire blob into memory.\n * This streams the file content chunk by chunk.\n */\nexport function fileToReadableStream(file: File): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n const reader = (file as any).stream().getReader();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n/**\n * Collect all chunks from an async iterable or iterable into a single Uint8Array.\n */\nexport async function collectAsyncIterable(\n iterable: AwaitIterable<Uint8Array>,\n): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n for await (const chunk of iterable) {\n chunks.push(chunk);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n"],"mappings":";;;;;;AAMA,eAAsB,aACpB,QACA,UACe;CACf,MAAM,SAAuB,EAAE;CAC/B,MAAM,SAAS,OAAO,WAAW;AAEjC,QAAO,MAAM;EACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KAAM;AACV,SAAO,KAAK,MAAM;;AAGpB,QAAO,IAAI,KAAK,QAAe,EAAE,MAAM,UAAU,CAAC;;;;;AAMpD,eAAsB,oBACpB,QACA,QACiB;CACjB,IAAI,OAAO;CACX,MAAM,SAAS,OAAO,WAAW;AAEjC,QAAO,MAAM;AACX,MAAI,QAAQ,QACV,OAAM,IAAI,MAAM,UAAU;EAG5B,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KAAM;AACV,UAAQ,OAAO,MAAM,OAAO;;AAG9B,QAAO;;;;;AAMT,SAAgB,+BACd,WACmB;AACnB,QAAO,IAAI,eAAe,EACxB,MAAM,MAAM,YAAY;AACtB,MAAI;AACF,cAAW,MAAM,QAAQ,UACvB,YAAW,QAAQ,KAAK;AAE1B,cAAW,OAAO;WACX,OAAO;AACd,cAAW,MAAM,MAAM;;IAG5B,CAAC;;;;;AAMJ,gBAAuB,8BACrB,QACkB;CAClB,MAAM,SAAS,OAAO,WAAW;AAEjC,KAAI;AACF,SAAO,MAAM;GACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,OAAI,KAAM;AACV,SAAM;;WAEA;AACR,SAAO,aAAa;;;;;;;AAQxB,eAAsB,2BACpB,QACoC;AACpC,KAAI,CAACA,+BAAmB,CACtB,OAAM,IAAI,MACR,qEACD;CAGH,MAAM,EAAE,aAAa,MAAM,OAAO;CAMlC,MAAM,SAAS,OAAO,WAAW;AAEjC,QAAO,IAAI,SAAS;EAClB,MAAM,OAAO;AACX,OAAI;IACF,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,QAAI,MAAM;AACR,YAAO,aAAa;AACpB,UAAK,KAAK,KAAK;UAEf,MAAK,KAAK,OAAO,KAAK,MAAM,CAAC;YAExB,OAAO;AACd,WAAO,aAAa;AACpB,SAAK,QAAQ,MAAe;;;EAKhC,QAAQ,OAAO,UAAU;AACvB,OAAI;AACF,WAAO,aAAa;YACb,GAAG;AAGZ,OAAI,SAAU,UAAS,MAAM;;EAEhC,CAAC;;;;;;AAOJ,eAAsB,wBACpB,QACe;AACf,QAAO,IAAI,SAAS,OAAO,CAAC,MAAM;;;;;;AAOpC,SAAgB,qBAAqB,MAAwC;AAC3E,QAAO,IAAI,eAA2B,EACpC,MAAM,MAAM,YAAY;AACtB,MAAI;GACF,MAAM,SAAU,KAAa,QAAQ,CAAC,WAAW;AAEjD,UAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,QAAI,MAAM;AACR,gBAAW,OAAO;AAClB;;AAEF,eAAW,QAAQ,MAAM;;WAEpB,OAAO;AACd,cAAW,MAAM,MAAM;;IAG5B,CAAC;;;;;AAMJ,eAAsB,qBACpB,UACqB;CACrB,MAAM,SAAuB,EAAE;AAC/B,YAAW,MAAM,SAAS,SACxB,QAAO,KAAK,MAAM;CAGpB,MAAM,cAAc,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,QAAQ,EAAE;CACxE,MAAM,SAAS,IAAI,WAAW,YAAY;CAC1C,IAAI,SAAS;AACb,MAAK,MAAM,SAAS,QAAQ;AAC1B,SAAO,IAAI,OAAO,OAAO;AACzB,YAAU,MAAM;;AAGlB,QAAO"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import "stream";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/stream.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Convert a ReadableStream to a Blob.
|
|
7
|
-
*/
|
|
8
|
-
declare function streamToBlob(stream: ReadableStream<Uint8Array>, mimeType: string): Promise<Blob>;
|
|
9
|
-
/**
|
|
10
|
-
* Calculate the total size of a ReadableStream by consuming it.
|
|
11
|
-
*/
|
|
12
|
-
declare function calculateStreamSize(stream: ReadableStream<Uint8Array>, signal?: AbortSignal): Promise<bigint>;
|
|
13
|
-
/**
|
|
14
|
-
* Convert an async generator to a ReadableStream.
|
|
15
|
-
*/
|
|
16
|
-
declare function asyncGeneratorToReadableStream<T>(generator: AsyncGenerator<T>): ReadableStream<T>;
|
|
17
|
-
/**
|
|
18
|
-
* Convert a ReadableStream to an async iterable.
|
|
19
|
-
*/
|
|
20
|
-
declare function readableStreamToAsyncIterable<T>(stream: ReadableStream<T>): AsyncIterable<T>;
|
|
21
|
-
//#endregion
|
|
22
|
-
export { asyncGeneratorToReadableStream, calculateStreamSize, readableStreamToAsyncIterable, streamToBlob };
|
|
23
|
-
//# sourceMappingURL=stream.d.cts.map
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
const require_env = require('./env.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/tus-patch.ts
|
|
4
|
-
/**
|
|
5
|
-
* Runtime patch for tus-js-client's NodeHttpStack Request class.
|
|
6
|
-
*
|
|
7
|
-
* PROBLEM:
|
|
8
|
-
* Code using onBeforeRequest hook may need to call abort() on the request
|
|
9
|
-
* before send() is called. However, the Request class only sets this._request
|
|
10
|
-
* inside the send() method, so getUnderlyingObject() returns null before send().
|
|
11
|
-
*
|
|
12
|
-
* SOLUTION:
|
|
13
|
-
* Patch the Request class to initialize a dummy _request object with an abort()
|
|
14
|
-
* method immediately when the request is created.
|
|
15
|
-
*
|
|
16
|
-
* NOTE:
|
|
17
|
-
* This patch is only needed in Node.js environments. In browser environments,
|
|
18
|
-
* the tus-js-client uses a different HTTP stack that doesn't have this issue.
|
|
19
|
-
*/
|
|
20
|
-
function patchTusNodeHttpStack() {
|
|
21
|
-
if (!require_env.isNodeEnvironment()) return;
|
|
22
|
-
try {
|
|
23
|
-
const tusHttpStackModule = require("tus-js-client/lib.es5/node/httpStack");
|
|
24
|
-
if (!tusHttpStackModule || !tusHttpStackModule.default) {
|
|
25
|
-
console.warn("[tus-patch] tus-js-client NodeHttpStack not found, patch skipped");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const NodeHttpStack = tusHttpStackModule.default;
|
|
29
|
-
const originalCreateRequest = NodeHttpStack.prototype.createRequest;
|
|
30
|
-
if (typeof originalCreateRequest !== "function") {
|
|
31
|
-
console.warn("[tus-patch] createRequest method not found, patch skipped");
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
NodeHttpStack.prototype.createRequest = function(method, url) {
|
|
35
|
-
const request = originalCreateRequest.call(this, method, url);
|
|
36
|
-
request._request = {
|
|
37
|
-
abort: () => {},
|
|
38
|
-
destroyed: false
|
|
39
|
-
};
|
|
40
|
-
return request;
|
|
41
|
-
};
|
|
42
|
-
console.debug("[tus-patch] Successfully patched tus-js-client NodeHttpStack");
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.warn("[tus-patch] Failed to patch tus-js-client:", error);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
//#endregion
|
|
49
|
-
exports.patchTusNodeHttpStack = patchTusNodeHttpStack;
|
|
50
|
-
//# sourceMappingURL=tus-patch.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tus-patch.cjs","names":["isNodeEnvironment"],"sources":["../../../src/utils/tus-patch.ts"],"sourcesContent":["/**\n * Runtime patch for tus-js-client's NodeHttpStack Request class.\n *\n * PROBLEM:\n * Code using onBeforeRequest hook may need to call abort() on the request\n * before send() is called. However, the Request class only sets this._request\n * inside the send() method, so getUnderlyingObject() returns null before send().\n *\n * SOLUTION:\n * Patch the Request class to initialize a dummy _request object with an abort()\n * method immediately when the request is created.\n *\n * NOTE:\n * This patch is only needed in Node.js environments. In browser environments,\n * the tus-js-client uses a different HTTP stack that doesn't have this issue.\n */\n\nimport { isNodeEnvironment } from \"./env\";\n\n// Track whether the patch has been applied to prevent multiple patches\nlet isPatched = false;\n\nexport function patchTusNodeHttpStack(): void {\n // Prevent multiple patches\n if (isPatched) {\n return;\n }\n\n // Only apply patch in Node.js environments\n if (!isNodeEnvironment()) {\n return;\n }\n\n // Find the tus-js-client NodeHttpStack module\n // It exports the default as NodeHttpStack with a nested Request class\n try {\n // Use dynamic require() to avoid bundling issues\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const tusHttpStackModule = require(\"tus-js-client/lib.es5/node/httpStack\");\n\n if (!tusHttpStackModule || !tusHttpStackModule.default) {\n console.warn(\n \"[tus-patch] tus-js-client NodeHttpStack not found, patch skipped\",\n );\n return;\n }\n\n const NodeHttpStack = tusHttpStackModule.default;\n\n // Get the original createRequest method\n const originalCreateRequest = NodeHttpStack.prototype.createRequest;\n\n if (typeof originalCreateRequest !== \"function\") {\n console.warn(\"[tus-patch] createRequest method not found, patch skipped\");\n return;\n }\n\n // Patch createRequest to set up a dummy _request on the Request instance\n NodeHttpStack.prototype.createRequest = function (\n method: string,\n url: string,\n ) {\n // Call the original createRequest to get the Request instance\n const request = originalCreateRequest.call(this, method, url);\n\n // Set a dummy _request object with an abort() method\n // This allows getUnderlyingObject().abort() to work before send() is called\n request._request = {\n abort: () => {\n // No-op abort before actual request is created\n // The real request will be created in send() and this will be replaced\n },\n // Preserve any existing properties that might be checked\n destroyed: false,\n };\n\n return request;\n };\n\n console.debug(\n \"[tus-patch] Successfully patched tus-js-client NodeHttpStack\",\n );\n } catch (error) {\n console.warn(\"[tus-patch] Failed to patch tus-js-client:\", error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,wBAA8B;AAO5C,KAAI,CAACA,+BAAmB,CACtB;AAKF,KAAI;EAGF,MAAM,qBAAqB,QAAQ,uCAAuC;AAE1E,MAAI,CAAC,sBAAsB,CAAC,mBAAmB,SAAS;AACtD,WAAQ,KACN,mEACD;AACD;;EAGF,MAAM,gBAAgB,mBAAmB;EAGzC,MAAM,wBAAwB,cAAc,UAAU;AAEtD,MAAI,OAAO,0BAA0B,YAAY;AAC/C,WAAQ,KAAK,4DAA4D;AACzE;;AAIF,gBAAc,UAAU,gBAAgB,SACtC,QACA,KACA;GAEA,MAAM,UAAU,sBAAsB,KAAK,MAAM,QAAQ,IAAI;AAI7D,WAAQ,WAAW;IACjB,aAAa;IAKb,WAAW;IACZ;AAED,UAAO;;AAGT,UAAQ,MACN,+DACD;UACM,OAAO;AACd,UAAQ,KAAK,8CAA8C,MAAM"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_index = require('../errors/index.cjs');
|
|
3
|
-
let ipaddr_js = require("ipaddr.js");
|
|
4
|
-
ipaddr_js = require_rolldown_runtime.__toESM(ipaddr_js);
|
|
5
|
-
|
|
6
|
-
//#region src/utils/validation.ts
|
|
7
|
-
/**
|
|
8
|
-
* URL validation utilities to prevent SSRF and other security issues.
|
|
9
|
-
*/
|
|
10
|
-
const BLOCKED_IPV4_RANGES = new Set([
|
|
11
|
-
"private",
|
|
12
|
-
"loopback",
|
|
13
|
-
"linkLocal",
|
|
14
|
-
"reserved",
|
|
15
|
-
"broadcast",
|
|
16
|
-
"carrierGradeNat",
|
|
17
|
-
"unspecified"
|
|
18
|
-
]);
|
|
19
|
-
const BLOCKED_IPV6_RANGES = new Set([
|
|
20
|
-
"uniqueLocal",
|
|
21
|
-
"loopback",
|
|
22
|
-
"linkLocal",
|
|
23
|
-
"reserved",
|
|
24
|
-
"multicast",
|
|
25
|
-
"ipv4Mapped",
|
|
26
|
-
"unspecified"
|
|
27
|
-
]);
|
|
28
|
-
/**
|
|
29
|
-
* Validates a URL string to ensure it's safe to fetch.
|
|
30
|
-
* Only allows HTTP/HTTPS protocols and validates the URL format.
|
|
31
|
-
*
|
|
32
|
-
* @param urlString - The URL string to validate
|
|
33
|
-
* @throws ValidationError if the URL is invalid or uses an unsafe protocol
|
|
34
|
-
*/
|
|
35
|
-
function validateUrl(urlString) {
|
|
36
|
-
if (/\s/.test(urlString)) throw new require_index.ValidationError(`Invalid URL: contains whitespace characters`, "url");
|
|
37
|
-
try {
|
|
38
|
-
const url = new URL(urlString);
|
|
39
|
-
if (url.protocol !== "http:" && url.protocol !== "https:") throw new require_index.ValidationError(`Invalid URL protocol: ${url.protocol}. Only http: and https: are allowed.`, "url");
|
|
40
|
-
const hostname = url.hostname.toLowerCase();
|
|
41
|
-
if (hostname === "localhost") throw new require_index.ValidationError("Access to localhost addresses is not allowed", "url");
|
|
42
|
-
const cleanHostname = hostname.replace(/^\[|\]$/g, "");
|
|
43
|
-
if (ipaddr_js.default.isValid(cleanHostname)) {
|
|
44
|
-
const addr = ipaddr_js.default.parse(cleanHostname);
|
|
45
|
-
if (addr.kind() === "ipv4") {
|
|
46
|
-
const range = addr.range();
|
|
47
|
-
if (BLOCKED_IPV4_RANGES.has(range)) throw new require_index.ValidationError("Access to private IP addresses is not allowed", "url");
|
|
48
|
-
}
|
|
49
|
-
if (addr.kind() === "ipv6") {
|
|
50
|
-
const range = addr.range();
|
|
51
|
-
if (BLOCKED_IPV6_RANGES.has(range)) throw new require_index.ValidationError("Access to private IP addresses is not allowed", "url");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
} catch (error) {
|
|
55
|
-
if (error instanceof require_index.ValidationError) throw error;
|
|
56
|
-
throw new require_index.ValidationError(`Invalid URL format: ${urlString}`, "url", error);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
exports.validateUrl = validateUrl;
|
|
62
|
-
//# sourceMappingURL=validation.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.cjs","names":["ValidationError","ipaddr"],"sources":["../../../src/utils/validation.ts"],"sourcesContent":["/**\n * URL validation utilities to prevent SSRF and other security issues.\n */\n\nimport { ValidationError } from \"@/errors\";\nimport ipaddr from \"ipaddr.js\";\n\nexport { ValidationError };\n\n// IPv4 ranges to block\nconst BLOCKED_IPV4_RANGES = new Set([\n \"private\", // 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16\n \"loopback\", // 127.0.0.0/8\n \"linkLocal\", // 169.254.0.0/16\n \"reserved\",\n \"broadcast\",\n \"carrierGradeNat\", // 100.64.0.0/10\n \"unspecified\", // 0.0.0.0/8\n]);\n\n// IPv6 ranges to block\nconst BLOCKED_IPV6_RANGES = new Set([\n \"uniqueLocal\", // fc00::/7\n \"loopback\", // ::1\n \"linkLocal\", // fe80::/10\n \"reserved\",\n \"multicast\", // ff00::/8\n \"ipv4Mapped\", // ::ffff:0:0/96\n \"unspecified\", // ::\n]);\n\n/**\n * Validates a URL string to ensure it's safe to fetch.\n * Only allows HTTP/HTTPS protocols and validates the URL format.\n *\n * @param urlString - The URL string to validate\n * @throws ValidationError if the URL is invalid or uses an unsafe protocol\n */\nexport function validateUrl(urlString: string): void {\n // Reject URLs with spaces or other invalid characters that shouldn't be in URLs\n if (/\\s/.test(urlString)) {\n throw new ValidationError(\n `Invalid URL: contains whitespace characters`,\n \"url\",\n );\n }\n\n try {\n const url = new URL(urlString);\n\n // Only allow HTTP and HTTPS protocols\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new ValidationError(\n `Invalid URL protocol: ${url.protocol}. Only http: and https: are allowed.`,\n \"url\",\n );\n }\n\n const hostname = url.hostname.toLowerCase();\n\n // Block localhost (case-insensitive)\n if (hostname === \"localhost\") {\n throw new ValidationError(\n \"Access to localhost addresses is not allowed\",\n \"url\",\n );\n }\n\n // Strip brackets from IPv6 addresses for ipaddr.js\n const cleanHostname = hostname.replace(/^\\[|\\]$/g, \"\");\n\n // Block IP addresses using ipaddr.js\n // This library handles alternative notations (decimal, octal, hex)\n // and comprehensive private range detection for both IPv4 and IPv6\n if (ipaddr.isValid(cleanHostname)) {\n const addr = ipaddr.parse(cleanHostname);\n\n // Check for IPv4 private ranges\n if (addr.kind() === \"ipv4\") {\n const ipv4Addr = addr as ipaddr.IPv4;\n const range = ipv4Addr.range();\n\n if (BLOCKED_IPV4_RANGES.has(range)) {\n throw new ValidationError(\n \"Access to private IP addresses is not allowed\",\n \"url\",\n );\n }\n }\n\n // Check for IPv6 private ranges\n if (addr.kind() === \"ipv6\") {\n const ipv6Addr = addr as ipaddr.IPv6;\n const range = ipv6Addr.range();\n\n if (BLOCKED_IPV6_RANGES.has(range)) {\n throw new ValidationError(\n \"Access to private IP addresses is not allowed\",\n \"url\",\n );\n }\n }\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n throw error;\n }\n throw new ValidationError(\n `Invalid URL format: ${urlString}`,\n \"url\",\n error as Error,\n );\n }\n}\n\n/**\n * Validates a URL and returns the parsed URL object if valid.\n *\n * @param urlString - The URL string to validate\n * @returns The parsed URL object\n * @throws ValidationError if the URL is invalid\n */\nexport function parseValidatedUrl(urlString: string): URL {\n validateUrl(urlString);\n return new URL(urlString);\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAGF,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;;;;;;;AASF,SAAgB,YAAY,WAAyB;AAEnD,KAAI,KAAK,KAAK,UAAU,CACtB,OAAM,IAAIA,8BACR,+CACA,MACD;AAGH,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,UAAU;AAG9B,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,SAC/C,OAAM,IAAIA,8BACR,yBAAyB,IAAI,SAAS,uCACtC,MACD;EAGH,MAAM,WAAW,IAAI,SAAS,aAAa;AAG3C,MAAI,aAAa,YACf,OAAM,IAAIA,8BACR,gDACA,MACD;EAIH,MAAM,gBAAgB,SAAS,QAAQ,YAAY,GAAG;AAKtD,MAAIC,kBAAO,QAAQ,cAAc,EAAE;GACjC,MAAM,OAAOA,kBAAO,MAAM,cAAc;AAGxC,OAAI,KAAK,MAAM,KAAK,QAAQ;IAE1B,MAAM,QADW,KACM,OAAO;AAE9B,QAAI,oBAAoB,IAAI,MAAM,CAChC,OAAM,IAAID,8BACR,iDACA,MACD;;AAKL,OAAI,KAAK,MAAM,KAAK,QAAQ;IAE1B,MAAM,QADW,KACM,OAAO;AAE9B,QAAI,oBAAoB,IAAI,MAAM,CAChC,OAAM,IAAIA,8BACR,iDACA,MACD;;;UAIA,OAAO;AACd,MAAI,iBAAiBA,8BACnB,OAAM;AAER,QAAM,IAAIA,8BACR,uBAAuB,aACvB,OACA,MACD"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Pinner } from "../../pinner.js";
|
|
2
|
-
import { PinByHashOptions, PinataFile, PinataListBuilder, PinataPin, PinataUploadBuilder, PinataUploadResult } from "../../types/pinata.js";
|
|
3
|
-
|
|
4
|
-
//#region src/adapters/pinata/adapter.d.ts
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Creates a Pinata-compatible adapter for the Pinner client.
|
|
8
|
-
* This allows users to migrate from Pinata SDK with minimal code changes.
|
|
9
|
-
*/
|
|
10
|
-
interface PinataAdapter {
|
|
11
|
-
upload: {
|
|
12
|
-
file(file: File): PinataUploadBuilder<PinataUploadResult>;
|
|
13
|
-
fileArray(files: File[]): PinataUploadBuilder<PinataUploadResult>;
|
|
14
|
-
json(data: object): PinataUploadBuilder<PinataUploadResult>;
|
|
15
|
-
base64(base64String: string): PinataUploadBuilder<PinataUploadResult>;
|
|
16
|
-
url(urlString: string): PinataUploadBuilder<PinataUploadResult>;
|
|
17
|
-
cid(cidString: string): PinataUploadBuilder<void>;
|
|
18
|
-
};
|
|
19
|
-
pinByHash(cid: string, options?: PinByHashOptions): Promise<void>;
|
|
20
|
-
unpin(cid: string): Promise<void>;
|
|
21
|
-
getPinStatus(cid: string): Promise<PinataPin>;
|
|
22
|
-
isPinned(cid: string): Promise<boolean>;
|
|
23
|
-
setPinMetadata(cid: string, metadata: Record<string, string>): Promise<void>;
|
|
24
|
-
files: {
|
|
25
|
-
list(): PinataListBuilder<PinataFile[]>;
|
|
26
|
-
get(id: string): Promise<PinataFile>;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Creates a Pinata-compatible adapter for the Pinner client.
|
|
31
|
-
*/
|
|
32
|
-
declare function pinataAdapter(pinner: Pinner): PinataAdapter;
|
|
33
|
-
//#endregion
|
|
34
|
-
export { PinataAdapter, pinataAdapter };
|
|
35
|
-
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { createBase64UploadBuilder, createCidUploadBuilder, createFileArrayUploadBuilder, createJsonUploadBuilder, createUploadBuilder, createUrlUploadBuilder } from "./builder.js";
|
|
2
|
-
import { createListBuilder } from "./list-builder.js";
|
|
3
|
-
import { CID } from "multiformats/cid";
|
|
4
|
-
|
|
5
|
-
//#region src/adapters/pinata/adapter.ts
|
|
6
|
-
/**
|
|
7
|
-
* Creates a Pinata-compatible adapter for the Pinner client.
|
|
8
|
-
*/
|
|
9
|
-
function pinataAdapter(pinner) {
|
|
10
|
-
return {
|
|
11
|
-
upload: {
|
|
12
|
-
file(file) {
|
|
13
|
-
return createUploadBuilder(pinner, file);
|
|
14
|
-
},
|
|
15
|
-
fileArray(files) {
|
|
16
|
-
return createFileArrayUploadBuilder(pinner, files);
|
|
17
|
-
},
|
|
18
|
-
json(data) {
|
|
19
|
-
return createJsonUploadBuilder(pinner, data);
|
|
20
|
-
},
|
|
21
|
-
base64(base64String) {
|
|
22
|
-
return createBase64UploadBuilder(pinner, base64String);
|
|
23
|
-
},
|
|
24
|
-
url(urlString) {
|
|
25
|
-
return createUrlUploadBuilder(pinner, urlString);
|
|
26
|
-
},
|
|
27
|
-
cid(cidString) {
|
|
28
|
-
return createCidUploadBuilder(pinner, cidString);
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
async pinByHash(cid, options) {
|
|
32
|
-
const cidObj = CID.parse(cid);
|
|
33
|
-
const generator = await pinner.pinByHash(cidObj, {
|
|
34
|
-
name: options?.name,
|
|
35
|
-
metadata: options?.keyvalues
|
|
36
|
-
});
|
|
37
|
-
for await (const _ of generator);
|
|
38
|
-
},
|
|
39
|
-
async unpin(cid) {
|
|
40
|
-
await pinner.unpin(cid);
|
|
41
|
-
},
|
|
42
|
-
async getPinStatus(cid) {
|
|
43
|
-
const cidObj = CID.parse(cid);
|
|
44
|
-
const remotePin = await pinner.getPinStatus(cidObj);
|
|
45
|
-
return {
|
|
46
|
-
id: cidObj.toString(),
|
|
47
|
-
ipfsPinHash: cidObj.toString(),
|
|
48
|
-
size: remotePin.size || 0,
|
|
49
|
-
userId: "",
|
|
50
|
-
datePinned: remotePin.created.toISOString(),
|
|
51
|
-
metadata: {
|
|
52
|
-
name: remotePin.name,
|
|
53
|
-
keyvalues: remotePin.metadata
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
},
|
|
57
|
-
async isPinned(cid) {
|
|
58
|
-
const cidObj = CID.parse(cid);
|
|
59
|
-
return pinner.isPinned(cidObj);
|
|
60
|
-
},
|
|
61
|
-
async setPinMetadata(cid, metadata) {
|
|
62
|
-
const cidObj = CID.parse(cid);
|
|
63
|
-
await pinner.setPinMetadata(cidObj, metadata);
|
|
64
|
-
},
|
|
65
|
-
files: {
|
|
66
|
-
list() {
|
|
67
|
-
return createListBuilder(pinner);
|
|
68
|
-
},
|
|
69
|
-
async get(id) {
|
|
70
|
-
const pin = (await pinner.listPins()).find((p) => p.cid.toString() === id);
|
|
71
|
-
if (!pin) throw new Error(`Pin not found: ${id}`);
|
|
72
|
-
return {
|
|
73
|
-
id: pin.cid.toString(),
|
|
74
|
-
ipfsPinHash: pin.cid.toString(),
|
|
75
|
-
size: pin.size || 0,
|
|
76
|
-
name: pin.name || "",
|
|
77
|
-
cid: pin.cid.toString(),
|
|
78
|
-
createdAt: pin.created.toISOString()
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
//#endregion
|
|
86
|
-
export { pinataAdapter };
|
|
87
|
-
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","names":[],"sources":["../../../../src/adapters/pinata/adapter.ts"],"sourcesContent":["import type { Pinner } from \"@/pinner\";\nimport {\n createBase64UploadBuilder,\n createCidUploadBuilder,\n createFileArrayUploadBuilder,\n createJsonUploadBuilder,\n createUploadBuilder,\n createUrlUploadBuilder,\n} from \"./builder\";\nimport { createListBuilder } from \"./list-builder\";\nimport type {\n PinataFile,\n PinataListBuilder,\n PinataPin,\n PinataUploadBuilder,\n PinataUploadResult,\n PinByHashOptions,\n} from \"@/types/pinata\";\nimport { CID } from \"multiformats/cid\";\n\n/**\n * Creates a Pinata-compatible adapter for the Pinner client.\n * This allows users to migrate from Pinata SDK with minimal code changes.\n */\nexport interface PinataAdapter {\n upload: {\n file(file: File): PinataUploadBuilder<PinataUploadResult>;\n fileArray(files: File[]): PinataUploadBuilder<PinataUploadResult>;\n json(data: object): PinataUploadBuilder<PinataUploadResult>;\n base64(base64String: string): PinataUploadBuilder<PinataUploadResult>;\n url(urlString: string): PinataUploadBuilder<PinataUploadResult>;\n cid(cidString: string): PinataUploadBuilder<void>;\n };\n\n pinByHash(cid: string, options?: PinByHashOptions): Promise<void>;\n unpin(cid: string): Promise<void>;\n getPinStatus(cid: string): Promise<PinataPin>;\n isPinned(cid: string): Promise<boolean>;\n setPinMetadata(cid: string, metadata: Record<string, string>): Promise<void>;\n\n files: {\n list(): PinataListBuilder<PinataFile[]>;\n get(id: string): Promise<PinataFile>;\n };\n}\n\n/**\n * Creates a Pinata-compatible adapter for the Pinner client.\n */\nexport function pinataAdapter(pinner: Pinner): PinataAdapter {\n return {\n upload: {\n file(file: File): PinataUploadBuilder<PinataUploadResult> {\n return createUploadBuilder(pinner, file);\n },\n fileArray(files: File[]): PinataUploadBuilder<PinataUploadResult> {\n return createFileArrayUploadBuilder(pinner, files);\n },\n json(data: object): PinataUploadBuilder<PinataUploadResult> {\n return createJsonUploadBuilder(pinner, data);\n },\n base64(base64String: string): PinataUploadBuilder<PinataUploadResult> {\n return createBase64UploadBuilder(pinner, base64String);\n },\n url(urlString: string): PinataUploadBuilder<PinataUploadResult> {\n return createUrlUploadBuilder(pinner, urlString);\n },\n cid(cidString: string): PinataUploadBuilder<void> {\n return createCidUploadBuilder(pinner, cidString);\n },\n },\n\n async pinByHash(cid: string, options?: PinByHashOptions): Promise<void> {\n const cidObj = CID.parse(cid);\n const generatorPromise = pinner.pinByHash(cidObj, {\n name: options?.name,\n metadata: options?.keyvalues,\n });\n\n const generator = await generatorPromise;\n for await (const _ of generator) {\n // Pin operation in progress\n }\n },\n\n async unpin(cid: string): Promise<void> {\n await pinner.unpin(cid);\n },\n\n async getPinStatus(cid: string): Promise<PinataPin> {\n const cidObj = CID.parse(cid);\n const remotePin = await pinner.getPinStatus(cidObj);\n\n return {\n id: cidObj.toString(),\n ipfsPinHash: cidObj.toString(),\n size: remotePin.size || 0,\n userId: \"\",\n datePinned: remotePin.created.toISOString(),\n metadata: {\n name: remotePin.name,\n keyvalues: remotePin.metadata,\n },\n };\n },\n\n async isPinned(cid: string): Promise<boolean> {\n const cidObj = CID.parse(cid);\n return pinner.isPinned(cidObj);\n },\n\n async setPinMetadata(\n cid: string,\n metadata: Record<string, string>,\n ): Promise<void> {\n const cidObj = CID.parse(cid);\n await pinner.setPinMetadata(cidObj, metadata);\n },\n\n files: {\n list(): PinataListBuilder<PinataFile[]> {\n return createListBuilder(pinner);\n },\n async get(id: string): Promise<PinataFile> {\n const pins = await pinner.listPins();\n const pin = pins.find((p) => p.cid.toString() === id);\n\n if (!pin) {\n throw new Error(`Pin not found: ${id}`);\n }\n\n return {\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"],"mappings":";;;;;;;;AAiDA,SAAgB,cAAc,QAA+B;AAC3D,QAAO;EACL,QAAQ;GACN,KAAK,MAAqD;AACxD,WAAO,oBAAoB,QAAQ,KAAK;;GAE1C,UAAU,OAAwD;AAChE,WAAO,6BAA6B,QAAQ,MAAM;;GAEpD,KAAK,MAAuD;AAC1D,WAAO,wBAAwB,QAAQ,KAAK;;GAE9C,OAAO,cAA+D;AACpE,WAAO,0BAA0B,QAAQ,aAAa;;GAExD,IAAI,WAA4D;AAC9D,WAAO,uBAAuB,QAAQ,UAAU;;GAElD,IAAI,WAA8C;AAChD,WAAO,uBAAuB,QAAQ,UAAU;;GAEnD;EAED,MAAM,UAAU,KAAa,SAA2C;GACtE,MAAM,SAAS,IAAI,MAAM,IAAI;GAM7B,MAAM,YAAY,MALO,OAAO,UAAU,QAAQ;IAChD,MAAM,SAAS;IACf,UAAU,SAAS;IACpB,CAAC;AAGF,cAAW,MAAM,KAAK;;EAKxB,MAAM,MAAM,KAA4B;AACtC,SAAM,OAAO,MAAM,IAAI;;EAGzB,MAAM,aAAa,KAAiC;GAClD,MAAM,SAAS,IAAI,MAAM,IAAI;GAC7B,MAAM,YAAY,MAAM,OAAO,aAAa,OAAO;AAEnD,UAAO;IACL,IAAI,OAAO,UAAU;IACrB,aAAa,OAAO,UAAU;IAC9B,MAAM,UAAU,QAAQ;IACxB,QAAQ;IACR,YAAY,UAAU,QAAQ,aAAa;IAC3C,UAAU;KACR,MAAM,UAAU;KAChB,WAAW,UAAU;KACtB;IACF;;EAGH,MAAM,SAAS,KAA+B;GAC5C,MAAM,SAAS,IAAI,MAAM,IAAI;AAC7B,UAAO,OAAO,SAAS,OAAO;;EAGhC,MAAM,eACJ,KACA,UACe;GACf,MAAM,SAAS,IAAI,MAAM,IAAI;AAC7B,SAAM,OAAO,eAAe,QAAQ,SAAS;;EAG/C,OAAO;GACL,OAAwC;AACtC,WAAO,kBAAkB,OAAO;;GAElC,MAAM,IAAI,IAAiC;IAEzC,MAAM,OADO,MAAM,OAAO,UAAU,EACnB,MAAM,MAAM,EAAE,IAAI,UAAU,KAAK,GAAG;AAErD,QAAI,CAAC,IACH,OAAM,IAAI,MAAM,kBAAkB,KAAK;AAGzC,WAAO;KACL,IAAI,IAAI,IAAI,UAAU;KACtB,aAAa,IAAI,IAAI,UAAU;KAC/B,MAAM,IAAI,QAAQ;KAClB,MAAM,IAAI,QAAQ;KAClB,KAAK,IAAI,IAAI,UAAU;KACvB,WAAW,IAAI,QAAQ,aAAa;KACrC;;GAEJ;EACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "../../pinner.js";
|
|
@@ -1,187 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "../../pinner.js";
|
|
@@ -1,51 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|