@bytescale/sdk 1.1.0 → 1.2.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 (31) hide show
  1. package/dist/browser/cjs/main.js +379 -1033
  2. package/dist/node/cjs/main.js +810 -825
  3. package/dist/node/esm/main.mjs +816 -805
  4. package/dist/types/generated/runtime.d.ts +0 -15
  5. package/dist/types/index.browser.d.ts +3 -0
  6. package/dist/types/index.node.d.ts +3 -0
  7. package/dist/types/uploads/{ChunkedStream.d.ts → private/NodeChunkedStream.d.ts} +11 -4
  8. package/dist/types/uploads/private/StreamUtils.d.ts +8 -0
  9. package/dist/types/uploads/private/TypeUtils.d.ts +1 -0
  10. package/dist/types/uploads/private/UploadManagerBase.d.ts +43 -0
  11. package/dist/types/uploads/private/model/AddCancellationHandler.d.ts +1 -0
  12. package/dist/types/uploads/private/model/OnPartProgress.d.ts +1 -0
  13. package/dist/types/uploads/private/model/PreUploadInfo.d.ts +6 -0
  14. package/dist/types/uploads/private/model/PutUploadPartResult.d.ts +4 -0
  15. package/dist/types/uploads/private/model/UploadManagerInterface.d.ts +5 -0
  16. package/dist/types/uploads/private/model/UploadSourceProcessed.d.ts +18 -0
  17. package/dist/types/uploads/public/browser/UploadManagerBrowser.d.ts +17 -0
  18. package/dist/types/uploads/public/browser/index.d.ts +1 -0
  19. package/dist/types/uploads/public/node/UploadManagerNode.d.ts +26 -0
  20. package/dist/types/uploads/public/node/index.d.ts +1 -0
  21. package/dist/types/uploads/{UploadModel.d.ts → public/shared/Model.d.ts} +8 -5
  22. package/dist/types/uploads/public/shared/index.d.ts +1 -0
  23. package/package.json +1 -1
  24. package/tests/ChunkedStream.test.ts +3 -3
  25. package/tests/UploadManager.test.ts +1 -1
  26. package/dist/browser/cjs/_70b2.main.js +0 -10
  27. package/dist/browser/cjs/_7392.main.js +0 -10
  28. package/dist/types/index.d.ts +0 -2
  29. package/dist/types/uploads/NodeUtils.d.ts +0 -13
  30. package/dist/types/uploads/UploadManager.d.ts +0 -39
  31. package/dist/types/uploads/index.d.ts +0 -3
@@ -33,21 +33,6 @@ export declare class BytescaleApiError extends Error {
33
33
  readonly details: any | undefined;
34
34
  constructor(response: ErrorResponse);
35
35
  }
36
- export declare class ResponseError extends Error {
37
- response: Response;
38
- name: "ResponseError";
39
- constructor(response: Response, msg?: string);
40
- }
41
- export declare class FetchError extends Error {
42
- cause: Error;
43
- name: "FetchError";
44
- constructor(cause: Error, msg?: string);
45
- }
46
- export declare class RequiredError extends Error {
47
- field: string;
48
- name: "RequiredError";
49
- constructor(field: string, msg?: string);
50
- }
51
36
  export declare type FetchAPI = WindowOrWorkerGlobalScope["fetch"];
52
37
  export declare type Json = any;
53
38
  export declare type HTTPMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "OPTIONS" | "HEAD";
@@ -0,0 +1,3 @@
1
+ export * from "./generated";
2
+ export * from "./uploads/public/shared";
3
+ export * from "./uploads/public/browser";
@@ -0,0 +1,3 @@
1
+ export * from "./generated";
2
+ export * from "./uploads/public/shared";
3
+ export * from "./uploads/public/node";
@@ -1,5 +1,14 @@
1
1
  /// <reference types="node" />
2
- export declare class ChunkedStream {
2
+ /**
3
+ * For Node.js streams only:
4
+ *
5
+ * Converts a stream into a stream of streams, where the next stream is requested via '.take(sizeInBytes: number): Stream'
6
+ *
7
+ * This allows the source stream to be sequentially read (in serial) as a sequence of sub-streams, for the purpose of
8
+ * issuing PutObject requests for a multipart upload, whereby each request requires its own stream, but where that stream
9
+ * needs to be a slice of the source stream.
10
+ */
11
+ export declare class NodeChunkedStream {
3
12
  private readonly source;
4
13
  private buffer;
5
14
  private consumer;
@@ -21,9 +30,7 @@ export declare class ChunkedStream {
21
30
  /**
22
31
  * Only call 'take' after the previously returned stream has been fully consumed.
23
32
  */
24
- take(bytes: number): Promise<NodeJS.ReadableStream>;
33
+ take(bytes: number): NodeJS.ReadableStream;
25
34
  private consumeFromBuffer;
26
35
  private splitBuffer;
27
- private emptyStream;
28
- private finishStream;
29
36
  }
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import type * as stream from "stream";
3
+ export declare class StreamUtils {
4
+ static create(): stream.Readable;
5
+ static empty(): NodeJS.ReadableStream;
6
+ static fromBuffer(buffer: Buffer): NodeJS.ReadableStream;
7
+ static endStream(readable: stream.Readable): void;
8
+ }
@@ -0,0 +1 @@
1
+ export declare function assertUnreachable(x: never): never;
@@ -0,0 +1,43 @@
1
+ import { BytescaleApiClientConfig, FileDetails, UploadPart } from "../../generated";
2
+ import { UploadManagerParams, UploadSource } from "../public/shared";
3
+ import { UploadManagerInterface } from "./model/UploadManagerInterface";
4
+ import { PreUploadInfo } from "./model/PreUploadInfo";
5
+ import { UploadSourceBlob } from "./model/UploadSourceProcessed";
6
+ import { PutUploadPartResult } from "./model/PutUploadPartResult";
7
+ import { AddCancellationHandler } from "./model/AddCancellationHandler";
8
+ /**
9
+ * Methods common to UploadManagerNode and UploadManagerBrowser.
10
+ */
11
+ export declare abstract class UploadManagerBase<TSource, TInit> implements UploadManagerInterface {
12
+ protected readonly config: BytescaleApiClientConfig;
13
+ protected readonly stringMimeType = "text/plain";
14
+ private readonly defaultMaxConcurrentUploadParts;
15
+ private readonly intervalMs;
16
+ private readonly uploadApi;
17
+ constructor(config: BytescaleApiClientConfig);
18
+ upload(request: UploadManagerParams): Promise<FileDetails>;
19
+ protected getBlobInfo({ value: { name, size, type } }: UploadSourceBlob): Partial<PreUploadInfo> & {
20
+ size: number;
21
+ };
22
+ protected abstract processUploadSource(data: UploadSource): TSource;
23
+ protected abstract getPreUploadInfoPartial(request: UploadManagerParams, source: TSource): Partial<PreUploadInfo> & {
24
+ size: number;
25
+ };
26
+ protected abstract preUpload(source: TSource): TInit;
27
+ protected abstract postUpload(init: TInit): Promise<void>;
28
+ protected abstract doPutUploadPart(part: UploadPart, contentLength: number, source: TSource, onProgress: (bytesSentDelta: number) => void, addCancellationHandler: AddCancellationHandler): Promise<PutUploadPartResult>;
29
+ private onIntervalTick;
30
+ private makeCancellationMethods;
31
+ private makeProgressCallback;
32
+ private assertNotCancelled;
33
+ private isCancelled;
34
+ private beginUpload;
35
+ private uploadPart;
36
+ /**
37
+ * Returns etag for the part.
38
+ */
39
+ private putUploadPart;
40
+ private getUploadPart;
41
+ private getPreUploadInfo;
42
+ private mapAsync;
43
+ }
@@ -0,0 +1 @@
1
+ export declare type AddCancellationHandler = (cancellationHandler: () => void) => void;
@@ -0,0 +1 @@
1
+ export declare type OnPartProgress = (bytesSentDelta: number) => void;
@@ -0,0 +1,6 @@
1
+ export interface PreUploadInfo {
2
+ maxConcurrentUploadParts: number;
3
+ mime: string | undefined;
4
+ originalFileName: string | undefined;
5
+ size: number;
6
+ }
@@ -0,0 +1,4 @@
1
+ export interface PutUploadPartResult {
2
+ etag: string | undefined;
3
+ status: number;
4
+ }
@@ -0,0 +1,5 @@
1
+ import { UploadManagerParams } from "../../public/shared/Model";
2
+ import { FileDetails } from "../../../generated";
3
+ export interface UploadManagerInterface {
4
+ upload: (request: UploadManagerParams) => Promise<FileDetails>;
5
+ }
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { BlobLike } from "../../public/shared/Model";
3
+ import { NodeChunkedStream } from "../NodeChunkedStream";
4
+ export interface UploadSourceBlob {
5
+ type: "Blob";
6
+ value: BlobLike;
7
+ }
8
+ export interface UploadSourceBuffer {
9
+ type: "Buffer";
10
+ value: Buffer;
11
+ }
12
+ export interface UploadSourceStream {
13
+ type: "Stream";
14
+ value: NodeChunkedStream;
15
+ }
16
+ export declare type UploadSourceProcessedIsomorphic = UploadSourceBlob;
17
+ export declare type UploadSourceProcessedBrowser = UploadSourceProcessedIsomorphic;
18
+ export declare type UploadSourceProcessedNode = UploadSourceStream | UploadSourceBuffer | UploadSourceProcessedIsomorphic;
@@ -0,0 +1,17 @@
1
+ import { UploadManagerBase } from "../../private/UploadManagerBase";
2
+ import { UploadSourceProcessedBrowser } from "../../private/model/UploadSourceProcessed";
3
+ import { UploadManagerParams, UploadSource } from "../shared";
4
+ import { PreUploadInfo } from "../../private/model/PreUploadInfo";
5
+ import { UploadPart } from "../../../generated";
6
+ import { PutUploadPartResult } from "../../private/model/PutUploadPartResult";
7
+ import { AddCancellationHandler } from "../../private/model/AddCancellationHandler";
8
+ export declare class UploadManager extends UploadManagerBase<UploadSourceProcessedBrowser, undefined> {
9
+ protected processUploadSource(data: UploadSource): UploadSourceProcessedBrowser;
10
+ protected getPreUploadInfoPartial(_request: UploadManagerParams, data: UploadSourceProcessedBrowser): Partial<PreUploadInfo> & {
11
+ size: number;
12
+ };
13
+ protected preUpload(_source: UploadSourceProcessedBrowser): undefined;
14
+ protected postUpload(_init: undefined): Promise<void>;
15
+ protected doPutUploadPart(part: UploadPart, contentLength: number, source: UploadSourceProcessedBrowser, onProgress: (bytesSentDelta: number) => void, addCancellationHandler: AddCancellationHandler): Promise<PutUploadPartResult>;
16
+ private getRequestBody;
17
+ }
@@ -0,0 +1 @@
1
+ export * from "./UploadManagerBrowser";
@@ -0,0 +1,26 @@
1
+ import { UploadManagerBase } from "../../private/UploadManagerBase";
2
+ import { UploadSourceProcessedNode } from "../../private/model/UploadSourceProcessed";
3
+ import { NodeChunkedStream } from "../../private/NodeChunkedStream";
4
+ import { UploadManagerParams, UploadSource } from "../shared";
5
+ import { PreUploadInfo } from "../../private/model/PreUploadInfo";
6
+ import { UploadPart } from "../../../generated";
7
+ import { AddCancellationHandler } from "../../private/model/AddCancellationHandler";
8
+ declare type UploadManagerNodeInit = undefined | {
9
+ chunkedStream: NodeChunkedStream;
10
+ chunkedStreamPromise: Promise<void>;
11
+ };
12
+ export declare class UploadManager extends UploadManagerBase<UploadSourceProcessedNode, UploadManagerNodeInit> {
13
+ protected processUploadSource(data: UploadSource): UploadSourceProcessedNode;
14
+ protected getPreUploadInfoPartial(request: UploadManagerParams, data: UploadSourceProcessedNode): Partial<PreUploadInfo> & {
15
+ size: number;
16
+ };
17
+ protected preUpload(source: UploadSourceProcessedNode): UploadManagerNodeInit;
18
+ protected postUpload(init: UploadManagerNodeInit): Promise<void>;
19
+ protected doPutUploadPart(part: UploadPart, contentLength: number, source: UploadSourceProcessedNode, onProgress: (bytesSentDelta: number) => void, addCancellationHandler: AddCancellationHandler): Promise<{
20
+ etag: string | undefined;
21
+ status: number;
22
+ }>;
23
+ private coerceRequestBody;
24
+ private sliceDataForRequest;
25
+ }
26
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./UploadManagerNode";
@@ -5,8 +5,7 @@
5
5
  * - Browser 'Blob', e.g. 'new Blob([JSON.stringify({someValue: 42})], {type: "application/json"})'
6
6
  * - Browser 'File', e.g. from a <input type="file" onchange="...">
7
7
  */
8
- import { BeginMultipartUploadRequest } from "../generated";
9
- import { ChunkedStream } from "./ChunkedStream";
8
+ import { BeginMultipartUploadRequest } from "../../../generated";
10
9
  export interface BlobLike {
11
10
  readonly name?: string;
12
11
  readonly size: number;
@@ -16,10 +15,14 @@ export interface BlobLike {
16
15
  export interface CancellationToken {
17
16
  isCancelled: boolean;
18
17
  }
18
+ export interface UploadProgress {
19
+ bytesSent: number;
20
+ bytesTotal: number;
21
+ progress: number;
22
+ }
19
23
  export declare class CancelledError extends Error {
20
- msg?: string | undefined;
21
24
  name: "CancelledError";
22
- constructor(msg?: string | undefined);
25
+ constructor();
23
26
  }
24
27
  export declare type UploadSource = NodeJS.ReadableStream | BlobLike | Buffer | string;
25
28
  export interface UploadManagerParams extends Omit<BeginMultipartUploadRequest, "size" | "protocol"> {
@@ -27,9 +30,9 @@ export interface UploadManagerParams extends Omit<BeginMultipartUploadRequest, "
27
30
  cancellationToken?: CancellationToken;
28
31
  data: UploadSource;
29
32
  maxConcurrentUploadParts?: number;
33
+ onProgress?: (status: UploadProgress) => void;
30
34
  /**
31
35
  * Only required if 'data' is a 'ReadableStream'.
32
36
  */
33
37
  size?: number;
34
38
  }
35
- export declare type UploadSourceProcessed = ChunkedStream | BlobLike | Buffer;
@@ -0,0 +1 @@
1
+ export * from "./Model";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytescale/sdk",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Bytescale JavaScript SDK",
5
5
  "author": "Bytescale <hello@bytescale.com> (https://www.bytescale.com)",
6
6
  "license": "MIT",
@@ -1,4 +1,4 @@
1
- import { ChunkedStream } from "../src/uploads";
1
+ import { NodeChunkedStream } from "../src/uploads/private/NodeChunkedStream";
2
2
  import { createRandomStreamFactory } from "./utils/RandomStream";
3
3
  import { streamToBuffer } from "./utils/StreamToBuffer";
4
4
 
@@ -9,7 +9,7 @@ describe("ChunkedStream", () => {
9
9
  const expectedSize = Math.pow(1024, 2) * 100; // 100MB
10
10
  const maxPartSize = Math.pow(1024, 2) * 2; // 2MB
11
11
  const expectedData = await createRandomStreamFactory(expectedSize);
12
- const chunkedStream = new ChunkedStream(expectedData());
12
+ const chunkedStream = new NodeChunkedStream(expectedData());
13
13
  const worker = chunkedStream.runChunkPipeline();
14
14
  let remaining = expectedSize;
15
15
  const buffersFromParts = Array<Buffer>();
@@ -23,7 +23,7 @@ describe("ChunkedStream", () => {
23
23
 
24
24
  const partSize = nextPartSize();
25
25
 
26
- const subStream = await chunkedStream.take(partSize);
26
+ const subStream = chunkedStream.take(partSize);
27
27
  const subStreamBuffer = await streamToBuffer(subStream);
28
28
 
29
29
  expect(subStreamBuffer.byteLength).toEqual(partSize);
@@ -1,4 +1,4 @@
1
- import { BytescaleApiClientConfig, FileApi, UploadManager } from "../src";
1
+ import { BytescaleApiClientConfig, FileApi, UploadManager } from "../src/index.node";
2
2
  import fetch from "node-fetch";
3
3
  import * as buffer from "buffer";
4
4
  import { createRandomStreamFactory } from "./utils/RandomStream";
@@ -1,10 +0,0 @@
1
- (self["webpackChunk_bytescale_sdk"] = self["webpackChunk_bytescale_sdk"] || []).push([["_70b2"],{
2
-
3
- /***/ "?70b2":
4
- /***/ (function() {
5
-
6
- /* (ignored) */
7
-
8
- /***/ })
9
-
10
- }]);
@@ -1,10 +0,0 @@
1
- (self["webpackChunk_bytescale_sdk"] = self["webpackChunk_bytescale_sdk"] || []).push([["_7392"],{
2
-
3
- /***/ "?7392":
4
- /***/ (function() {
5
-
6
- /* (ignored) */
7
-
8
- /***/ })
9
-
10
- }]);
@@ -1,2 +0,0 @@
1
- export * from "./generated";
2
- export * from "./uploads";
@@ -1,13 +0,0 @@
1
- /// <reference types="node" />
2
- import type * as stream from "stream";
3
- import type * as buffer from "buffer";
4
- import { BlobLike } from "./UploadModel";
5
- /**
6
- * Provides access to Node.js built-in libraries. Should only be called when we're certain we're running in Node.js.
7
- *
8
- * We import lazily to support browsers, which don't have these modules, but also won't call these methods so won't trigger the imports.
9
- */
10
- export declare class NodeUtils {
11
- static createStream(): Promise<stream.Readable>;
12
- static createBlob(sources: string[], options?: buffer.BlobOptions): Promise<BlobLike>;
13
- }
@@ -1,39 +0,0 @@
1
- import { FileDetails, BytescaleApiClientConfig } from "../generated";
2
- import { UploadManagerParams } from "./UploadModel";
3
- export declare class UploadManager {
4
- private readonly config;
5
- private readonly stringMimeType;
6
- private readonly defaultMaxConcurrentUploadParts;
7
- private readonly uploadApi;
8
- constructor(config: BytescaleApiClientConfig);
9
- upload(request: UploadManagerParams): Promise<FileDetails>;
10
- private checkIfCancelled;
11
- private beginUpload;
12
- private uploadPart;
13
- /**
14
- * Returns etag for the part.
15
- */
16
- private putUploadPart;
17
- private coerceRequestBody;
18
- private makeRequestBody;
19
- private bufferToStream;
20
- /**
21
- * Only expected to be called in Node.js environments, and as such, we can assume 'BlobLike' is not a DOM 'File' object.
22
- */
23
- private blobToBuffer;
24
- private sliceDataForRequest;
25
- private isNodeJs;
26
- private getUploadPart;
27
- private calculateSize;
28
- private calculateMime;
29
- private calculateOriginalFileName;
30
- private calculateMaxConcurrency;
31
- private getChunkedStream;
32
- private foldData;
33
- private foldDataRaw;
34
- private processUploadSource;
35
- private stringToBlob;
36
- private globalBlob;
37
- private nodeJsBlob;
38
- private mapAsync;
39
- }
@@ -1,3 +0,0 @@
1
- export * from "./ChunkedStream";
2
- export * from "./UploadModel";
3
- export * from "./UploadManager";