insite-ws-transfers 1.0.472 → 2.0.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 (40) hide show
  1. package/bun.lockb +0 -0
  2. package/dist/IncomingTransfer.d.ts +65 -0
  3. package/dist/IncomingTransfer.d.ts.map +1 -0
  4. package/dist/IncomingTransport.d.ts +25 -0
  5. package/dist/IncomingTransport.d.ts.map +1 -0
  6. package/dist/OutgoingTransfer.d.ts +72 -0
  7. package/dist/OutgoingTransfer.d.ts.map +1 -0
  8. package/dist/OutgoingTransport.d.ts +16 -0
  9. package/dist/OutgoingTransport.d.ts.map +1 -0
  10. package/dist/StringStreamer.d.ts +17 -0
  11. package/dist/StringStreamer.d.ts.map +1 -0
  12. package/dist/browser/FileStreamer.d.ts +18 -0
  13. package/dist/browser/FileStreamer.d.ts.map +1 -0
  14. package/dist/browser/arrayBufferToBase64.d.ts +2 -0
  15. package/dist/browser/arrayBufferToBase64.d.ts.map +1 -0
  16. package/dist/browser/incoming.d.ts +11 -0
  17. package/dist/browser/incoming.d.ts.map +1 -0
  18. package/dist/browser/index.d.ts +3 -0
  19. package/dist/browser/index.d.ts.map +1 -0
  20. package/dist/browser/index.js +2 -0
  21. package/dist/browser/index.js.map +7 -0
  22. package/dist/browser/outgoing.d.ts +11 -0
  23. package/dist/browser/outgoing.d.ts.map +1 -0
  24. package/dist/common.d.ts +17 -0
  25. package/dist/common.d.ts.map +1 -0
  26. package/dist/node/incoming.d.ts +24 -0
  27. package/dist/node/incoming.d.ts.map +1 -0
  28. package/dist/node/index.d.ts +3 -0
  29. package/dist/node/index.d.ts.map +1 -0
  30. package/dist/node/index.js +2 -0
  31. package/dist/node/index.js.map +7 -0
  32. package/dist/node/outgoing.d.ts +15 -0
  33. package/dist/node/outgoing.d.ts.map +1 -0
  34. package/dist/types.d.ts +79 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/package.json +15 -11
  37. package/dist/browser.js +0 -2
  38. package/dist/browser.js.map +0 -7
  39. package/dist/node.js +0 -2
  40. package/dist/node.js.map +0 -7
package/bun.lockb CHANGED
Binary file
@@ -0,0 +1,65 @@
1
+ import { InSiteWebSocket } from "insite-ws/client";
2
+ import { InSiteWebSocketServer, InSiteWebSocketServerClient } from "insite-ws/server";
3
+ import { StringKey } from "@nesvet/n";
4
+ import { callArgsSymbol } from "./common";
5
+ import { IncomingTransport } from "./IncomingTransport";
6
+ import { IncomingChunk, IncomingData, IncomingTransferListener, IncomingTransferProps, IncomingTransferTypes } from "./types";
7
+ export declare class IncomingTransfer<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {
8
+ #private;
9
+ constructor(transport: IncomingTransport<PT, FT>, ws: InSiteWebSocket | InSiteWebSocketServerClient, kind: string, id: string, { type, collect, encoding, size, metadata }: IncomingTransferProps<StringKey<FT["types"]>>);
10
+ transport: IncomingTransport<PT, FT>;
11
+ ws: InSiteWebSocket | InSiteWebSocketServerClient;
12
+ [callArgsSymbol]: [InSiteWebSocket] | [InSiteWebSocketServer, InSiteWebSocketServerClient];
13
+ kind: string;
14
+ id: string;
15
+ type: string;
16
+ collect: boolean;
17
+ encoding: IncomingTransferProps<StringKey<FT["types"]>>["encoding"];
18
+ size: number;
19
+ metadata: Record<string, unknown>;
20
+ listeners: Set<IncomingTransferListener<FT>>;
21
+ data?: IncomingData;
22
+ isAborted: boolean;
23
+ isAbortedBySender: boolean;
24
+ isAbortedByReceiver: boolean;
25
+ isTransfered: boolean;
26
+ confirmResponse?: string;
27
+ beginAt: null | number;
28
+ duration: null | number;
29
+ transferedSize: number;
30
+ processedSize: number;
31
+ bytesPerMs: null | number;
32
+ progress: number;
33
+ endAt: null | number;
34
+ error: Error | null;
35
+ whenSetUp(): Promise<void>;
36
+ confirm(): Promise<void | null>;
37
+ handleChunk(chunk: IncomingChunk, length?: number): void;
38
+ handleSent(): void;
39
+ abort(bySender?: boolean): void;
40
+ throw(errorMessage: string, sendToSender?: boolean): void;
41
+ serialize(): {
42
+ id: string;
43
+ kind: string;
44
+ type: string;
45
+ collect: boolean;
46
+ encoding: "base64" | "buffer" | "utf8";
47
+ size: number;
48
+ metadata: Record<string, unknown>;
49
+ isAborted: boolean;
50
+ isAbortedBySender: boolean;
51
+ isAbortedByReceiver: boolean;
52
+ isTransfered: boolean;
53
+ confirmResponse: string | undefined;
54
+ beginAt: number | null;
55
+ duration: number | null;
56
+ transferedSize: number;
57
+ processedSize: number;
58
+ bytesPerMs: number | null;
59
+ progress: number;
60
+ endAt: number | null;
61
+ error: Error | null;
62
+ };
63
+ static readonly types: IncomingTransferTypes<typeof IncomingTransfer>;
64
+ }
65
+ //# sourceMappingURL=IncomingTransfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncomingTransfer.d.ts","sourceRoot":"","sources":["../src/IncomingTransfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACN,cAAc,EAKd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAEN,aAAa,EACb,YAAY,EACZ,wBAAwB,EAExB,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,SAAS,CAAC;AAGjB,qBAAa,gBAAgB,CAAC,EAAE,SAAS,OAAO,iBAAiB,EAAE,EAAE,SAAS,OAAO,gBAAgB;;gBAEnG,SAAS,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,EACpC,EAAE,EAAE,eAAe,GAAG,2BAA2B,EACjD,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAsB3F,SAAS,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,EAAE,EAAE,eAAe,GAAG,2BAA2B,CAAC;IAClD,CAAC,cAAc,CAAC,EAAE,CAAE,eAAe,CAAE,GAAG,CAAE,qBAAqB,EAAE,2BAA2B,CAAE,CAAC;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7C,IAAI,CAAC,EAAE,YAAY,CAAC;IAGpB,SAAS,UAAS;IAClB,iBAAiB,UAAS;IAC1B,mBAAmB,UAAS;IAC5B,YAAY,UAAS;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,IAAI,GAAG,MAAM,CAAQ;IAI9B,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAQ;IAC/B,cAAc,SAAK;IACnB,aAAa,SAAK;IAClB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAQ;IACjC,QAAQ,SAAK;IACb,KAAK,EAAE,IAAI,GAAG,MAAM,CAAQ;IAC5B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAQ;IAmB3B,SAAS;IAIH,OAAO;IAyBb,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,SAAe;IA6CvD,UAAU;IAkCV,KAAK,CAAC,QAAQ,UAAQ;IAStB,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,UAAO;IAiB/C,SAAS;;;;;;;;;;;;;;;;;;;;;;IA0BT,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,gBAAgB,CAAC,CAuDnE;CAEF"}
@@ -0,0 +1,25 @@
1
+ import { InSiteWebSocket } from "insite-ws/client";
2
+ import { InSiteWebSocketServer } from "insite-ws/server";
3
+ import { listenersSymbol, transfersSymbol } from "./common";
4
+ import { IncomingTransfer } from "./IncomingTransfer";
5
+ import { IncomingTransferListener } from "./types";
6
+ type Options = {
7
+ sizeLimit?: number;
8
+ };
9
+ export declare class IncomingTransport<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {
10
+ constructor(ws: InSiteWebSocket | InSiteWebSocketServer, options?: Options);
11
+ sizeLimit: number;
12
+ [listenersSymbol]: Map<string, Set<IncomingTransferListener<FT>>>;
13
+ addTransferListener(kind: string, listener: IncomingTransferListener<FT>): this;
14
+ on: (kind: string, listener: IncomingTransferListener<FT>) => this;
15
+ removeTransferListener(kind: string, listener?: IncomingTransferListener<FT>): this;
16
+ off: (kind: string, listener?: IncomingTransferListener<FT>) => this;
17
+ [transfersSymbol]: Map<string, InstanceType<FT>>;
18
+ private handleRequest;
19
+ private handleChunk;
20
+ private handleSent;
21
+ private handleAbort;
22
+ static Transfer: typeof IncomingTransfer;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=IncomingTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncomingTransport.d.ts","sourceRoot":"","sources":["../src/IncomingTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAA+B,MAAM,kBAAkB,CAAC;AAEtF,OAAO,EAGN,eAAe,EACf,eAAe,EACf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAEN,wBAAwB,EAGxB,MAAM,SAAS,CAAC;AAGjB,KAAK,OAAO,GAAG;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAGF,qBAAa,iBAAiB,CAAC,EAAE,SAAS,OAAO,iBAAiB,EAAE,EAAE,SAAS,OAAO,gBAAgB;gBACzF,EAAE,EAAE,eAAe,GAAG,qBAAqB,EAAE,OAAO,GAAE,OAAY;IAsB9E,SAAS,EAAE,MAAM,CAAC;IAElB,CAAC,eAAe,CAAC,iDAAwD;IAEzE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,wBAAwB,CAAC,EAAE,CAAC;IAOxE,EAAE,SAPwB,MAAM,YAAY,yBAAyB,EAAE,CAAC,UAO1C;IAE9B,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,wBAAwB,CAAC,EAAE,CAAC;IAS5E,GAAG,SAT0B,MAAM,aAAa,yBAAyB,EAAE,CAAC,UAS1C;IAElC,CAAC,eAAe,CAAC,gCAAuC;IAExD,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,WAAW;IAMnB,MAAM,CAAC,QAAQ,0BAAoB;CAEnC"}
@@ -0,0 +1,72 @@
1
+ import { InSiteWebSocket } from "insite-ws/client";
2
+ import { InSiteWebSocketServer, InSiteWebSocketServerClient } from "insite-ws/server";
3
+ import { FileStreamer } from "./browser/FileStreamer";
4
+ import { callArgsSymbol } from "./common";
5
+ import { OutgoingTransport } from "./OutgoingTransport";
6
+ import { StringStreamer } from "./StringStreamer";
7
+ import { OutgoingChunk, OutgoingData, OutgoingTransferProps, OutgoingTransferTypes } from "./types";
8
+ export declare class OutgoingTransfer<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {
9
+ #private;
10
+ constructor(transport: OutgoingTransport<PT, FT>, ws: InSiteWebSocket | InSiteWebSocketServerClient, kind: string, { data, type, incomingType, collect, metadata, size, chunkSize, encoding, incomingEncoding, onBegin, onSenderProgress, onProgress, onEnd, onError }: OutgoingTransferProps<FT>);
11
+ transport: OutgoingTransport<PT, FT>;
12
+ ws: InSiteWebSocket | InSiteWebSocketServerClient;
13
+ [callArgsSymbol]: [InSiteWebSocket] | [InSiteWebSocketServer, InSiteWebSocketServerClient];
14
+ kind: string;
15
+ data?: OutgoingData;
16
+ type: string;
17
+ collect: boolean;
18
+ metadata: Record<string, unknown>;
19
+ size: number;
20
+ chunkSize: number;
21
+ encoding: OutgoingTransferProps<FT>["encoding"];
22
+ onBegin?: OutgoingTransferProps<FT>["onBegin"];
23
+ onSenderProgress?: OutgoingTransferProps<FT>["onSenderProgress"];
24
+ onProgress?: OutgoingTransferProps<FT>["onProgress"];
25
+ onEnd?: OutgoingTransferProps<FT>["onEnd"];
26
+ onError?: OutgoingTransferProps<FT>["onError"];
27
+ id: string;
28
+ isAborted: boolean;
29
+ isTransfered: boolean;
30
+ confirmResponse?: string;
31
+ beginAt: null | number;
32
+ duration: null | number;
33
+ transferedSize: number;
34
+ bytesPerMs: null | number;
35
+ senderProgress: number;
36
+ progress: number;
37
+ endAt: null | number;
38
+ error: Error | null;
39
+ stringStreamer?: StringStreamer;
40
+ fileStreamer?: FileStreamer;
41
+ whenSetUp(): Promise<void>;
42
+ handleConfirm(confirmResponse: string): Promise<void>;
43
+ handleChunk: (chunk: OutgoingChunk) => void;
44
+ sent: () => void;
45
+ handleProgress(progress: number): void;
46
+ handleCompleted(): Promise<void>;
47
+ throw(errorMessage: string): void;
48
+ abort(): void;
49
+ serialize(): {
50
+ id: string;
51
+ kind: string;
52
+ type: string;
53
+ collect: boolean;
54
+ encoding: "base64" | "buffer" | "utf8";
55
+ size: number;
56
+ metadata: Record<string, unknown>;
57
+ isAborted: boolean;
58
+ isTransfered: boolean;
59
+ confirmResponse: string | undefined;
60
+ beginAt: number | null;
61
+ duration: number | null;
62
+ transferedSize: number;
63
+ bytesPerMs: number | null;
64
+ senderProgress: number;
65
+ progress: number;
66
+ endAt: number | null;
67
+ error: Error | null;
68
+ };
69
+ static readonly types: OutgoingTransferTypes<typeof OutgoingTransfer>;
70
+ static chunkSize: number;
71
+ }
72
+ //# sourceMappingURL=OutgoingTransfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutgoingTransfer.d.ts","sourceRoot":"","sources":["../src/OutgoingTransfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { InSiteWebSocket } from "insite-ws/client";
2
+ import { InSiteWebSocketServer, InSiteWebSocketServerClient } from "insite-ws/server";
3
+ import { transfersSymbol } from "./common";
4
+ import { OutgoingTransfer } from "./OutgoingTransfer";
5
+ import { OutgoingTransferProps } from "./types";
6
+ export declare class OutgoingTransport<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {
7
+ constructor(ws: InSiteWebSocket | InSiteWebSocketServer);
8
+ [transfersSymbol]: Map<string, InstanceType<FT>>;
9
+ transfer(ws: InSiteWebSocket | InSiteWebSocketServerClient, kind: string, props: OutgoingTransferProps<FT>): OutgoingTransfer<typeof OutgoingTransport, FT>;
10
+ private handleConfirm;
11
+ private handleProgress;
12
+ private handleCompleted;
13
+ private handleError;
14
+ static Transfer: typeof OutgoingTransfer;
15
+ }
16
+ //# sourceMappingURL=OutgoingTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutgoingTransport.d.ts","sourceRoot":"","sources":["../src/OutgoingTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAW,eAAe,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAA0B,MAAM,SAAS,CAAC;AAGxE,qBAAa,iBAAiB,CAAC,EAAE,SAAS,OAAO,iBAAiB,EAAE,EAAE,SAAS,OAAO,gBAAgB;gBACzF,EAAE,EAAE,eAAe,GAAG,qBAAqB;IAgBvD,CAAC,eAAe,CAAC,gCAAuC;IAExD,QAAQ,CAAC,EAAE,EAAE,eAAe,GAAG,2BAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,EAAE,CAAC;IAM1G,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,WAAW;IAMnB,MAAM,CAAC,QAAQ,0BAAoB;CAEnC"}
@@ -0,0 +1,17 @@
1
+ import { StreamerOptions } from "./types";
2
+ type Listener = {
3
+ (chunk: string): Promise<void> | void;
4
+ };
5
+ export declare class StringStreamer {
6
+ #private;
7
+ constructor(string: string, options?: StreamerOptions);
8
+ string: string;
9
+ size: number;
10
+ chunkSize: number;
11
+ listener?: Listener;
12
+ isAborted: boolean;
13
+ start(listener: Listener): void;
14
+ abort(): void;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=StringStreamer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringStreamer.d.ts","sourceRoot":"","sources":["../src/StringStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,QAAQ,GAAG;IACf,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtC,CAAC;AAGF,qBAAa,cAAc;;gBACd,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAYzD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAKpB,SAAS,UAAS;IAElB,KAAK,CAAC,QAAQ,EAAE,QAAQ;IA2BxB,KAAK;CAML"}
@@ -0,0 +1,18 @@
1
+ import { ArrayBufferWithLength, StreamerOptions } from "../types";
2
+ type Listener = {
3
+ (arrayBuffer: ArrayBufferWithLength): Promise<void> | void;
4
+ };
5
+ export declare class FileStreamer {
6
+ #private;
7
+ constructor(file: File, options?: StreamerOptions);
8
+ file: File;
9
+ size: number;
10
+ chunkSize: number;
11
+ fileReader: FileReader;
12
+ listener?: Listener;
13
+ isAborted: boolean;
14
+ start(listener: Listener): void;
15
+ abort(): void;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=FileStreamer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStreamer.d.ts","sourceRoot":"","sources":["../../src/browser/FileStreamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGlE,KAAK,QAAQ,GAAG;IACf,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAGF,qBAAa,YAAY;;gBACZ,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,eAAoB;IAiBrD,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAKpB,SAAS,UAAS;IAElB,KAAK,CAAC,QAAQ,EAAE,QAAQ;IAmCxB,KAAK;CAML"}
@@ -0,0 +1,2 @@
1
+ export declare function arrayBufferToBase64(arrayBuffer: ArrayBuffer): Promise<string>;
2
+ //# sourceMappingURL=arrayBufferToBase64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrayBufferToBase64.d.ts","sourceRoot":"","sources":["../../src/browser/arrayBufferToBase64.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAY7E"}
@@ -0,0 +1,11 @@
1
+ import { IncomingTransfer } from "../IncomingTransfer";
2
+ import { IncomingTransport } from "../IncomingTransport";
3
+ import { IncomingTransferTypes } from "../types";
4
+ declare class BrowserIncomingTransfer extends IncomingTransfer<typeof BrowserIncomingTransport, typeof BrowserIncomingTransfer> {
5
+ static types: IncomingTransferTypes<typeof BrowserIncomingTransfer>;
6
+ }
7
+ declare class BrowserIncomingTransport extends IncomingTransport<typeof BrowserIncomingTransport, typeof BrowserIncomingTransfer> {
8
+ static Transfer: typeof BrowserIncomingTransfer;
9
+ }
10
+ export { BrowserIncomingTransfer as IncomingTransfer, BrowserIncomingTransport as IncomingTransport };
11
+ //# sourceMappingURL=incoming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming.d.ts","sourceRoot":"","sources":["../../src/browser/incoming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGjD,cAAM,uBAAwB,SAAQ,gBAAgB,CAAC,OAAO,wBAAwB,EAAE,OAAO,uBAAuB,CAAC;IAEtH,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAyBjE;CAEF;AAED,cAAM,wBAAyB,SAAQ,iBAAiB,CAAC,OAAO,wBAAwB,EAAE,OAAO,uBAAuB,CAAC;IAExH,MAAM,CAAC,QAAQ,iCAA2B;CAE1C;AAGD,OAAO,EACN,uBAAuB,IAAI,gBAAgB,EAC3C,wBAAwB,IAAI,iBAAiB,EAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./incoming";
2
+ export * from "./outgoing";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ var Ie=Object.defineProperty;var ae=n=>{throw TypeError(n)};var Ae=(n,e,t)=>e in n?Ie(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var s=(n,e,t)=>Ae(n,typeof e!="symbol"?e+"":e,t),H=(n,e,t)=>e.has(n)||ae("Cannot "+t);var r=(n,e,t)=>(H(n,e,"read from private field"),t?t.call(n):e.get(n)),h=(n,e,t)=>e.has(n)?ae("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),l=(n,e,t,i)=>(H(n,e,"write to private field"),i?i.call(n,t):e.set(n,t),t),g=(n,e,t)=>(H(n,e,"access private method"),t);var a={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},c=Symbol("transfers"),u=Symbol("listeners"),he=10*1024*1024*1024,le=1024*256,d=Symbol("callArgs"),ce=250;var fe,B,p,P,C,T,W,$,m,ge,V,X;fe=d;var y=class{constructor(e,t,i,o,{type:f,collect:M,encoding:R,size:z,metadata:G}){h(this,m);s(this,"transport");s(this,"ws");s(this,fe);s(this,"kind");s(this,"id");s(this,"type");s(this,"collect");s(this,"encoding");s(this,"size");s(this,"metadata");s(this,"listeners");h(this,B);s(this,"data");h(this,p);s(this,"isAborted",!1);s(this,"isAbortedBySender",!1);s(this,"isAbortedByReceiver",!1);s(this,"isTransfered",!1);s(this,"confirmResponse");s(this,"beginAt",null);h(this,P,null);h(this,C,[]);h(this,T,!1);s(this,"duration",null);s(this,"transferedSize",0);s(this,"processedSize",0);s(this,"bytesPerMs",null);s(this,"progress",0);s(this,"endAt",null);s(this,"error",null);h(this,W);h(this,$,0);this.transport=e,this.ws=t,this[d]="wss"in t?[t.wss,t]:[t],this.kind=i,this.id=o,this.type=f,this.collect=!!M,this.encoding=R,this.size=z,this.metadata=G,this.listeners=this.transport[u].get(this.kind),this.transport[c].set(this.id,this),l(this,B,g(this,m,ge).call(this))}whenSetUp(){return r(this,B)}async confirm(){let e=this[d];for(let{begin:t}of this.listeners)if(await t?.call(...e,this)===!1)return this.throw("Transfer was rejected by receiver");return this.beginAt=l(this,P,Date.now()),this.ws.sendMessage(a.confirm,this.id,this.confirmResponse),l(this,W,setInterval(()=>{r(this,$)!==this.progress&&(l(this,$,this.progress),this.ws.sendMessage(a.progress,this.id,this.progress))},ce)),null}handleChunk(e,t=e.length){let i=Date.now();this.bytesPerMs=t/(i-r(this,P)),l(this,P,i),this.transferedSize+=t,r(this,C).push([e,t]),r(this,T)||(l(this,T,!0),g(this,m,V).call(this))}handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,r(this,T)||g(this,m,X).call(this)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,t=!0){this.transport[c].delete(this.id),clearInterval(r(this,W)),this.error=new Error(e);let i=this[d];for(let{error:o}of this.listeners)o?.call(...i,this,this.error);t&&this.ws.sendMessage(a.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}};B=new WeakMap,p=new WeakMap,P=new WeakMap,C=new WeakMap,T=new WeakMap,W=new WeakMap,$=new WeakMap,m=new WeakSet,ge=async function(){if(l(this,p,this.constructor.types[this.type]),r(this,p))await r(this,p).setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);this.confirm()},V=async function(){let[e,t]=r(this,C).shift();r(this,p).transformChunk&&(e=await r(this,p).transformChunk.call(this,e)),this.collect&&await r(this,p).collect.call(this,e);let i=this[d];for(let{chunk:o,progress:f}of this.listeners)await(o??f)?.call(...i,this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),r(this,C).length?g(this,m,V).call(this):(l(this,T,!1),this.isTransfered&&g(this,m,X).call(this))},X=async function(){this.progress=1,await r(this,p).done?.call(this);let e=this[d];for(let{end:t}of this.listeners)await t?.call(...e,this);clearInterval(r(this,W)),this.transport[c].delete(this.id),this.ws.sendMessage(a.completed,this.id)},s(y,"types",{object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}});var de,pe;pe=u,de=c;var E=class{constructor(e,t={}){s(this,"sizeLimit");s(this,pe,new Map);s(this,"on",this.addTransferListener);s(this,"off",this.removeTransferListener);s(this,de,new Map);let{sizeLimit:i=he}=t;this.sizeLimit=i,e.isWebSocketServer?(e.on(`client-message:${a.request}`,(o,...f)=>this.handleRequest(o,...f)),e.on(`client-message:${a.chunk}`,(o,...f)=>this.handleChunk(o,...f)),e.on(`client-message:${a.sent}`,(o,...f)=>this.handleSent(o,...f)),e.on(`client-message:${a.abort}`,(o,...f)=>this.handleAbort(o,...f))):(e.on(`message:${a.request}`,(...o)=>this.handleRequest(e,...o)),e.on(`message:${a.chunk}`,(...o)=>this.handleChunk(e,...o)),e.on(`message:${a.sent}`,(...o)=>this.handleSent(e,...o)),e.on(`message:${a.abort}`,(...o)=>this.handleAbort(e,...o)))}addTransferListener(e,t){return this[u].get(e)?.add(t)??this[u].set(e,new Set([t])),this}removeTransferListener(e,t){return t?this[u].get(e)?.delete(t):this[u].delete(e),this}handleRequest(e,t,i,{type:o,size:f,metadata:M,...R}){let{Transfer:z}=this.constructor;this[u].has(t)?this[c].has(i)?e.sendMessage(a.error,i,"Transfer already exists"):o in z.types?f>this.sizeLimit?e.sendMessage(a.error,i,`Transfer size (${f} bytes) exeeds limit of ${this.sizeLimit} bytes`):new z(this,e,t,i,{type:o,size:f,metadata:M,...R}):e.sendMessage(a.error,i,"Unknown type of transfer"):e.sendMessage(a.error,i,`Unknown kind of file "${t}"`)}handleChunk(e,t,i,o=i.length){this[c].get(t)?.handleChunk(i,o)}handleSent(e,t){this[c].get(t)?.handleSent()}handleAbort(e,t){this[c].get(t)?.abort(!0)}};s(E,"Transfer",y);var K=class extends y{};s(K,"types",{file:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}},...y.types});var Y=class extends E{};s(Y,"Transfer",K);import{uid as ze}from"@nesvet/n";var F,k,D,Z,v=class{constructor(e,t={}){h(this,D);s(this,"string");s(this,"size");s(this,"chunkSize");s(this,"listener");h(this,F,0);h(this,k,0);s(this,"isAborted",!1);this.string=e,this.size=this.string.length;let{chunkSize:i=1024*256}=t;this.chunkSize=i}start(e){this.listener=e,g(this,D,Z).call(this)}abort(){this.isAborted=!0}};F=new WeakMap,k=new WeakMap,D=new WeakSet,Z=async function(){if(!this.isAborted){l(this,k,Math.min(r(this,F)+this.chunkSize,this.size));let e=await new Promise(t=>{t(this.string.slice(r(this,F),r(this,k)))});this.isAborted||(await this.listener(e),r(this,k)<this.size&&(l(this,F,r(this,k)),g(this,D,Z).call(this)))}};var me,q,b,w,O,x,I,ue,_;me=d;var S=class{constructor(e,t,i,{data:o,type:f,incomingType:M,collect:R,metadata:z,size:G,chunkSize:be,encoding:Te,incomingEncoding:ke,onBegin:se,onSenderProgress:ie,onProgress:re,onEnd:ne,onError:oe}){h(this,I);s(this,"transport");s(this,"ws");s(this,me);s(this,"kind");s(this,"data");s(this,"type");s(this,"collect");s(this,"metadata");s(this,"size");s(this,"chunkSize");s(this,"encoding");s(this,"onBegin");s(this,"onSenderProgress");s(this,"onProgress");s(this,"onEnd");s(this,"onError");h(this,q);s(this,"id",ze());h(this,b);s(this,"isAborted",!1);s(this,"isTransfered",!1);s(this,"confirmResponse");s(this,"beginAt",null);h(this,w,null);h(this,O,[]);h(this,x,!1);s(this,"duration",null);s(this,"transferedSize",0);s(this,"bytesPerMs",null);s(this,"senderProgress",0);s(this,"progress",0);s(this,"endAt",null);s(this,"error",null);s(this,"stringStreamer");s(this,"fileStreamer");s(this,"handleChunk",e=>{r(this,O).push(e),r(this,x)||(l(this,x,!0),g(this,I,_).call(this))});s(this,"sent",()=>this.ws.sendMessage(a.sent,this.id));this.transport=e,this.ws=t,this[d]="wss"in t?[t.wss,t]:[t],this.kind=i,this.data=o,this.type=f,this.collect=R??!1,this.metadata=z,this.size=G??null,this.encoding=Te,this.chunkSize=be??this.constructor.chunkSize,se&&(this.onBegin=se),ie&&(this.onSenderProgress=ie),re&&(this.onProgress=re),ne&&(this.onEnd=ne),oe&&(this.onError=oe),this.transport[c].set(this.id,this),l(this,q,g(this,I,ue).call(this,M,ke))}whenSetUp(){return r(this,q)}async handleConfirm(e){this.confirmResponse=e,this.beginAt=l(this,w,Date.now());let t=this[d];await this.onBegin?.call(...t,this),r(this,b).confirm.call(this)}handleProgress(e){this.progress=e;let t=this[d];this.onProgress?.call(...t,this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.transport[c].delete(this.id);let e=this[d];this.progress!==1&&(this.progress=1,await this.onProgress?.call(...e,this)),this.onEnd?.call(...e,this)}throw(e){this.transport[c].delete(this.id),this.error=new Error(e);let t=this[d];this.onError?.call(...t,this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(a.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}};q=new WeakMap,b=new WeakMap,w=new WeakMap,O=new WeakMap,x=new WeakMap,I=new WeakSet,ue=async function(e,t){for(let[i,o,f]of this.constructor.types)if(this.type===i||o(this.data)){this.type=i,l(this,b,f);break}if(this.type)await r(this,b).setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(a.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:t??this.encoding,size:this.size,metadata:this.metadata})},_=async function(){let e=r(this,O).shift(),t=e.length;r(this,b).transformChunk&&(e=await r(this,b).transformChunk.call(this,e)),this.ws.sendMessage(a.chunk,this.id,e,t);let i=Date.now();this.bytesPerMs=t/(i-r(this,w)),l(this,w,i),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size);let o=this[d];await this.onSenderProgress?.call(...o,this),r(this,O).length?g(this,I,_).call(this):(l(this,x,!1),this.senderProgress===1&&this.sent())},s(S,"types",[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new v(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new v(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new v(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),s(S,"chunkSize",le);var Se;Se=c;var U=class{constructor(e){s(this,Se,new Map);e.isWebSocketServer?(e.on(`client-message:${a.confirm}`,(t,...i)=>this.handleConfirm(t,...i)),e.on(`client-message:${a.progress}`,(t,...i)=>this.handleProgress(t,...i)),e.on(`client-message:${a.completed}`,(t,...i)=>this.handleCompleted(t,...i)),e.on(`client-message:${a.error}`,(t,...i)=>this.handleError(t,...i))):(e.on(`message:${a.confirm}`,(...t)=>this.handleConfirm(e,...t)),e.on(`message:${a.progress}`,(...t)=>this.handleProgress(e,...t)),e.on(`message:${a.completed}`,(...t)=>this.handleCompleted(e,...t)),e.on(`message:${a.error}`,(...t)=>this.handleError(e,...t)))}transfer(e,t,i){let{Transfer:o}=this.constructor;return new o(this,e,t,i)}handleConfirm(e,t,i){this[c].get(t)?.handleConfirm(i)}handleProgress(e,t,i){this[c].get(t)?.handleProgress(i)}handleCompleted(e,t){this[c].get(t)?.handleCompleted()}handleError(e,t,i){this[c].get(t)?.throw(i)}};s(U,"Transfer",S);function ye(n){return new Promise(e=>{let t=new FileReader;t.onload=()=>e(typeof t?.result=="string"?t.result.slice(Math.max(0,t.result.indexOf(",")+1)):""),t.readAsDataURL(new Blob([n]))})}var L,A,j,ee,N,J=class{constructor(e,t={}){h(this,j);s(this,"file");s(this,"size");s(this,"chunkSize");s(this,"fileReader");s(this,"listener");h(this,L,0);h(this,A,0);s(this,"isAborted",!1);h(this,N,async()=>{if(!this.isAborted){let e=this.fileReader.result;e.length=e.byteLength,await this.listener(e),r(this,A)<this.size&&(l(this,L,r(this,A)),g(this,j,ee).call(this))}});this.file=e,this.size=this.file.size;let{chunkSize:i=1024*256}=t;this.chunkSize=i,this.fileReader=new FileReader,this.fileReader.onload=r(this,N)}start(e){this.listener=e,g(this,j,ee).call(this)}abort(){this.isAborted=!0}};L=new WeakMap,A=new WeakMap,j=new WeakSet,ee=function(){this.isAborted||(l(this,A,Math.min(r(this,L)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(r(this,L),r(this,A))))},N=new WeakMap;var Q=class extends S{};s(Q,"types",[["file",e=>typeof e=="object"&&e instanceof File,{setup(){let e=this.data;this.fileStreamer=new J(e,{chunkSize:this.chunkSize});let t={name:e.name,type:e.type,size:e.size,modifiedAt:e.lastModified};this.metadata?Object.assign(this.metadata,t):this.metadata=t,this.size=this.fileStreamer.size,this.encoding="buffer"},confirm(){this.fileStreamer.start(this.handleChunk)},transformChunk(e){return ye(e)}}],...S.types]);var te=class extends U{};s(te,"Transfer",Q);export{K as IncomingTransfer,Y as IncomingTransport,Q as OutgoingTransfer,te as OutgoingTransport};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/common.ts", "../../src/IncomingTransfer.ts", "../../src/IncomingTransport.ts", "../../src/browser/incoming.ts", "../../src/OutgoingTransfer.ts", "../../src/StringStreamer.ts", "../../src/OutgoingTransport.ts", "../../src/browser/arrayBufferToBase64.ts", "../../src/browser/FileStreamer.ts", "../../src/browser/outgoing.ts"],
4
+ "sourcesContent": ["export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const transfersSymbol = Symbol(\"transfers\");\nexport const listenersSymbol = Symbol(\"listeners\");\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const callArgsSymbol = Symbol(\"callArgs\");\n\nexport const progressInterval = 250;\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { StringKey } from \"@nesvet/n\";\nimport {\n\tcallArgsSymbol,\n\theaders,\n\tlistenersSymbol,\n\tprogressInterval,\n\ttransfersSymbol\n} from \"./common\";\nimport { IncomingTransport } from \"./IncomingTransport\";\nimport {\n\tCallArgs,\n\tIncomingChunk,\n\tIncomingData,\n\tIncomingTransferListener,\n\tIncomingTransferMethods,\n\tIncomingTransferProps,\n\tIncomingTransferTypes\n} from \"./types\";\n\n\nexport class IncomingTransfer<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {\n\tconstructor(\n\t\ttransport: IncomingTransport<PT, FT>,\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, collect, encoding, size, metadata }: IncomingTransferProps<StringKey<FT[\"types\"]>>\n\t) {\n\t\t\n\t\tthis.transport = transport;\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = \"wss\" in ws ? [ ws.wss!, ws ] as const : [ ws as InSiteWebSocket ] as const;\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.listeners = this.transport[listenersSymbol].get(this.kind)!;\n\t\t\n\t\tthis.transport[transfersSymbol].set(this.id, this as InstanceType<FT>);\n\t\t\n\t\tthis.#setupPromise = this.#setup();\n\t\t\n\t}\n\t\n\ttransport: IncomingTransport<PT, FT>;\n\tws: InSiteWebSocket | InSiteWebSocketServerClient;\n\t[callArgsSymbol]: [ InSiteWebSocket ] | [ InSiteWebSocketServer, InSiteWebSocketServerClient ];\n\tkind: string;\n\tid: string;\n\ttype: string;\n\tcollect: boolean;\n\tencoding: IncomingTransferProps<StringKey<FT[\"types\"]>>[\"encoding\"];\n\tsize: number;\n\tmetadata: Record<string, unknown>;\n\tlisteners: Set<IncomingTransferListener<FT>>;\n\t#setupPromise: Promise<void>;\n\tdata?: IncomingData;\n\t\n\t#methods?: IncomingTransferMethods<FT>;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: null | number = null;\n\t#prevChunkAt: null | number = null;\n\t#chunksQueue: [ chunk: IncomingChunk, length: number ][] = [];\n\t#isProcessing = false;\n\tduration: null | number = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs: null | number = null;\n\tprogress = 0;\n\tendAt: null | number = null;\n\terror: Error | null = null;\n\t\n\t\n\t#progressInterval?: NodeJS.Timeout;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = ((this.constructor as FT).types as IncomingTransferTypes<FT>)[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this as InstanceType<FT>);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${String(this.type)}\"`);\n\t\t\n\t\tthis.confirm();\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { begin } of this.listeners)\n\t\t\tif (await begin?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t\treturn null;\n\t}\n\t\n\thandleChunk(chunk: IncomingChunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift()!;// eslint-disable-line prefer-const\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods!.collect.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.listeners)\n\t\t\tawait (chunkListener ?? progressListener)?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tthis.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\thandleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tthis.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods!.done?.call(this as InstanceType<FT>);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { end } of this.listeners)\n\t\t\tawait end?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage: string, sendToSender = true) {\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { error } of this.listeners)\n\t\t\terror?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, this.error);\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic readonly types: IncomingTransferTypes<typeof IncomingTransfer> = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type};base64,${this.data}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { StringKey } from \"@nesvet/n\";\nimport {\n\tsizeLimit as defaultSizeLimit,\n\theaders,\n\tlistenersSymbol,\n\ttransfersSymbol\n} from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\nimport {\n\tIncomingChunk,\n\tIncomingTransferListener,\n\tIncomingTransferProps,\n\tParametersWithoutFirst\n} from \"./types\";\n\n\ntype Options = {\n\tsizeLimit?: number;\n};\n\n\nexport class IncomingTransport<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {\n\tconstructor(ws: InSiteWebSocket | InSiteWebSocketServer, options: Options = {}) {\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.request}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.request}`, (...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(ws, ...args));\n\t\t\tws.on(`message:${headers.chunk}`, (...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(ws, ...args));\n\t\t\tws.on(`message:${headers.sent}`, (...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(ws, ...args));\n\t\t\tws.on(`message:${headers.abort}`, (...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(ws, ...args));\n\t\t}\n\t\t\n\t}\n\t\n\tsizeLimit: number;\n\t\n\t[listenersSymbol] = new Map<string, Set<IncomingTransferListener<FT>>>();\n\t\n\taddTransferListener(kind: string, listener: IncomingTransferListener<FT>) {\n\t\tthis[listenersSymbol].get(kind)?.add(listener) ??\n\t\tthis[listenersSymbol].set(kind, new Set([ listener ]));\n\t\t\n\t\treturn this;\n\t}\n\t\n\ton = this.addTransferListener;\n\t\n\tremoveTransferListener(kind: string, listener?: IncomingTransferListener<FT>) {\n\t\tif (listener)\n\t\t\tthis[listenersSymbol].get(kind)?.delete(listener);\n\t\telse\n\t\t\tthis[listenersSymbol].delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toff = this.removeTransferListener;\n\t\n\t[transfersSymbol] = new Map<string, InstanceType<FT>>();\n\t\n\tprivate handleRequest(\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, size, metadata, ...restProps }: IncomingTransferProps<StringKey<FT[\"types\"]>>\n\t) {\n\t\t\n\t\tconst { Transfer } = this.constructor as PT;\n\t\t\n\t\tif (!this[listenersSymbol].has(kind))\n\t\t\tws.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (this[transfersSymbol].has(id))\n\t\t\tws.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!(type in Transfer.types))\n\t\t\tws.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tws.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tnew Transfer(this as InstanceType<PT>, ws, kind, id, { type, size, metadata, ...restProps });\n\t\t\n\t}\n\t\n\tprivate handleChunk(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, chunk: IncomingChunk, length = chunk.length) {\n\t\tthis[transfersSymbol].get(id)?.handleChunk(chunk, length);\n\t\t\n\t}\n\t\n\tprivate handleSent(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tprivate handleAbort(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.abort(true);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = IncomingTransfer;\n\t\n}\n", "import { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\nimport { IncomingTransferTypes } from \"../types\";\n\n\nclass BrowserIncomingTransfer extends IncomingTransfer<typeof BrowserIncomingTransport, typeof BrowserIncomingTransfer> {\n\t\n\tstatic types: IncomingTransferTypes<typeof BrowserIncomingTransfer> = {\n\t\t\n\t\tfile: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect && this.encoding === \"utf8\")\n\t\t\t\t\tthis.data = atob(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\t...IncomingTransfer.types\n\t\t\n\t};\n\t\n}\n\nclass BrowserIncomingTransport extends IncomingTransport<typeof BrowserIncomingTransport, typeof BrowserIncomingTransfer> {\n\t\n\tstatic Transfer = BrowserIncomingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserIncomingTransfer as IncomingTransfer,\n\tBrowserIncomingTransport as IncomingTransport\n};\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { uid } from \"@nesvet/n\";\nimport { FileStreamer } from \"./browser/FileStreamer\";\nimport {\n\tcallArgsSymbol,\n\tchunkSize as defaultChunkSize,\n\theaders,\n\ttransfersSymbol\n} from \"./common\";\nimport { OutgoingTransport } from \"./OutgoingTransport\";\nimport { StringStreamer } from \"./StringStreamer\";\nimport {\n\tCallArgs,\n\tOutgoingChunk,\n\tOutgoingData,\n\tOutgoingTransferMethods,\n\tOutgoingTransferProps,\n\tOutgoingTransferTypes\n} from \"./types\";\n\n\n// FIXME\n\n\nexport class OutgoingTransfer<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {\n\tconstructor(\n\t\ttransport: OutgoingTransport<PT, FT>,\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\t{\n\t\t\tdata,\n\t\t\ttype,\n\t\t\tincomingType,\n\t\t\tcollect,\n\t\t\tmetadata,\n\t\t\tsize,\n\t\t\tchunkSize,\n\t\t\tencoding,\n\t\t\tincomingEncoding,\n\t\t\tonBegin,\n\t\t\tonSenderProgress,\n\t\t\tonProgress,\n\t\t\tonEnd,\n\t\t\tonError\n\t\t}: OutgoingTransferProps<FT>\n\t) {\n\t\t\n\t\tthis.transport = transport;\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = \"wss\" in ws ? [ ws.wss!, ws ] as const : [ ws as InSiteWebSocket ] as const;\n\t\tthis.kind = kind;\n\t\tthis.data = data;\n\t\tthis.type = type;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? (this.constructor as typeof OutgoingTransfer).chunkSize;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.onError = onError;\n\t\t\n\t\tthis.transport[transfersSymbol].set(this.id, this as InstanceType<FT>);\n\t\t\n\t\tthis.#setupPromise = this.#setup(incomingType, incomingEncoding);\n\t\t\n\t}\n\t\n\ttransport: OutgoingTransport<PT, FT>;\n\tws: InSiteWebSocket | InSiteWebSocketServerClient;\n\t[callArgsSymbol]: [ InSiteWebSocket ] | [ InSiteWebSocketServer, InSiteWebSocketServerClient ];\n\tkind: string;\n\tdata?: OutgoingData;\n\ttype: string;\n\tcollect: boolean;\n\tmetadata: Record<string, unknown>;\n\tsize: number;\n\tchunkSize: number;\n\tencoding: OutgoingTransferProps<FT>[\"encoding\"];\n\tonBegin?: OutgoingTransferProps<FT>[\"onBegin\"];\n\tonSenderProgress?: OutgoingTransferProps<FT>[\"onSenderProgress\"];\n\tonProgress?: OutgoingTransferProps<FT>[\"onProgress\"];\n\tonEnd?: OutgoingTransferProps<FT>[\"onEnd\"];\n\tonError?: OutgoingTransferProps<FT>[\"onError\"];\n\t#setupPromise: Promise<void>;\n\t\n\tid = uid();\n\t#methods?: OutgoingTransferMethods<FT>;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: null | number = null;\n\t#prevChunkAt: null | number = null;\n\t#chunksQueue: OutgoingChunk[] = [];\n\t#isProcessing = false;\n\tduration: null | number = null;\n\ttransferedSize = 0;\n\tbytesPerMs: null | number = null;\n\tsenderProgress = 0;\n\tprogress: number = 0;\n\tendAt: null | number = null;\n\terror: Error | null = null;\n\tstringStreamer?: StringStreamer;\n\tfileStreamer?: FileStreamer;\n\t\n\tasync #setup(incomingType?: string, incomingEncoding?: string) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of (this.constructor as typeof OutgoingTransfer).types)\n\t\t\tif (this.type === availableType || test(this.data as string)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods!.setup.call(this as InstanceType<FT>);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\ttype: incomingType ?? this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata\n\t\t});\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync handleConfirm(confirmResponse: string) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tawait this.onBegin?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tthis.#methods!.confirm.call(this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\thandleChunk = (chunk: OutgoingChunk) => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift()!;\n\t\t\n\t\tconst chunkLength = chunk.length!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tawait this.onSenderProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress: number) {\n\t\tthis.progress = progress;\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tthis.onProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait this.onProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t}\n\t\t\n\t\tthis.onEnd?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\tthrow(errorMessage: string) {\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tthis.onError?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic readonly types: OutgoingTransferTypes<typeof OutgoingTransfer> = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = (this.data as string).split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data as string, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = defaultChunkSize;\n\t\n}\n", "import { StreamerOptions } from \"./types\";\n\n\ntype Listener = {\n\t(chunk: string): Promise<void> | void;\n};\n\n\nexport class StringStreamer {\n\tconstructor(string: string, options: StreamerOptions = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\tstring: string;\n\tsize: number;\n\tchunkSize: number;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise<string>(resolve => { resolve(this.string.slice(this.#start, this.#end)); });\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener!(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tthis.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { headers, transfersSymbol } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\nimport { OutgoingTransferProps, ParametersWithoutFirst } from \"./types\";\n\n\nexport class OutgoingTransport<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {\n\tconstructor(ws: InSiteWebSocket | InSiteWebSocketServer) {\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.confirm}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.error}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.confirm}`, (...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(ws, ...args));\n\t\t\tws.on(`message:${headers.progress}`, (...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(ws, ...args));\n\t\t\tws.on(`message:${headers.completed}`, (...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(ws, ...args));\n\t\t\tws.on(`message:${headers.error}`, (...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(ws, ...args));\n\t\t}\n\t\t\n\t}\n\t\n\t[transfersSymbol] = new Map<string, InstanceType<FT>>();\n\t\n\ttransfer(ws: InSiteWebSocket | InSiteWebSocketServerClient, kind: string, props: OutgoingTransferProps<FT>) {\n\t\tconst { Transfer } = this.constructor as PT;\n\t\t\n\t\treturn new Transfer(this as InstanceType<PT>, ws, kind, props);\n\t}\n\t\n\tprivate handleConfirm(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, confirmResponse: string) {\n\t\tthis[transfersSymbol].get(id)?.handleConfirm(confirmResponse);\n\t\t\n\t}\n\t\n\tprivate handleProgress(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, progress: number) {\n\t\tthis[transfersSymbol].get(id)?.handleProgress(progress);\n\t\t\n\t}\n\t\n\tprivate handleCompleted(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.handleCompleted();\n\t\t\n\t}\n\t\n\tprivate handleError(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, errorMessage: string) {\n\t\tthis[transfersSymbol].get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = OutgoingTransfer;\n\t\n}\n", "export function arrayBufferToBase64(arrayBuffer: ArrayBuffer): Promise<string> {\n\treturn new Promise(resolve => {\n\t\t\n\t\tconst fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tfileReader.onload = () =>\n\t\t\tresolve(typeof fileReader?.result == \"string\" ? fileReader.result.slice(Math.max(0, (fileReader.result as string).indexOf(\",\") + 1)) : \"\");\n\t\t\n\t\tfileReader.readAsDataURL(new Blob([ arrayBuffer ]));\n\t\t\n\t});\n}\n", "import { ArrayBufferWithLength, StreamerOptions } from \"../types\";\n\n\ntype Listener = {\n\t(arrayBuffer: ArrayBufferWithLength): Promise<void> | void;\n};\n\n\nexport class FileStreamer {\n\tconstructor(file: File, options: StreamerOptions = {}) {\n\t\tthis.file = file;\n\t\tthis.size = this.file.size;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t\tthis.fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tthis.fileReader.onload = this.#handleFileReaderLoad;\n\t\t\n\t}\n\t\n\tfile: File;\n\tsize: number;\n\tchunkSize: number;\n\tfileReader: FileReader;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\t#next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\t// eslint-disable-next-line unicorn/prefer-blob-reading-methods\n\t\t\tthis.fileReader.readAsArrayBuffer(this.file.slice(this.#start, this.#end));\n\t\t}\n\t\t\n\t}\n\t\n\t#handleFileReaderLoad = async () => {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tconst arrayBuffer = this.fileReader.result as ArrayBufferWithLength;\n\t\t\tarrayBuffer.length = arrayBuffer.byteLength;\n\t\t\t\n\t\t\tawait this.listener!(arrayBuffer);\n\t\t\t\n\t\t\tif (this.#end < this.size) {\n\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\n\t\t\t\tthis.#next();\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\nimport { OutgoingTransferTypes } from \"../types\";\nimport { arrayBufferToBase64 } from \"./arrayBufferToBase64\";\nimport { FileStreamer } from \"./FileStreamer\";\n\n\nclass BrowserOutgoingTransfer extends OutgoingTransfer<typeof BrowserOutgoingTransport, typeof BrowserOutgoingTransfer> {\n\t\n\tstatic types: OutgoingTransferTypes<typeof BrowserOutgoingTransfer> = [\n\t\t\n\t\t[ \"file\", data => typeof data == \"object\" && data instanceof File, {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst file = this.data as File;\n\t\t\t\t\n\t\t\t\tthis.fileStreamer = new FileStreamer(file, { chunkSize: this.chunkSize });\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmodifiedAt: file.lastModified\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t\tthis.size = this.fileStreamer.size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.fileStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn arrayBufferToBase64(chunk as Buffer);\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.types\n\t\t\n\t];\n\t\n}\n\nclass BrowserOutgoingTransport extends OutgoingTransport<typeof BrowserOutgoingTransport, typeof BrowserOutgoingTransfer> {\n\t\n\tstatic Transfer = BrowserOutgoingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserOutgoingTransfer as OutgoingTransfer,\n\tBrowserOutgoingTransport as OutgoingTransport\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["headers", "transfersSymbol", "listenersSymbol", "sizeLimit", "chunkSize", "callArgsSymbol", "progressInterval", "_a", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_progressInterval", "_lastProgress", "_IncomingTransfer_instances", "setup_fn", "process_fn", "complete_fn", "callArgsSymbol", "IncomingTransfer", "transport", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "__privateAdd", "__publicField", "listenersSymbol", "transfersSymbol", "__privateSet", "__privateMethod", "__privateGet", "callArgs", "begin", "headers", "progressInterval", "chunk", "length", "ts", "bySender", "errorMessage", "sendToSender", "error", "chunkListener", "progressListener", "end", "_a", "_b", "listenersSymbol", "transfersSymbol", "IncomingTransport", "ws", "options", "__publicField", "sizeLimit", "headers", "wssc", "args", "kind", "listener", "id", "type", "size", "metadata", "restProps", "Transfer", "chunk", "length", "IncomingTransfer", "BrowserIncomingTransfer", "IncomingTransfer", "__publicField", "chunk", "BrowserIncomingTransport", "IncomingTransport", "uid", "_start", "_end", "_StringStreamer_instances", "next_fn", "StringStreamer", "string", "options", "__privateAdd", "__publicField", "chunkSize", "listener", "__privateMethod", "__privateSet", "__privateGet", "chunk", "resolve", "_a", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_OutgoingTransfer_instances", "setup_fn", "process_fn", "callArgsSymbol", "OutgoingTransfer", "transport", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "__privateAdd", "__publicField", "uid", "chunk", "__privateGet", "__privateSet", "__privateMethod", "headers", "transfersSymbol", "confirmResponse", "callArgs", "progress", "errorMessage", "availableType", "test", "methods", "chunkLength", "ts", "StringStreamer", "_a", "transfersSymbol", "OutgoingTransport", "ws", "__publicField", "headers", "wssc", "args", "kind", "props", "Transfer", "id", "confirmResponse", "progress", "errorMessage", "OutgoingTransfer", "arrayBufferToBase64", "arrayBuffer", "resolve", "fileReader", "_start", "_end", "_FileStreamer_instances", "next_fn", "_handleFileReaderLoad", "FileStreamer", "file", "options", "__privateAdd", "__publicField", "arrayBuffer", "__privateGet", "__privateSet", "__privateMethod", "chunkSize", "listener", "BrowserOutgoingTransfer", "OutgoingTransfer", "__publicField", "data", "file", "FileStreamer", "metadata", "chunk", "arrayBufferToBase64", "BrowserOutgoingTransport", "OutgoingTransport"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import { OutgoingTransfer } from "../OutgoingTransfer";
2
+ import { OutgoingTransport } from "../OutgoingTransport";
3
+ import { OutgoingTransferTypes } from "../types";
4
+ declare class BrowserOutgoingTransfer extends OutgoingTransfer<typeof BrowserOutgoingTransport, typeof BrowserOutgoingTransfer> {
5
+ static types: OutgoingTransferTypes<typeof BrowserOutgoingTransfer>;
6
+ }
7
+ declare class BrowserOutgoingTransport extends OutgoingTransport<typeof BrowserOutgoingTransport, typeof BrowserOutgoingTransfer> {
8
+ static Transfer: typeof BrowserOutgoingTransfer;
9
+ }
10
+ export { BrowserOutgoingTransfer as OutgoingTransfer, BrowserOutgoingTransport as OutgoingTransport };
11
+ //# sourceMappingURL=outgoing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outgoing.d.ts","sourceRoot":"","sources":["../../src/browser/outgoing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAKjD,cAAM,uBAAwB,SAAQ,gBAAgB,CAAC,OAAO,wBAAwB,EAAE,OAAO,uBAAuB,CAAC;IAEtH,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,uBAAuB,CAAC,CAwCjE;CAEF;AAED,cAAM,wBAAyB,SAAQ,iBAAiB,CAAC,OAAO,wBAAwB,EAAE,OAAO,uBAAuB,CAAC;IAExH,MAAM,CAAC,QAAQ,iCAA2B;CAE1C;AAGD,OAAO,EACN,uBAAuB,IAAI,gBAAgB,EAC3C,wBAAwB,IAAI,iBAAiB,EAC7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const headers: {
2
+ request: string;
3
+ confirm: string;
4
+ chunk: string;
5
+ progress: string;
6
+ sent: string;
7
+ completed: string;
8
+ abort: string;
9
+ error: string;
10
+ };
11
+ export declare const transfersSymbol: unique symbol;
12
+ export declare const listenersSymbol: unique symbol;
13
+ export declare const sizeLimit: number;
14
+ export declare const chunkSize: number;
15
+ export declare const callArgsSymbol: unique symbol;
16
+ export declare const progressInterval = 250;
17
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;;;;;;CASnB,CAAC;AAEF,eAAO,MAAM,eAAe,eAAsB,CAAC;AACnD,eAAO,MAAM,eAAe,eAAsB,CAAC;AAEnD,eAAO,MAAM,SAAS,QAA0B,CAAC;AAEjD,eAAO,MAAM,SAAS,QAAa,CAAC;AAEpC,eAAO,MAAM,cAAc,eAAqB,CAAC;AAEjD,eAAO,MAAM,gBAAgB,MAAM,CAAC"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { Readable, type Writable } from "node:stream";
3
+ import { IncomingTransfer } from "../IncomingTransfer";
4
+ import { IncomingTransport } from "../IncomingTransport";
5
+ import { IncomingTransferTypes } from "../types";
6
+ declare class TransferStream extends Readable {
7
+ constructor(writableStream: Writable);
8
+ writable: Writable;
9
+ promise: Promise<void>;
10
+ _read(): void;
11
+ }
12
+ /** @this NodeIncomingTransfer */
13
+ declare function pipeTo(this: NodeIncomingTransfer, writableStream: Writable): Writable;
14
+ declare class NodeIncomingTransfer extends IncomingTransfer<typeof NodeIncomingTransport, typeof NodeIncomingTransfer> {
15
+ streams?: TransferStream[];
16
+ isBuffer?: boolean;
17
+ pipeTo?: typeof pipeTo | undefined;
18
+ static types: IncomingTransferTypes<typeof NodeIncomingTransfer>;
19
+ }
20
+ declare class NodeIncomingTransport extends IncomingTransport<typeof NodeIncomingTransport, typeof NodeIncomingTransfer> {
21
+ static Transfer: typeof NodeIncomingTransfer;
22
+ }
23
+ export { NodeIncomingTransfer as IncomingTransfer, NodeIncomingTransport as IncomingTransport };
24
+ //# sourceMappingURL=incoming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incoming.d.ts","sourceRoot":"","sources":["../../src/node/incoming.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAA2B,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAG1E,cAAM,cAAe,SAAQ,QAAQ;gBACxB,cAAc,EAAE,QAAQ;IAepC,QAAQ,EAAE,QAAQ,CAAC;IAEnB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,KAAK;CAEL;AAED,iCAAiC;AACjC,iBAAS,MAAM,CAAC,IAAI,EAAE,oBAAoB,EAAE,cAAc,EAAE,QAAQ,YAOnE;AAuDD,cAAM,oBAAqB,SAAQ,gBAAgB,CAAC,OAAO,qBAAqB,EAAE,OAAO,oBAAoB,CAAC;IAE7G,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAS;IAC3B,MAAM,CAAC,4BAAU;IAGjB,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,oBAAoB,CAAC,CAQ9D;CACF;AAED,cAAM,qBAAsB,SAAQ,iBAAiB,CAAC,OAAO,qBAAqB,EAAE,OAAO,oBAAoB,CAAC;IAE/G,MAAM,CAAC,QAAQ,8BAAwB;CAEvC;AAGD,OAAO,EACN,oBAAoB,IAAI,gBAAgB,EACxC,qBAAqB,IAAI,iBAAiB,EAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./incoming";
2
+ export * from "./outgoing";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{Readable as N}from"node:stream";var i={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},a=Symbol("transfers"),l=Symbol("listeners"),z=10*1024*1024*1024,F=1024*256,h=Symbol("callArgs"),v=250;var c=class{constructor(e,t,s,r,{type:o,collect:m,encoding:p,size:g,metadata:T}){this.transport=e,this.ws=t,this[h]="wss"in t?[t.wss,t]:[t],this.kind=s,this.id=r,this.type=o,this.collect=!!m,this.encoding=p,this.size=g,this.metadata=T,this.listeners=this.transport[l].get(this.kind),this.transport[a].set(this.id,this),this.#s=this.#l()}transport;ws;[h];kind;id;type;collect;encoding;size;metadata;listeners;#s;data;#e;isAborted=!1;isAbortedBySender=!1;isAbortedByReceiver=!1;isTransfered=!1;confirmResponse;beginAt=null;#t=null;#i=[];#r=!1;duration=null;transferedSize=0;processedSize=0;bytesPerMs=null;progress=0;endAt=null;error=null;#n;#o=0;async#l(){if(this.#e=this.constructor.types[this.type],this.#e)await this.#e.setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);this.confirm()}whenSetUp(){return this.#s}async confirm(){let e=this[h];for(let{begin:t}of this.listeners)if(await t?.call(...e,this)===!1)return this.throw("Transfer was rejected by receiver");return this.beginAt=this.#t=Date.now(),this.ws.sendMessage(i.confirm,this.id,this.confirmResponse),this.#n=setInterval(()=>{this.#o!==this.progress&&(this.#o=this.progress,this.ws.sendMessage(i.progress,this.id,this.progress))},v),null}handleChunk(e,t=e.length){let s=Date.now();this.bytesPerMs=t/(s-this.#t),this.#t=s,this.transferedSize+=t,this.#i.push([e,t]),this.#r||(this.#r=!0,this.#a())}async#a(){let[e,t]=this.#i.shift();this.#e.transformChunk&&(e=await this.#e.transformChunk.call(this,e)),this.collect&&await this.#e.collect.call(this,e);let s=this[h];for(let{chunk:r,progress:o}of this.listeners)await(r??o)?.call(...s,this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),this.#i.length?this.#a():(this.#r=!1,this.isTransfered&&this.#h())}handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#r||this.#h()}async#h(){this.progress=1,await this.#e.done?.call(this);let e=this[h];for(let{end:t}of this.listeners)await t?.call(...e,this);clearInterval(this.#n),this.transport[a].delete(this.id),this.ws.sendMessage(i.completed,this.id)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,t=!0){this.transport[a].delete(this.id),clearInterval(this.#n),this.error=new Error(e);let s=this[h];for(let{error:r}of this.listeners)r?.call(...s,this,this.error);t&&this.ws.sendMessage(i.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}static types={object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}}};var u=class{constructor(e,t={}){let{sizeLimit:s=z}=t;this.sizeLimit=s,e.isWebSocketServer?(e.on(`client-message:${i.request}`,(r,...o)=>this.handleRequest(r,...o)),e.on(`client-message:${i.chunk}`,(r,...o)=>this.handleChunk(r,...o)),e.on(`client-message:${i.sent}`,(r,...o)=>this.handleSent(r,...o)),e.on(`client-message:${i.abort}`,(r,...o)=>this.handleAbort(r,...o))):(e.on(`message:${i.request}`,(...r)=>this.handleRequest(e,...r)),e.on(`message:${i.chunk}`,(...r)=>this.handleChunk(e,...r)),e.on(`message:${i.sent}`,(...r)=>this.handleSent(e,...r)),e.on(`message:${i.abort}`,(...r)=>this.handleAbort(e,...r)))}sizeLimit;[l]=new Map;addTransferListener(e,t){return this[l].get(e)?.add(t)??this[l].set(e,new Set([t])),this}on=this.addTransferListener;removeTransferListener(e,t){return t?this[l].get(e)?.delete(t):this[l].delete(e),this}off=this.removeTransferListener;[a]=new Map;handleRequest(e,t,s,{type:r,size:o,metadata:m,...p}){let{Transfer:g}=this.constructor;this[l].has(t)?this[a].has(s)?e.sendMessage(i.error,s,"Transfer already exists"):r in g.types?o>this.sizeLimit?e.sendMessage(i.error,s,`Transfer size (${o} bytes) exeeds limit of ${this.sizeLimit} bytes`):new g(this,e,t,s,{type:r,size:o,metadata:m,...p}):e.sendMessage(i.error,s,"Unknown type of transfer"):e.sendMessage(i.error,s,`Unknown kind of file "${t}"`)}handleChunk(e,t,s,r=s.length){this[a].get(t)?.handleChunk(s,r)}handleSent(e,t){this[a].get(t)?.handleSent()}handleAbort(e,t){this[a].get(t)?.abort(!0)}static Transfer=c};var b=class extends N{constructor(e){super(),this.writable=e,this.promise=new Promise((t,s)=>{e.on("close",t),e.on("error",s)}),this.pipe(e)}writable;promise;_read(){}};function x(n){let e=new b(n);return this.streams?.push(e)??(this.streams=[e]),n}var O={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=x},transformChunk(n){if(n=this.isBuffer?Buffer.from(n,"base64"):Buffer.from(n,"base64").toString(this.encoding),this.streams)for(let e of this.streams)e.push(n);return n},collect(n){this.isBuffer?this.data=Buffer.concat([this.data,n]):this.data+=n},async done(){if(this.streams){let n=[];for(let e of this.streams)e.push(null),n.push(e.promise);await Promise.all(n)}}},y=class extends c{streams;isBuffer=!1;pipeTo=x;static types={stream:O,file:O,...c.types}},w=class extends u{static Transfer=y};import M from"node:fs";import B from"node:path";import{Readable as D}from"node:stream";import U from"mime";import{uid as q}from"@nesvet/n";var d=class{constructor(e,t={}){this.string=e,this.size=this.string.length;let{chunkSize:s=1024*256}=t;this.chunkSize=s}string;size;chunkSize;listener;#s=0;#e=0;isAborted=!1;start(e){this.listener=e,this.#t()}async#t(){if(!this.isAborted){this.#e=Math.min(this.#s+this.chunkSize,this.size);let e=await new Promise(t=>{t(this.string.slice(this.#s,this.#e))});this.isAborted||(await this.listener(e),this.#e<this.size&&(this.#s=this.#e,this.#t()))}}abort(){this.isAborted=!0}};var f=class{constructor(e,t,s,{data:r,type:o,incomingType:m,collect:p,metadata:g,size:T,chunkSize:R,encoding:$,incomingEncoding:E,onBegin:k,onSenderProgress:P,onProgress:C,onEnd:A,onError:W}){this.transport=e,this.ws=t,this[h]="wss"in t?[t.wss,t]:[t],this.kind=s,this.data=r,this.type=o,this.collect=p??!1,this.metadata=g,this.size=T??null,this.encoding=$,this.chunkSize=R??this.constructor.chunkSize,k&&(this.onBegin=k),P&&(this.onSenderProgress=P),C&&(this.onProgress=C),A&&(this.onEnd=A),W&&(this.onError=W),this.transport[a].set(this.id,this),this.#s=this.#n(m,E)}transport;ws;[h];kind;data;type;collect;metadata;size;chunkSize;encoding;onBegin;onSenderProgress;onProgress;onEnd;onError;#s;id=q();#e;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#t=null;#i=[];#r=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;stringStreamer;fileStreamer;async#n(e,t){for(let[s,r,o]of this.constructor.types)if(this.type===s||r(this.data)){this.type=s,this.#e=o;break}if(this.type)await this.#e.setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(i.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:t??this.encoding,size:this.size,metadata:this.metadata})}whenSetUp(){return this.#s}async handleConfirm(e){this.confirmResponse=e,this.beginAt=this.#t=Date.now();let t=this[h];await this.onBegin?.call(...t,this),this.#e.confirm.call(this)}handleChunk=e=>{this.#i.push(e),this.#r||(this.#r=!0,this.#o())};async#o(){let e=this.#i.shift(),t=e.length;this.#e.transformChunk&&(e=await this.#e.transformChunk.call(this,e)),this.ws.sendMessage(i.chunk,this.id,e,t);let s=Date.now();this.bytesPerMs=t/(s-this.#t),this.#t=s,this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size);let r=this[h];await this.onSenderProgress?.call(...r,this),this.#i.length?this.#o():(this.#r=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(i.sent,this.id);handleProgress(e){this.progress=e;let t=this[h];this.onProgress?.call(...t,this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.transport[a].delete(this.id);let e=this[h];this.progress!==1&&(this.progress=1,await this.onProgress?.call(...e,this)),this.onEnd?.call(...e,this)}throw(e){this.transport[a].delete(this.id),this.error=new Error(e);let t=this[h];this.onError?.call(...t,this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(i.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}static types=[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new d(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new d(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new d(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=F};var S=class{constructor(e){e.isWebSocketServer?(e.on(`client-message:${i.confirm}`,(t,...s)=>this.handleConfirm(t,...s)),e.on(`client-message:${i.progress}`,(t,...s)=>this.handleProgress(t,...s)),e.on(`client-message:${i.completed}`,(t,...s)=>this.handleCompleted(t,...s)),e.on(`client-message:${i.error}`,(t,...s)=>this.handleError(t,...s))):(e.on(`message:${i.confirm}`,(...t)=>this.handleConfirm(e,...t)),e.on(`message:${i.progress}`,(...t)=>this.handleProgress(e,...t)),e.on(`message:${i.completed}`,(...t)=>this.handleCompleted(e,...t)),e.on(`message:${i.error}`,(...t)=>this.handleError(e,...t)))}[a]=new Map;transfer(e,t,s){let{Transfer:r}=this.constructor;return new r(this,e,t,s)}handleConfirm(e,t,s){this[a].get(t)?.handleConfirm(s)}handleProgress(e,t,s){this[a].get(t)?.handleProgress(s)}handleCompleted(e,t){this[a].get(t)?.handleCompleted()}handleError(e,t,s){this[a].get(t)?.throw(s)}static Transfer=f};var I=class extends f{stream;isBuffer=!1;static types=[["stream",e=>e instanceof D,{setup(){this.stream=this.data,this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0)},confirm(){this.stream.on("data",this.handleChunk),this.size||this.stream.on("end",this.sent)},transformChunk(e){return(this.isBuffer?e:Buffer.from(e,this.encoding)).toString("base64")}}],["file",e=>typeof e=="string"&&/^(\/|(\/[^/]+)+)$/.test(e),{async setup(){let e=this.data,t=B.basename(e),{size:s,mtimeMs:r}=await M.promises.stat(e),o={name:t,type:U.getType(B.extname(t).slice(1)),size:s,modifiedAt:r};this.stream=M.createReadStream(e),this.size=s,this.encoding="buffer",this.metadata?Object.assign(this.metadata,o):this.metadata=o},confirm(){this.stream.on("data",this.handleChunk)},transformChunk(e){return e.toString("base64")}}],...f.types]},L=class extends S{static OutgoingTransfer=I};export{y as IncomingTransfer,w as IncomingTransport,I as OutgoingTransfer,L as OutgoingTransport};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/node/incoming.ts", "../../src/common.ts", "../../src/IncomingTransfer.ts", "../../src/IncomingTransport.ts", "../../src/node/outgoing.ts", "../../src/OutgoingTransfer.ts", "../../src/StringStreamer.ts", "../../src/OutgoingTransport.ts"],
4
+ "sourcesContent": ["import { Readable, type Writable } from \"node:stream\";\nimport { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\nimport { IncomingTransferMethods, IncomingTransferTypes } from \"../types\";\n\n\nclass TransferStream extends Readable {\n\tconstructor(writableStream: Writable) {\n\t\tsuper();\n\t\t\n\t\tthis.writable = writableStream;\n\t\t\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\twritableStream.on(\"close\", resolve);\n\t\t\twritableStream.on(\"error\", reject);\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.pipe(writableStream);\n\t\t\n\t}\n\t\n\twritable: Writable;\n\t\n\tpromise: Promise<void>;\n\t\n\t_read() { /* */ }\n\t\n}\n\n/** @this NodeIncomingTransfer */\nfunction pipeTo(this: NodeIncomingTransfer, writableStream: Writable) {\n\tconst stream = new TransferStream(writableStream);\n\t\n\tthis.streams?.push(stream) ??\n\t(this.streams = [ stream ]);\n\t\n\treturn writableStream;\n}\n\nconst streamMethod: IncomingTransferMethods<typeof NodeIncomingTransfer> = {\n\tsetup() {\n\t\t\n\t\tif (!this.encoding)\n\t\t\tthis.encoding = \"buffer\";\n\t\t\n\t\tif (this.encoding === \"buffer\")\n\t\t\tthis.isBuffer = true;\n\t\t\n\t\tif (this.collect)\n\t\t\tthis.data = this.isBuffer ? Buffer.from(\"\") : \"\";\n\t\t\n\t\tthis.pipeTo = pipeTo;\n\t\t\n\t},\n\t\n\ttransformChunk(chunk) {\n\t\tchunk = this.isBuffer ?\n\t\t\tBuffer.from(chunk as string, \"base64\") :\n\t\t\tBuffer.from(chunk as string, \"base64\").toString(this.encoding as Exclude<typeof this.encoding, \"buffer\">);\n\t\t\n\t\tif (this.streams)\n\t\t\tfor (const stream of this.streams)\n\t\t\t\tstream.push(chunk);\n\t\t\n\t\treturn chunk;\n\t},\n\t\n\tcollect(chunk) {\n\t\tif (this.isBuffer)\n\t\t\tthis.data = Buffer.concat([ this.data as Buffer, chunk as Buffer ]);\n\t\telse\n\t\t\tthis.data += chunk as string;\n\t\t\n\t},\n\t\n\tasync done() {\n\t\t\n\t\tif (this.streams) {\n\t\t\tconst promises = [];\n\t\t\t\n\t\t\tfor (const stream of this.streams) {\n\t\t\t\tstream.push(null);\n\t\t\t\tpromises.push(stream.promise);\n\t\t\t}\n\t\t\t\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t\t\n\t}\n};\n\n\nclass NodeIncomingTransfer extends IncomingTransfer<typeof NodeIncomingTransport, typeof NodeIncomingTransfer> {\n\t\n\tstreams?: TransferStream[];\n\tisBuffer?: boolean = false;\n\tpipeTo? = pipeTo;\n\t\n\t\n\tstatic types: IncomingTransferTypes<typeof NodeIncomingTransfer> = {\n\t\t\n\t\tstream: streamMethod,\n\t\t\n\t\tfile: streamMethod,\n\t\t\n\t\t...IncomingTransfer.types\n\t\t\n\t};\n}\n\nclass NodeIncomingTransport extends IncomingTransport<typeof NodeIncomingTransport, typeof NodeIncomingTransfer> {\n\t\n\tstatic Transfer = NodeIncomingTransfer;\n\t\n}\n\n\nexport {\n\tNodeIncomingTransfer as IncomingTransfer,\n\tNodeIncomingTransport as IncomingTransport\n};\n", "export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const transfersSymbol = Symbol(\"transfers\");\nexport const listenersSymbol = Symbol(\"listeners\");\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const callArgsSymbol = Symbol(\"callArgs\");\n\nexport const progressInterval = 250;\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { StringKey } from \"@nesvet/n\";\nimport {\n\tcallArgsSymbol,\n\theaders,\n\tlistenersSymbol,\n\tprogressInterval,\n\ttransfersSymbol\n} from \"./common\";\nimport { IncomingTransport } from \"./IncomingTransport\";\nimport {\n\tCallArgs,\n\tIncomingChunk,\n\tIncomingData,\n\tIncomingTransferListener,\n\tIncomingTransferMethods,\n\tIncomingTransferProps,\n\tIncomingTransferTypes\n} from \"./types\";\n\n\nexport class IncomingTransfer<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {\n\tconstructor(\n\t\ttransport: IncomingTransport<PT, FT>,\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, collect, encoding, size, metadata }: IncomingTransferProps<StringKey<FT[\"types\"]>>\n\t) {\n\t\t\n\t\tthis.transport = transport;\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = \"wss\" in ws ? [ ws.wss!, ws ] as const : [ ws as InSiteWebSocket ] as const;\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.listeners = this.transport[listenersSymbol].get(this.kind)!;\n\t\t\n\t\tthis.transport[transfersSymbol].set(this.id, this as InstanceType<FT>);\n\t\t\n\t\tthis.#setupPromise = this.#setup();\n\t\t\n\t}\n\t\n\ttransport: IncomingTransport<PT, FT>;\n\tws: InSiteWebSocket | InSiteWebSocketServerClient;\n\t[callArgsSymbol]: [ InSiteWebSocket ] | [ InSiteWebSocketServer, InSiteWebSocketServerClient ];\n\tkind: string;\n\tid: string;\n\ttype: string;\n\tcollect: boolean;\n\tencoding: IncomingTransferProps<StringKey<FT[\"types\"]>>[\"encoding\"];\n\tsize: number;\n\tmetadata: Record<string, unknown>;\n\tlisteners: Set<IncomingTransferListener<FT>>;\n\t#setupPromise: Promise<void>;\n\tdata?: IncomingData;\n\t\n\t#methods?: IncomingTransferMethods<FT>;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: null | number = null;\n\t#prevChunkAt: null | number = null;\n\t#chunksQueue: [ chunk: IncomingChunk, length: number ][] = [];\n\t#isProcessing = false;\n\tduration: null | number = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs: null | number = null;\n\tprogress = 0;\n\tendAt: null | number = null;\n\terror: Error | null = null;\n\t\n\t\n\t#progressInterval?: NodeJS.Timeout;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = ((this.constructor as FT).types as IncomingTransferTypes<FT>)[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this as InstanceType<FT>);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${String(this.type)}\"`);\n\t\t\n\t\tthis.confirm();\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { begin } of this.listeners)\n\t\t\tif (await begin?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t\treturn null;\n\t}\n\t\n\thandleChunk(chunk: IncomingChunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift()!;// eslint-disable-line prefer-const\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods!.collect.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.listeners)\n\t\t\tawait (chunkListener ?? progressListener)?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tthis.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\thandleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tthis.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods!.done?.call(this as InstanceType<FT>);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { end } of this.listeners)\n\t\t\tawait end?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage: string, sendToSender = true) {\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tfor (const { error } of this.listeners)\n\t\t\terror?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, this.error);\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic readonly types: IncomingTransferTypes<typeof IncomingTransfer> = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type};base64,${this.data}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { StringKey } from \"@nesvet/n\";\nimport {\n\tsizeLimit as defaultSizeLimit,\n\theaders,\n\tlistenersSymbol,\n\ttransfersSymbol\n} from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\nimport {\n\tIncomingChunk,\n\tIncomingTransferListener,\n\tIncomingTransferProps,\n\tParametersWithoutFirst\n} from \"./types\";\n\n\ntype Options = {\n\tsizeLimit?: number;\n};\n\n\nexport class IncomingTransport<PT extends typeof IncomingTransport, FT extends typeof IncomingTransfer> {\n\tconstructor(ws: InSiteWebSocket | InSiteWebSocketServer, options: Options = {}) {\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.request}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.request}`, (...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(ws, ...args));\n\t\t\tws.on(`message:${headers.chunk}`, (...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(ws, ...args));\n\t\t\tws.on(`message:${headers.sent}`, (...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(ws, ...args));\n\t\t\tws.on(`message:${headers.abort}`, (...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(ws, ...args));\n\t\t}\n\t\t\n\t}\n\t\n\tsizeLimit: number;\n\t\n\t[listenersSymbol] = new Map<string, Set<IncomingTransferListener<FT>>>();\n\t\n\taddTransferListener(kind: string, listener: IncomingTransferListener<FT>) {\n\t\tthis[listenersSymbol].get(kind)?.add(listener) ??\n\t\tthis[listenersSymbol].set(kind, new Set([ listener ]));\n\t\t\n\t\treturn this;\n\t}\n\t\n\ton = this.addTransferListener;\n\t\n\tremoveTransferListener(kind: string, listener?: IncomingTransferListener<FT>) {\n\t\tif (listener)\n\t\t\tthis[listenersSymbol].get(kind)?.delete(listener);\n\t\telse\n\t\t\tthis[listenersSymbol].delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toff = this.removeTransferListener;\n\t\n\t[transfersSymbol] = new Map<string, InstanceType<FT>>();\n\t\n\tprivate handleRequest(\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, size, metadata, ...restProps }: IncomingTransferProps<StringKey<FT[\"types\"]>>\n\t) {\n\t\t\n\t\tconst { Transfer } = this.constructor as PT;\n\t\t\n\t\tif (!this[listenersSymbol].has(kind))\n\t\t\tws.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (this[transfersSymbol].has(id))\n\t\t\tws.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!(type in Transfer.types))\n\t\t\tws.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tws.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tnew Transfer(this as InstanceType<PT>, ws, kind, id, { type, size, metadata, ...restProps });\n\t\t\n\t}\n\t\n\tprivate handleChunk(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, chunk: IncomingChunk, length = chunk.length) {\n\t\tthis[transfersSymbol].get(id)?.handleChunk(chunk, length);\n\t\t\n\t}\n\t\n\tprivate handleSent(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tprivate handleAbort(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.abort(true);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = IncomingTransfer;\n\t\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport mime from \"mime\";\nimport { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\nimport { OutgoingTransferTypes } from \"../types\";\n\n\nclass NodeOutgoingTransfer extends OutgoingTransfer<typeof NodeOutgoingTransport, typeof NodeOutgoingTransfer> {\n\t\n\tstream?: Readable;\n\tisBuffer?: boolean = false;\n\t\n\tstatic types: OutgoingTransferTypes<typeof NodeOutgoingTransfer> = [\n\t\t\n\t\t[ \"stream\", data => data instanceof Readable, {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stream = this.data as Readable;\n\t\t\t\t\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t\tif (this.encoding === \"buffer\")\n\t\t\t\t\tthis.isBuffer = true;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stream!.on(\"data\", this.handleChunk);\n\t\t\t\tif (!this.size)\n\t\t\t\t\tthis.stream!.on(\"end\", this.sent);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn (this.isBuffer ? chunk : Buffer.from(chunk as string, this.encoding as Exclude<typeof this.encoding, \"buffer\">)).toString(\"base64\");\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"file\", data => typeof data == \"string\" && /^(\\/|(\\/[^/]+)+)$/.test(data), {\n\t\t\t\n\t\t\tasync setup() {\n\t\t\t\t\n\t\t\t\tconst fileName = this.data as string;\n\t\t\t\tconst name = path.basename(fileName);\n\t\t\t\tconst { size, mtimeMs: modifiedAt } = await fs.promises.stat(fileName);\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname,\n\t\t\t\t\ttype: mime.getType(path.extname(name).slice(1)),\n\t\t\t\t\tsize,\n\t\t\t\t\tmodifiedAt\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tthis.stream = fs.createReadStream(fileName);\n\t\t\t\t\n\t\t\t\tthis.size = size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stream!.on(\"data\", this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn chunk.toString(\"base64\");\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.types\n\t\t\n\t];\n\t\n}\n\nclass NodeOutgoingTransport extends OutgoingTransport<typeof NodeOutgoingTransport, typeof NodeOutgoingTransfer> {\n\t\n\tstatic OutgoingTransfer = NodeOutgoingTransfer;\n\t\n}\n\n\nexport {\n\tNodeOutgoingTransfer as OutgoingTransfer,\n\tNodeOutgoingTransport as OutgoingTransport\n};\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { uid } from \"@nesvet/n\";\nimport { FileStreamer } from \"./browser/FileStreamer\";\nimport {\n\tcallArgsSymbol,\n\tchunkSize as defaultChunkSize,\n\theaders,\n\ttransfersSymbol\n} from \"./common\";\nimport { OutgoingTransport } from \"./OutgoingTransport\";\nimport { StringStreamer } from \"./StringStreamer\";\nimport {\n\tCallArgs,\n\tOutgoingChunk,\n\tOutgoingData,\n\tOutgoingTransferMethods,\n\tOutgoingTransferProps,\n\tOutgoingTransferTypes\n} from \"./types\";\n\n\n// FIXME\n\n\nexport class OutgoingTransfer<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {\n\tconstructor(\n\t\ttransport: OutgoingTransport<PT, FT>,\n\t\tws: InSiteWebSocket | InSiteWebSocketServerClient,\n\t\tkind: string,\n\t\t{\n\t\t\tdata,\n\t\t\ttype,\n\t\t\tincomingType,\n\t\t\tcollect,\n\t\t\tmetadata,\n\t\t\tsize,\n\t\t\tchunkSize,\n\t\t\tencoding,\n\t\t\tincomingEncoding,\n\t\t\tonBegin,\n\t\t\tonSenderProgress,\n\t\t\tonProgress,\n\t\t\tonEnd,\n\t\t\tonError\n\t\t}: OutgoingTransferProps<FT>\n\t) {\n\t\t\n\t\tthis.transport = transport;\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = \"wss\" in ws ? [ ws.wss!, ws ] as const : [ ws as InSiteWebSocket ] as const;\n\t\tthis.kind = kind;\n\t\tthis.data = data;\n\t\tthis.type = type;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? (this.constructor as typeof OutgoingTransfer).chunkSize;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.onError = onError;\n\t\t\n\t\tthis.transport[transfersSymbol].set(this.id, this as InstanceType<FT>);\n\t\t\n\t\tthis.#setupPromise = this.#setup(incomingType, incomingEncoding);\n\t\t\n\t}\n\t\n\ttransport: OutgoingTransport<PT, FT>;\n\tws: InSiteWebSocket | InSiteWebSocketServerClient;\n\t[callArgsSymbol]: [ InSiteWebSocket ] | [ InSiteWebSocketServer, InSiteWebSocketServerClient ];\n\tkind: string;\n\tdata?: OutgoingData;\n\ttype: string;\n\tcollect: boolean;\n\tmetadata: Record<string, unknown>;\n\tsize: number;\n\tchunkSize: number;\n\tencoding: OutgoingTransferProps<FT>[\"encoding\"];\n\tonBegin?: OutgoingTransferProps<FT>[\"onBegin\"];\n\tonSenderProgress?: OutgoingTransferProps<FT>[\"onSenderProgress\"];\n\tonProgress?: OutgoingTransferProps<FT>[\"onProgress\"];\n\tonEnd?: OutgoingTransferProps<FT>[\"onEnd\"];\n\tonError?: OutgoingTransferProps<FT>[\"onError\"];\n\t#setupPromise: Promise<void>;\n\t\n\tid = uid();\n\t#methods?: OutgoingTransferMethods<FT>;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: null | number = null;\n\t#prevChunkAt: null | number = null;\n\t#chunksQueue: OutgoingChunk[] = [];\n\t#isProcessing = false;\n\tduration: null | number = null;\n\ttransferedSize = 0;\n\tbytesPerMs: null | number = null;\n\tsenderProgress = 0;\n\tprogress: number = 0;\n\tendAt: null | number = null;\n\terror: Error | null = null;\n\tstringStreamer?: StringStreamer;\n\tfileStreamer?: FileStreamer;\n\t\n\tasync #setup(incomingType?: string, incomingEncoding?: string) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of (this.constructor as typeof OutgoingTransfer).types)\n\t\t\tif (this.type === availableType || test(this.data as string)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods!.setup.call(this as InstanceType<FT>);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\ttype: incomingType ?? this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata\n\t\t});\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync handleConfirm(confirmResponse: string) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tawait this.onBegin?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tthis.#methods!.confirm.call(this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\thandleChunk = (chunk: OutgoingChunk) => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift()!;\n\t\t\n\t\tconst chunkLength = chunk.length!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this as InstanceType<FT>, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tawait this.onSenderProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress: number) {\n\t\tthis.progress = progress;\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tthis.onProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait this.onProgress?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t}\n\t\t\n\t\tthis.onEnd?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>);\n\t\t\n\t}\n\t\n\tthrow(errorMessage: string) {\n\t\t\n\t\tthis.transport[transfersSymbol].delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tconst callArgs = this[callArgsSymbol];\n\t\tthis.onError?.call(...callArgs as CallArgs<typeof callArgs>, this as InstanceType<FT>, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic readonly types: OutgoingTransferTypes<typeof OutgoingTransfer> = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = (this.data as string).split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data as string, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = defaultChunkSize;\n\t\n}\n", "import { StreamerOptions } from \"./types\";\n\n\ntype Listener = {\n\t(chunk: string): Promise<void> | void;\n};\n\n\nexport class StringStreamer {\n\tconstructor(string: string, options: StreamerOptions = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\tstring: string;\n\tsize: number;\n\tchunkSize: number;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise<string>(resolve => { resolve(this.string.slice(this.#start, this.#end)); });\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener!(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tthis.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { InSiteWebSocket } from \"insite-ws/client\";\nimport { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport { headers, transfersSymbol } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\nimport { OutgoingTransferProps, ParametersWithoutFirst } from \"./types\";\n\n\nexport class OutgoingTransport<PT extends typeof OutgoingTransport, FT extends typeof OutgoingTransfer> {\n\tconstructor(ws: InSiteWebSocket | InSiteWebSocketServer) {\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.confirm}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.error}`, (wssc: InSiteWebSocketServerClient, ...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.confirm}`, (...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(ws, ...args));\n\t\t\tws.on(`message:${headers.progress}`, (...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(ws, ...args));\n\t\t\tws.on(`message:${headers.completed}`, (...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(ws, ...args));\n\t\t\tws.on(`message:${headers.error}`, (...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(ws, ...args));\n\t\t}\n\t\t\n\t}\n\t\n\t[transfersSymbol] = new Map<string, InstanceType<FT>>();\n\t\n\ttransfer(ws: InSiteWebSocket | InSiteWebSocketServerClient, kind: string, props: OutgoingTransferProps<FT>) {\n\t\tconst { Transfer } = this.constructor as PT;\n\t\t\n\t\treturn new Transfer(this as InstanceType<PT>, ws, kind, props);\n\t}\n\t\n\tprivate handleConfirm(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, confirmResponse: string) {\n\t\tthis[transfersSymbol].get(id)?.handleConfirm(confirmResponse);\n\t\t\n\t}\n\t\n\tprivate handleProgress(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, progress: number) {\n\t\tthis[transfersSymbol].get(id)?.handleProgress(progress);\n\t\t\n\t}\n\t\n\tprivate handleCompleted(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string) {\n\t\tthis[transfersSymbol].get(id)?.handleCompleted();\n\t\t\n\t}\n\t\n\tprivate handleError(ws: InSiteWebSocket | InSiteWebSocketServerClient, id: string, errorMessage: string) {\n\t\tthis[transfersSymbol].get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = OutgoingTransfer;\n\t\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Readable", "headers", "transfersSymbol", "listenersSymbol", "sizeLimit", "chunkSize", "callArgsSymbol", "progressInterval", "IncomingTransfer", "transport", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "callArgsSymbol", "listenersSymbol", "transfersSymbol", "#setupPromise", "#setup", "#methods", "#prevChunkAt", "#chunksQueue", "#isProcessing", "#progressInterval", "#lastProgress", "callArgs", "begin", "headers", "progressInterval", "chunk", "length", "ts", "#process", "chunkListener", "progressListener", "#complete", "end", "bySender", "errorMessage", "sendToSender", "error", "IncomingTransport", "ws", "options", "sizeLimit", "headers", "wssc", "args", "listenersSymbol", "kind", "listener", "transfersSymbol", "id", "type", "size", "metadata", "restProps", "Transfer", "chunk", "length", "IncomingTransfer", "TransferStream", "Readable", "writableStream", "resolve", "reject", "pipeTo", "stream", "streamMethod", "chunk", "promises", "NodeIncomingTransfer", "IncomingTransfer", "NodeIncomingTransport", "IncomingTransport", "fs", "path", "Readable", "mime", "uid", "StringStreamer", "string", "options", "chunkSize", "#start", "#end", "listener", "#next", "chunk", "resolve", "OutgoingTransfer", "transport", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "callArgsSymbol", "transfersSymbol", "#setupPromise", "#setup", "uid", "#methods", "#prevChunkAt", "#chunksQueue", "#isProcessing", "availableType", "test", "methods", "headers", "confirmResponse", "callArgs", "chunk", "#process", "chunkLength", "ts", "progress", "errorMessage", "StringStreamer", "OutgoingTransport", "ws", "headers", "wssc", "args", "transfersSymbol", "kind", "props", "Transfer", "id", "confirmResponse", "progress", "errorMessage", "OutgoingTransfer", "NodeOutgoingTransfer", "OutgoingTransfer", "data", "Readable", "chunk", "fileName", "name", "path", "size", "modifiedAt", "fs", "metadata", "mime", "NodeOutgoingTransport", "OutgoingTransport"]
7
+ }
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from "node:stream";
3
+ import { OutgoingTransfer } from "../OutgoingTransfer";
4
+ import { OutgoingTransport } from "../OutgoingTransport";
5
+ import { OutgoingTransferTypes } from "../types";
6
+ declare class NodeOutgoingTransfer extends OutgoingTransfer<typeof NodeOutgoingTransport, typeof NodeOutgoingTransfer> {
7
+ stream?: Readable;
8
+ isBuffer?: boolean;
9
+ static types: OutgoingTransferTypes<typeof NodeOutgoingTransfer>;
10
+ }
11
+ declare class NodeOutgoingTransport extends OutgoingTransport<typeof NodeOutgoingTransport, typeof NodeOutgoingTransfer> {
12
+ static OutgoingTransfer: typeof NodeOutgoingTransfer;
13
+ }
14
+ export { NodeOutgoingTransfer as OutgoingTransfer, NodeOutgoingTransport as OutgoingTransport };
15
+ //# sourceMappingURL=outgoing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outgoing.d.ts","sourceRoot":"","sources":["../../src/node/outgoing.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGjD,cAAM,oBAAqB,SAAQ,gBAAgB,CAAC,OAAO,qBAAqB,EAAE,OAAO,oBAAoB,CAAC;IAE7G,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAS;IAE3B,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,oBAAoB,CAAC,CAqE9D;CAEF;AAED,cAAM,qBAAsB,SAAQ,iBAAiB,CAAC,OAAO,qBAAqB,EAAE,OAAO,oBAAoB,CAAC;IAE/G,MAAM,CAAC,gBAAgB,8BAAwB;CAE/C;AAGD,OAAO,EACN,oBAAoB,IAAI,gBAAgB,EACxC,qBAAqB,IAAI,iBAAiB,EAC1C,CAAC"}
@@ -0,0 +1,79 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Readable } from "node:stream";
4
+ import { InSiteWebSocket } from "insite-ws/client";
5
+ import { InSiteWebSocketServer, InSiteWebSocketServerClient } from "insite-ws/server";
6
+ import { StringKey } from "@nesvet/n";
7
+ import { IncomingTransfer } from "./IncomingTransfer";
8
+ import { OutgoingTransfer } from "./OutgoingTransfer";
9
+ export type ParametersWithoutFirst<T extends (...args: any) => any> = T extends (first: any, ...args: infer P) => any ? P : never;
10
+ export type CallArgs<CA extends readonly [InSiteWebSocket] | readonly [InSiteWebSocketServer, InSiteWebSocketServerClient]> = CA[0] extends InSiteWebSocketServer ? [
11
+ InSiteWebSocketServer,
12
+ InSiteWebSocketServerClient
13
+ ] : [
14
+ InSiteWebSocket
15
+ ];
16
+ export type ArrayBufferWithLength = {
17
+ length?: number;
18
+ } & ArrayBuffer;
19
+ export type StreamerOptions = {
20
+ chunkSize?: number;
21
+ };
22
+ export type OutgoingData = Buffer | File | Readable | string;
23
+ export type OutgoingChunk = ArrayBufferWithLength | Buffer | string;
24
+ export type OutgoingTransferProps<FT extends typeof OutgoingTransfer> = {
25
+ data: OutgoingData;
26
+ type: StringKey<FT["types"]>;
27
+ incomingType?: StringKey<FT["types"]>;
28
+ collect: boolean;
29
+ metadata: Record<string, unknown>;
30
+ size: number;
31
+ chunkSize: number;
32
+ encoding: "base64" | "buffer" | "utf8";
33
+ incomingEncoding?: "base64" | "buffer" | "utf8";
34
+ onBegin(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
35
+ onBegin(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
36
+ onSenderProgress(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
37
+ onSenderProgress(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
38
+ onProgress(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
39
+ onProgress(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
40
+ onEnd(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
41
+ onEnd(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
42
+ onError(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>, error: Error): Promise<unknown> | unknown;
43
+ onError(this: InSiteWebSocket, transfer: InstanceType<FT>, error: Error): Promise<unknown> | unknown;
44
+ };
45
+ export type OutgoingTransferMethods<FT extends typeof OutgoingTransfer> = {
46
+ setup(this: InstanceType<FT>): void;
47
+ confirm(this: InstanceType<FT>): void;
48
+ transformChunk?(this: InstanceType<FT>, chunk: OutgoingChunk): OutgoingChunk | Promise<OutgoingChunk>;
49
+ };
50
+ export type OutgoingTransferTypes<FT extends typeof OutgoingTransfer> = [type: string, test: (data: OutgoingData) => boolean, OutgoingTransferMethods<FT>][];
51
+ export type IncomingData = Buffer | string;
52
+ export type IncomingChunk = Buffer | string;
53
+ export type IncomingTransferProps<Type extends string = string> = {
54
+ type: Type;
55
+ collect: boolean;
56
+ encoding: "base64" | "buffer" | "utf8";
57
+ size: number;
58
+ metadata: Record<string, unknown>;
59
+ };
60
+ export type IncomingTransferMethods<FT extends typeof IncomingTransfer> = {
61
+ setup(this: InstanceType<FT>): void;
62
+ collect(this: InstanceType<FT>, chunk: IncomingChunk): void;
63
+ transformChunk?(this: InstanceType<FT>, chunk: IncomingChunk): IncomingChunk;
64
+ done?(this: InstanceType<FT>): void;
65
+ };
66
+ export type IncomingTransferTypes<FT extends typeof IncomingTransfer> = Record<string, IncomingTransferMethods<FT>>;
67
+ export type IncomingTransferListener<FT extends typeof IncomingTransfer> = {
68
+ begin(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
69
+ begin(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
70
+ chunk(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>, chunk: IncomingChunk): Promise<unknown> | unknown;
71
+ chunk(this: InSiteWebSocket, transfer: InstanceType<FT>, chunk: IncomingChunk): Promise<unknown> | unknown;
72
+ progress(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>, chunk: IncomingChunk): Promise<unknown> | unknown;
73
+ progress(this: InSiteWebSocket, transfer: InstanceType<FT>, chunk: IncomingChunk): Promise<unknown> | unknown;
74
+ end(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>): Promise<unknown> | unknown;
75
+ end(this: InSiteWebSocket, transfer: InstanceType<FT>): Promise<unknown> | unknown;
76
+ error(this: InSiteWebSocketServer, ws: InSiteWebSocketServerClient, transfer: InstanceType<FT>, error: Error): Promise<unknown> | unknown;
77
+ error(this: InSiteWebSocket, transfer: InstanceType<FT>, error: Error): Promise<unknown> | unknown;
78
+ };
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,20 @@
1
1
  {
2
2
  "name": "insite-ws-transfers",
3
- "version": "1.0.472",
3
+ "version": "2.0.0",
4
4
  "description": "inSite file transfers over WebSockets",
5
5
  "type": "module",
6
- "main": "./dist/node.js",
7
- "module": "./dist/node.js",
6
+ "main": "./dist/node/index.js",
7
+ "module": "./dist/node/index.js",
8
8
  "exports": {
9
- ".": "./dist/node.js",
10
- "./node": "./dist/node.js",
11
- "./browser": "./dist/browser.js"
9
+ ".": "./dist/node/index.js",
10
+ "./node": "./dist/node/index.js",
11
+ "./browser": "./dist/browser/index.js"
12
12
  },
13
- "packageManager": "bun@1.1.17",
13
+ "packageManager": "bun@1.1.18",
14
14
  "scripts": {
15
15
  "test": "echo \"Error: no test specified\" && exit 1",
16
- "build": "bun .conveyer.js"
16
+ "build": "bun .conveyer.js",
17
+ "postbuild": "tsc -p ."
17
18
  },
18
19
  "repository": {
19
20
  "type": "git",
@@ -29,11 +30,14 @@
29
30
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
30
31
  "license": "MIT",
31
32
  "dependencies": {
32
- "@nesvet/n": "^1.0.63",
33
- "mime": "^2.6.0"
33
+ "@nesvet/n": "^1.0.66",
34
+ "mime": "^4.0.4",
35
+ "insite-ws": "^2.0.4"
34
36
  },
35
37
  "devDependencies": {
36
38
  "@nesvet/conveyer": "^2.2.1",
37
- "@nesvet/eslint-config": "^2.0.21"
39
+ "@nesvet/eslint-config": "^2.0.23",
40
+ "@types/node": "^20.14.10",
41
+ "@types/ws": "^8.5.10"
38
42
  }
39
43
  }
package/dist/browser.js DELETED
@@ -1,2 +0,0 @@
1
- var us=Object.defineProperty;var rs=n=>{throw TypeError(n)};var ms=(n,s,t)=>s in n?us(n,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[s]=t;var e=(n,s,t)=>ms(n,typeof s!="symbol"?s+"":s,t),Q=(n,s,t)=>s.has(n)||rs("Cannot "+t);var i=(n,s,t)=>(Q(n,s,"read from private field"),t?t.call(n):s.get(n)),o=(n,s,t)=>s.has(n)?rs("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(n):s.set(n,t),l=(n,s,t,r)=>(Q(n,s,"write to private field"),r?r.call(n,t):s.set(n,t),t),d=(n,s,t)=>(Q(n,s,"access private method"),t);var h={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},ns=10*1024*1024*1024,hs=1024*256,c=Symbol("callArgs"),as=250;var u,C,P,y,x,j,m,os,W,G,S=class{constructor(s,t,r,{type:a,collect:q,encoding:B,size:z,metadata:w}){o(this,m);o(this,u);e(this,"isAborted",!1);e(this,"isAbortedBySender",!1);e(this,"isAbortedByReceiver",!1);e(this,"isTransfered",!1);e(this,"confirmResponse");e(this,"beginAt",null);o(this,C,null);o(this,P,[]);o(this,y,!1);e(this,"duration",null);e(this,"transferedSize",0);e(this,"processedSize",0);e(this,"bytesPerMs",null);e(this,"progress",0);e(this,"endAt",null);e(this,"error",null);o(this,x);o(this,j,0);return this.ws=s,this[c]=s.wss?[s.wss,s]:[s],this.incomingTransport=(s.wss??s).incomingTransport,this.kind=t,this.id=r,this.type=a,this.collect=!!q,this.encoding=B,this.size=z,this.metadata=w,this.listeners=this.incomingTransport.listeners.get(this.kind),this.incomingTransport.transfers.set(this.id,this),(async()=>(await d(this,m,os).call(this),this.confirm(),this))()}async confirm(){for(let{begin:s}of this.listeners)if(await s?.call(...this[c],this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=l(this,C,Date.now()),this.ws.sendMessage(h.confirm,this.id,this.confirmResponse),l(this,x,setInterval(()=>{i(this,j)!==this.progress&&(l(this,j,this.progress),this.ws.sendMessage(h.progress,this.id,this.progress))},as))}handleChunk(s,t=s.length){let r=Date.now();this.bytesPerMs=t/(r-i(this,C)),l(this,C,r),this.transferedSize+=t,i(this,P).push([s,t]),i(this,y)||(l(this,y,!0),d(this,m,W).call(this))}handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,i(this,y)||d(this,m,G).call(this)}abort(s=!1){return this.isAborted=!0,this.isAbortedBySender=s,this.isAbortedByReceiver=!s,this.throw(`Transfer is aborted by ${s?"sender":"receiver"}`,!s)}throw(s,t=!0){this.incomingTransport.transfers.delete(this.id),clearInterval(i(this,x)),this.error=new Error(s);for(let{error:r}of this.listeners)r?.call(...this[c],this,this.error);t&&this.ws.sendMessage(h.error,this.id,s)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}};u=new WeakMap,C=new WeakMap,P=new WeakMap,y=new WeakMap,x=new WeakMap,j=new WeakMap,m=new WeakSet,os=async function(){if(l(this,u,this.constructor.methods[this.type]),i(this,u))await i(this,u).setup.call(this);else throw new Error(`Unknown type of transfer "${this.type}"`)},W=async function(){let[s,t]=i(this,P).shift();i(this,u).transformChunk&&(s=await i(this,u).transformChunk.call(this,s)),this.collect&&await i(this,u).collect.call(this,s);for(let{chunk:r,progress:a}of this.listeners)await(r??a)?.call(...this[c],this,s);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),i(this,P).length?d(this,m,W).call(this):(l(this,y,!1),this.isTransfered&&d(this,m,G).call(this))},G=async function(){this.progress=1,await i(this,u).done?.call(this);for(let{end:s}of this.listeners)await s?.call(...this[c],this);clearInterval(i(this,x)),this.incomingTransport.transfers.delete(this.id),this.ws.sendMessage(h.completed,this.id)},e(S,"methods",{object:{setup(){this.data=""},collect(s){this.data+=s},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(s){this.data+=s},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(s){this.data+=s}}});var g=class g{constructor(s,t={}){e(this,"listeners",new Map);e(this,"listenerHandler",(s,t,r)=>{let a=t.match(this.listenerHandlerRegExp)?.[1];if(a)return s?this.listeners.get(a)?.add(r)??this.listeners.set(a,new Set([r])):r?this.listeners.get(a)?.delete(r):this.listeners.delete(a),!0});e(this,"transfers",new Map);s.incomingTransport=this;let{sizeLimit:r=ns}=t;this.sizeLimit=r,s.listenerHandlers.add(this.listenerHandler),s.isWebSocketServer?(this.listenerHandlerRegExp=/^client-transfer:(.*)$/,s.on(`client-message:${h.request}`,(...a)=>g.handleRequest.call(...a)),s.on(`client-message:${h.chunk}`,(...a)=>g.handleChunk.call(...a)),s.on(`client-message:${h.sent}`,(...a)=>g.handleSent.call(...a)),s.on(`client-message:${h.abort}`,(...a)=>g.handleAbort.call(...a))):(this.listenerHandlerRegExp=/^transfer:(.*)$/,s.on(`message:${h.request}`,g.handleRequest),s.on(`message:${h.chunk}`,g.handleChunk),s.on(`message:${h.sent}`,g.handleSent),s.on(`message:${h.abort}`,g.handleAbort))}static handleRequest(s,t,{type:r,size:a,metadata:q,...B}){let{incomingTransport:z}=this.wss??this,w=z.constructor.IncomingTransfer;z.listeners.has(s)?z.transfers.has(t)?this.sendMessage(h.error,t,"Transfer already exists"):w.methods[r]?a>this.sizeLimit?this.sendMessage(h.error,t,`Transfer size (${a} bytes) exeeds limit of ${this.sizeLimit} bytes`):new w(this,s,t,{type:r,size:a,metadata:q,...B}):this.sendMessage(h.error,t,"Unknown type of transfer"):this.sendMessage(h.error,t,`Unknown kind of file "${s}"`)}static handleChunk(s,...t){(this.wss??this).incomingTransport.transfers.get(s)?.handleChunk(...t)}static handleSent(s){(this.wss??this).incomingTransport.transfers.get(s)?.handleSent()}static handleAbort(s){(this.wss??this).incomingTransport.transfers.get(s)?.abort(!0)}};e(g,"IncomingTransfer",S);var H=g;var O=class extends S{};e(O,"methods",{file:{setup(){this.collect&&(this.data="")},collect(s){this.data+=s},end(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}}});var K=class extends H{};e(K,"IncomingTransfer",O);import{uid as ps}from"@nesvet/n";var M,k,D,V,R=class{constructor(s,t={}){o(this,D);o(this,M,0);o(this,k,0);e(this,"isAborted",!1);this.string=s,this.size=this.string.length;let{chunkSize:r=1024*256}=t;this.chunkSize=r}start(s){this.listener=s,d(this,D,V).call(this)}abort(){this.isAborted=!0}};M=new WeakMap,k=new WeakMap,D=new WeakSet,V=async function(){if(!this.isAborted){l(this,k,Math.min(i(this,M)+this.chunkSize,this.size));let s=await new Promise(t=>t(this.string.slice(i(this,M),i(this,k))));this.isAborted||(await this.listener(s),i(this,k)<this.size&&(l(this,M,i(this,k)),d(this,D,V).call(this)))}};var b,$,v,L,A,ls,X,p=class{constructor(s,t,{data:r,type:a,incomingType:q,collect:B,metadata:z,size:w,chunkSize:cs,encoding:fs,incomingEncoding:gs,onBegin:_,onSenderProgress:ss,onProgress:ts,onEnd:es,onError:is}){o(this,A);e(this,"id",ps());o(this,b,null);e(this,"isAborted",!1);e(this,"isTransfered",!1);e(this,"confirmResponse");e(this,"beginAt",null);o(this,$,null);o(this,v,[]);o(this,L,!1);e(this,"duration",null);e(this,"transferedSize",0);e(this,"bytesPerMs",null);e(this,"senderProgress",0);e(this,"progress",0);e(this,"endAt",null);e(this,"error",null);e(this,"handleChunk",s=>{i(this,v).push(s),i(this,L)||(l(this,L,!0),d(this,A,X).call(this))});e(this,"sent",()=>this.ws.sendMessage(h.sent,this.id));return this.ws=s,this[c]=s.wss?[s.wss,s]:[s],this.outgoingTransport=(s.wss??s).outgoingTransport,this.kind=t,this.data=r,this.collect=B??!1,this.metadata=z,this.size=w??null,this.encoding=fs,this.chunkSize=cs??this.constructor.chunkSize,_&&(this.onBegin=_),ss&&(this.onSenderProgress=ss),ts&&(this.onProgress=ts),es&&(this.onEnd=es),is&&(this.onError=is),this.outgoingTransport.transfers.set(this.id,this),(async()=>(await d(this,A,ls).call(this,a),this.ws.sendMessage(h.request,this.kind,this.id,{type:q??this.type,collect:this.collect,encoding:gs??this.encoding,size:this.size,metadata:this.metadata}),this))()}async handleConfirm(s){this.confirmResponse=s,this.beginAt=l(this,$,Date.now()),await this.onBegin?.call(...this[c],this),i(this,b).confirm.call(this)}handleProgress(s){this.progress=s,this.onProgress?.call(...this[c],this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.outgoingTransport.transfers.delete(this.id),this.progress!==1&&(this.progress=1,await this.onProgress?.call(...this[c],this)),this.onEnd?.call(...this[c],this)}throw(s){this.outgoingTransport.transfers.delete(this.id),this.error=new Error(s),this.onError?.call(...this[c],this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(h.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}};b=new WeakMap,$=new WeakMap,v=new WeakMap,L=new WeakMap,A=new WeakSet,ls=async function(s){for(let[t,r,a]of this.constructor.methods)if(s===t||r(this.data)){this.type=t,l(this,b,a);break}if(this.type)await i(this,b).setup.call(this),delete this.data;else throw new Error("Unknown type of transfer")},X=async function(){let s=i(this,v).shift(),t=s.length;i(this,b).transformChunk&&(s=await i(this,b).transformChunk.call(this,s)),this.ws.sendMessage(h.chunk,this.id,s,t);let r=Date.now();this.bytesPerMs=t/(r-i(this,$)),l(this,$,r),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.onSenderProgress?.call(...this[c],this),i(this,v).length?d(this,A,X).call(this):(l(this,L,!1),this.senderProgress===1&&this.sent())},e(p,"methods",[["object",s=>typeof s=="object",{setup(){this.stringStreamer=new R(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",s=>typeof s=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(s),{setup(){let[s,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new R(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:s}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",s=>typeof s=="string",{setup(){this.stringStreamer=new R(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),e(p,"chunkSize",hs);var f=class f{constructor(s){e(this,"transfers",new Map);s.outgoingTransport=this,s.isWebSocketServer?(s.on("client-connect",f.handleClientConnect),s.on(`client-message:${h.confirm}`,(...t)=>f.handleConfirm.call(...t)),s.on(`client-message:${h.progress}`,(...t)=>f.handleProgress.call(...t)),s.on(`client-message:${h.completed}`,(...t)=>f.handleCompleted.call(...t)),s.on(`client-message:${h.error}`,(...t)=>f.handleError.call(...t))):(s.transfer=f.transfer,s.on(`message:${h.confirm}`,f.handleConfirm),s.on(`message:${h.progress}`,f.handleProgress),s.on(`message:${h.completed}`,f.handleCompleted),s.on(`message:${h.error}`,f.handleError))}static async transfer(...s){let t=(this.wss??this).outgoingTransport.constructor.OutgoingTransfer;return new t(this,...s)}static handleConfirm(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleConfirm(...t)}static handleProgress(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleProgress(...t)}static handleCompleted(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleCompleted(...t)}static handleError(s,t){(this.wss??this).outgoingTransport.transfers.get(s)?.throw(t)}static handleClientConnect(s){Object.assign(s,{transfer:f.transfer})}};e(f,"OutgoingTransfer",p);var U=f;async function ds(n){return new Promise(s=>{let t=new FileReader;t.onload=({target:{result:r}})=>s(r.substring(r.indexOf(",")+1)),t.readAsDataURL(new Blob([n]))})}var E,T,I,Y,J,F=class{constructor(s,t={}){o(this,I);o(this,E,0);o(this,T,0);e(this,"isAborted",!1);o(this,J,async()=>{if(!this.isAborted){let s=this.fileReader.result;s.length=s.byteLength,await this.listener(s),i(this,T)<this.size&&(l(this,E,i(this,T)),d(this,I,Y).call(this))}});this.file=s,this.size=this.file.size;let{chunkSize:r=1024*256}=t;this.chunkSize=r,this.fileReader=new FileReader,this.fileReader.onload=i(this,J)}start(s){this.listener=s,d(this,I,Y).call(this)}abort(){this.isAborted=!0}};E=new WeakMap,T=new WeakMap,I=new WeakSet,Y=function(){this.isAborted||(l(this,T,Math.min(i(this,E)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(i(this,E),i(this,T))))},J=new WeakMap;var N=class extends p{};e(N,"methods",[["file",s=>typeof s=="object"&&s instanceof File,{setup(){let s=this.data;this.fileStreamer=new F(s,{chunkSize:this.chunkSize});let t={name:s.name,type:s.type,size:s.size,modifiedAt:s.lastModified};this.metadata?Object.assign(this.metadata,t):this.metadata=t,this.size=this.fileStreamer.size,this.encoding="buffer"},confirm(){this.fileStreamer.start(this.handleChunk)},transformChunk(s){return ds(s)}}],...p.methods]);var Z=class extends U{};e(Z,"OutgoingTransfer",N);export{O as IncomingTransfer,K as IncomingTransport,N as OutgoingTransfer,Z as OutgoingTransport};
2
- //# sourceMappingURL=browser.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/common.js", "../src/IncomingTransfer.js", "../src/IncomingTransport.js", "../src/browser/incoming.js", "../src/OutgoingTransfer.js", "../src/StringStreamer.js", "../src/OutgoingTransport.js", "../src/browser/arrayBufferToBase64.js", "../src/browser/FileStreamer.js", "../src/browser/outgoing.js"],
4
- "sourcesContent": ["export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const callArgsSymbol = Symbol(\"callArgs\");\n\nexport const progressInterval = 250;\n", "import { callArgsSymbol, headers, progressInterval } from \"./common\";\n\n\nexport class IncomingTransfer {\n\tconstructor(ws, kind, id, { type, collect, encoding, size, metadata }) {\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = ws.wss ? [ ws.wss, ws ] : [ ws ];\n\t\tthis.incomingTransport = (ws.wss ?? ws).incomingTransport;\n\t\t\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.listeners = this.incomingTransport.listeners.get(this.kind);\n\t\t\n\t\tthis.incomingTransport.transfers.set(this.id, this);\n\t\t\n\t\treturn (async () => {\n\t\t\tawait this.#setup();\n\t\t\t\n\t\t\tthis.confirm();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\t#methods;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse;\n\tbeginAt = null;\n\t#prevChunkAt = null;\n\t#chunksQueue = [];\n\t#isProcessing = false;\n\tduration = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs = null;\n\tprogress = 0;\n\tendAt = null;\n\terror = null;\n\t\n\t\n\t#progressInterval;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = this.constructor.methods[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${this.type}\"`);\n\t\t\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tfor (const { begin } of this.listeners)\n\t\t\tif (await begin?.call(...this[callArgsSymbol], this) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t}\n\t\n\thandleChunk(chunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift();\n\t\t\n\t\tif (this.#methods.transformChunk)\n\t\t\tchunk = await this.#methods.transformChunk.call(this, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods.collect.call(this, chunk);\n\t\t\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.listeners)\n\t\t\tawait (chunkListener ?? progressListener)?.call(...this[callArgsSymbol], this, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tthis.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\thandleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tthis.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods.done?.call(this);\n\t\t\n\t\tfor (const { end } of this.listeners)\n\t\t\tawait end?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.incomingTransport.transfers.delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage, sendToSender = true) {\n\t\t\n\t\tthis.incomingTransport.transfers.delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tfor (const { error } of this.listeners)\n\t\t\terror?.call(...this[callArgsSymbol], this, this.error);\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic methods = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type};base64,${this.data}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import { headers, sizeLimit as defaultSizeLimit } from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\n\n\nexport class IncomingTransport {\n\tconstructor(ws, options = {}) {\n\t\tws.incomingTransport = this;\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tws.listenerHandlers.add(this.listenerHandler);\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tthis.listenerHandlerRegExp = /^client-transfer:(.*)$/;\n\t\t\t\n\t\t\tws.on(`client-message:${headers.request}`, (...args) => IncomingTransport.handleRequest.call(...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (...args) => IncomingTransport.handleChunk.call(...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (...args) => IncomingTransport.handleSent.call(...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (...args) => IncomingTransport.handleAbort.call(...args));\n\t\t} else {\n\t\t\tthis.listenerHandlerRegExp = /^transfer:(.*)$/;\n\t\t\t\n\t\t\tws.on(`message:${headers.request}`, IncomingTransport.handleRequest);\n\t\t\tws.on(`message:${headers.chunk}`, IncomingTransport.handleChunk);\n\t\t\tws.on(`message:${headers.sent}`, IncomingTransport.handleSent);\n\t\t\tws.on(`message:${headers.abort}`, IncomingTransport.handleAbort);\n\t\t}\n\t\t\n\t}\n\t\n\tlisteners = new Map();\n\t\n\tlistenerHandler = (add, eventName, listener) => {\n\t\tconst kind = eventName.match(this.listenerHandlerRegExp)?.[1];\n\t\tif (kind) {\n\t\t\tif (add)\n\t\t\t\tthis.listeners.get(kind)?.add(listener) ??\n\t\t\t\t\tthis.listeners.set(kind, new Set([ listener ]));\n\t\t\telse\n\t\t\t\tif (listener)\n\t\t\t\t\tthis.listeners.get(kind)?.delete(listener);\n\t\t\t\telse\n\t\t\t\t\tthis.listeners.delete(kind);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\t};\n\t\n\ttransfers = new Map();\n\t\n\t\n\tstatic IncomingTransfer = IncomingTransfer;\n\t\n\tstatic handleRequest(kind, id, { type, size, metadata, ...restProps }) {\n\t\t\n\t\tconst { incomingTransport } = this.wss ?? this;\n\t\tconst IncomingTransportTransfer = incomingTransport.constructor.IncomingTransfer;\n\t\t\n\t\tif (!incomingTransport.listeners.has(kind))\n\t\t\tthis.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (incomingTransport.transfers.has(id))\n\t\t\tthis.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!IncomingTransportTransfer.methods[type])\n\t\t\tthis.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tthis.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tnew IncomingTransportTransfer(this, kind, id, { type, size, metadata, ...restProps });\n\t\t\n\t}\n\t\n\tstatic handleChunk(id, ...restArgs) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.handleChunk(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleSent(id) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tstatic handleAbort(id) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.abort(true);\n\t\t\n\t}\n\t\n}\n", "import { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\n\n\nclass BrowserIncomingTransfer extends IncomingTransfer {\n\t\n\tstatic methods = {\n\t\t\n\t\tfile: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tend() {\n\t\t\t\t\n\t\t\t\tif (this.collect && this.encoding === \"utf8\")\n\t\t\t\t\tthis.data = atob(this.data);\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n\nclass BrowserIncomingTransport extends IncomingTransport {\n\t\n\tstatic IncomingTransfer = BrowserIncomingTransfer;\n\t\n}\n\n\nexport { BrowserIncomingTransfer as IncomingTransfer, BrowserIncomingTransport as IncomingTransport };\n", "import { uid } from \"@nesvet/n\";\nimport { callArgsSymbol, chunkSize, headers } from \"./common\";\nimport { StringStreamer } from \"./StringStreamer\";\n\n\n// FIXME\n\n\nexport class OutgoingTransfer {\n\tconstructor(ws, kind, {\n\t\tdata,\n\t\ttype,\n\t\tincomingType,\n\t\tcollect,\n\t\tmetadata,\n\t\tsize,\n\t\tchunkSize,\n\t\tencoding,\n\t\tincomingEncoding,\n\t\tonBegin,\n\t\tonSenderProgress,\n\t\tonProgress,\n\t\tonEnd,\n\t\tonError\n\t}) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = ws.wss ? [ ws.wss, ws ] : [ ws ];\n\t\tthis.outgoingTransport = (ws.wss ?? ws).outgoingTransport;\n\t\t\n\t\tthis.kind = kind;\n\t\t\n\t\tthis.data = data;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? this.constructor.chunkSize;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.onError = onError;\n\t\t\n\t\tthis.outgoingTransport.transfers.set(this.id, this);\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tawait this.#setup(type);\n\t\t\t\n\t\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\t\ttype: incomingType ?? this.type,\n\t\t\t\tcollect: this.collect,\n\t\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\t\tsize: this.size,\n\t\t\t\tmetadata: this.metadata\n\t\t\t});\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tid = uid();\n\t#methods = null;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse;\n\tbeginAt = null;\n\t#prevChunkAt = null;\n\t#chunksQueue = [];\n\t#isProcessing = false;\n\tduration = null;\n\ttransferedSize = 0;\n\tbytesPerMs = null;\n\tsenderProgress = 0;\n\tprogress = 0;\n\tendAt = null;\n\terror = null;\n\t\n\tasync #setup(type) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of this.constructor.methods)\n\t\t\tif (type === availableType || test(this.data)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods.setup.call(this);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t}\n\t\n\tasync handleConfirm(confirmResponse) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tawait this.onBegin?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tthis.#methods.confirm.call(this);\n\t\t\n\t}\n\t\n\thandleChunk = chunk => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift();\n\t\t\n\t\tconst chunkLength = chunk.length;\n\t\t\n\t\tif (this.#methods.transformChunk)\n\t\t\tchunk = await this.#methods.transformChunk.call(this, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tawait this.onSenderProgress?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress) {\n\t\tthis.progress = progress;\n\t\t\n\t\tthis.onProgress?.call(...this[callArgsSymbol], this);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.outgoingTransport.transfers.delete(this.id);\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait this.onProgress?.call(...this[callArgsSymbol], this);\n\t\t}\n\t\t\n\t\tthis.onEnd?.call(...this[callArgsSymbol], this);\n\t\t\n\t}\n\t\n\tthrow(errorMessage) {\n\t\t\n\t\tthis.outgoingTransport.transfers.delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tthis.onError?.call(...this[callArgsSymbol], this, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic methods = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = this.data.split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = chunkSize;\n\t\n}\n", "export class StringStreamer {\n\tconstructor(string, options = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise(resolve => resolve(this.string.slice(this.#start, this.#end)));\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tthis.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { headers } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\n\n\nexport class OutgoingTransport {\n\tconstructor(ws) {\n\t\tws.outgoingTransport = this;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(\"client-connect\", OutgoingTransport.handleClientConnect);\n\t\t\t\n\t\t\tws.on(`client-message:${headers.confirm}`, (...args) => OutgoingTransport.handleConfirm.call(...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (...args) => OutgoingTransport.handleProgress.call(...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (...args) => OutgoingTransport.handleCompleted.call(...args));\n\t\t\tws.on(`client-message:${headers.error}`, (...args) => OutgoingTransport.handleError.call(...args));\n\t\t} else {\n\t\t\tws.transfer = OutgoingTransport.transfer;\n\t\t\t\n\t\t\tws.on(`message:${headers.confirm}`, OutgoingTransport.handleConfirm);\n\t\t\tws.on(`message:${headers.progress}`, OutgoingTransport.handleProgress);\n\t\t\tws.on(`message:${headers.completed}`, OutgoingTransport.handleCompleted);\n\t\t\tws.on(`message:${headers.error}`, OutgoingTransport.handleError);\n\t\t}\n\t\t\n\t}\n\t\n\ttransfers = new Map();\n\t\n\t\n\tstatic OutgoingTransfer = OutgoingTransfer;\n\t\n\tstatic async transfer(...args) {\n\t\t\n\t\tconst OutgoingTransportTransfer = (this.wss ?? this).outgoingTransport.constructor.OutgoingTransfer;\n\t\t\n\t\treturn new OutgoingTransportTransfer(this, ...args);\n\t}\n\t\n\tstatic handleConfirm(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleConfirm(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleProgress(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleProgress(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleCompleted(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleCompleted(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleError(id, errorMessage) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientConnect(ws) {\n\t\tObject.assign(ws, {\n\t\t\ttransfer: OutgoingTransport.transfer\n\t\t});\n\t\t\n\t}\n\t\n}\n", "export async function arrayBufferToBase64(arrayBuffer) {\n\treturn new Promise(resolve => {\n\t\t\n\t\tconst fileReader = new FileReader();\n\t\t\n\t\tfileReader.onload = ({ target: { result } }) => resolve(result.substring(result.indexOf(\",\") + 1));\n\t\t\n\t\tfileReader.readAsDataURL(new Blob([ arrayBuffer ]));\n\t\t\n\t});\n}\n", "export class FileStreamer {\n\tconstructor(file, options = {}) {\n\t\tthis.file = file;\n\t\tthis.size = this.file.size;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t\tthis.fileReader = new FileReader();\n\t\t\n\t\tthis.fileReader.onload = this.#handleFileReaderLoad;\n\t\t\n\t}\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\t#next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tthis.fileReader.readAsArrayBuffer(this.file.slice(this.#start, this.#end));\n\t\t}\n\t\t\n\t}\n\t\n\t#handleFileReaderLoad = async () => {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tconst arrayBuffer = this.fileReader.result;\n\t\t\tarrayBuffer.length = arrayBuffer.byteLength;\n\t\t\t\n\t\t\tawait this.listener(arrayBuffer);\n\t\t\t\n\t\t\tif (this.#end < this.size) {\n\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\n\t\t\t\tthis.#next();\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\nimport { arrayBufferToBase64 } from \"./arrayBufferToBase64\";\nimport { FileStreamer } from \"./FileStreamer\";\n\n\nclass BrowserOutgoingTransfer extends OutgoingTransfer {\n\t\n\tstatic methods = [\n\t\t\n\t\t[ \"file\", data => typeof data == \"object\" && data instanceof File, {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst file = this.data;\n\t\t\t\t\n\t\t\t\tthis.fileStreamer = new FileStreamer(file, { chunkSize: this.chunkSize });\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmodifiedAt: file.lastModified\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t\tthis.size = this.fileStreamer.size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.fileStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn arrayBufferToBase64(chunk);\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.methods\n\t\t\n\t];\n\t\n}\n\nclass BrowserOutgoingTransport extends OutgoingTransport {\n\t\n\tstatic OutgoingTransfer = BrowserOutgoingTransfer;\n\t\n}\n\n\nexport { BrowserOutgoingTransfer as OutgoingTransfer,\n\tBrowserOutgoingTransport as OutgoingTransport };\n"],
5
- "mappings": "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",
6
- "names": ["headers", "sizeLimit", "chunkSize", "callArgsSymbol", "progressInterval", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_progressInterval", "_lastProgress", "_IncomingTransfer_instances", "setup_fn", "process_fn", "complete_fn", "IncomingTransfer", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "__privateAdd", "__publicField", "callArgsSymbol", "__privateMethod", "begin", "__privateSet", "headers", "__privateGet", "progressInterval", "chunk", "length", "ts", "bySender", "errorMessage", "sendToSender", "error", "chunkListener", "progressListener", "end", "_IncomingTransport", "ws", "options", "__publicField", "add", "eventName", "listener", "kind", "sizeLimit", "headers", "args", "id", "type", "size", "metadata", "restProps", "incomingTransport", "IncomingTransportTransfer", "restArgs", "IncomingTransfer", "IncomingTransport", "BrowserIncomingTransfer", "IncomingTransfer", "__publicField", "chunk", "BrowserIncomingTransport", "IncomingTransport", "uid", "_start", "_end", "_StringStreamer_instances", "next_fn", "StringStreamer", "string", "options", "__privateAdd", "__publicField", "chunkSize", "listener", "__privateMethod", "__privateSet", "__privateGet", "chunk", "resolve", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_OutgoingTransfer_instances", "setup_fn", "process_fn", "OutgoingTransfer", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "__privateAdd", "__publicField", "uid", "chunk", "__privateGet", "__privateSet", "__privateMethod", "headers", "callArgsSymbol", "confirmResponse", "progress", "errorMessage", "availableType", "test", "methods", "chunkLength", "ts", "StringStreamer", "_OutgoingTransport", "ws", "__publicField", "headers", "args", "OutgoingTransportTransfer", "id", "restArgs", "errorMessage", "OutgoingTransfer", "OutgoingTransport", "arrayBufferToBase64", "arrayBuffer", "resolve", "fileReader", "result", "_start", "_end", "_FileStreamer_instances", "next_fn", "_handleFileReaderLoad", "FileStreamer", "file", "options", "__privateAdd", "__publicField", "arrayBuffer", "__privateGet", "__privateSet", "__privateMethod", "chunkSize", "listener", "BrowserOutgoingTransfer", "OutgoingTransfer", "__publicField", "data", "file", "FileStreamer", "metadata", "chunk", "arrayBufferToBase64", "BrowserOutgoingTransport", "OutgoingTransport"]
7
- }
package/dist/node.js DELETED
@@ -1,2 +0,0 @@
1
- import{Readable as L}from"node:stream";var r={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},w=10*1024*1024*1024,C=1024*256,h=Symbol("callArgs"),P=250;var c=class{constructor(s,t,i,{type:n,collect:a,encoding:g,size:o,metadata:d}){return this.ws=s,this[h]=s.wss?[s.wss,s]:[s],this.incomingTransport=(s.wss??s).incomingTransport,this.kind=t,this.id=i,this.type=n,this.collect=!!a,this.encoding=g,this.size=o,this.metadata=d,this.listeners=this.incomingTransport.listeners.get(this.kind),this.incomingTransport.transfers.set(this.id,this),(async()=>(await this.#o(),this.confirm(),this))()}#s;isAborted=!1;isAbortedBySender=!1;isAbortedByReceiver=!1;isTransfered=!1;confirmResponse;beginAt=null;#t=null;#e=[];#i=!1;duration=null;transferedSize=0;processedSize=0;bytesPerMs=null;progress=0;endAt=null;error=null;#r;#n=0;async#o(){if(this.#s=this.constructor.methods[this.type],this.#s)await this.#s.setup.call(this);else throw new Error(`Unknown type of transfer "${this.type}"`)}async confirm(){for(let{begin:s}of this.listeners)if(await s?.call(...this[h],this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=this.#t=Date.now(),this.ws.sendMessage(r.confirm,this.id,this.confirmResponse),this.#r=setInterval(()=>{this.#n!==this.progress&&(this.#n=this.progress,this.ws.sendMessage(r.progress,this.id,this.progress))},P)}handleChunk(s,t=s.length){let i=Date.now();this.bytesPerMs=t/(i-this.#t),this.#t=i,this.transferedSize+=t,this.#e.push([s,t]),this.#i||(this.#i=!0,this.#h())}async#h(){let[s,t]=this.#e.shift();this.#s.transformChunk&&(s=await this.#s.transformChunk.call(this,s)),this.collect&&await this.#s.collect.call(this,s);for(let{chunk:i,progress:n}of this.listeners)await(i??n)?.call(...this[h],this,s);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),this.#e.length?this.#h():(this.#i=!1,this.isTransfered&&this.#a())}handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#i||this.#a()}async#a(){this.progress=1,await this.#s.done?.call(this);for(let{end:s}of this.listeners)await s?.call(...this[h],this);clearInterval(this.#r),this.incomingTransport.transfers.delete(this.id),this.ws.sendMessage(r.completed,this.id)}abort(s=!1){return this.isAborted=!0,this.isAbortedBySender=s,this.isAbortedByReceiver=!s,this.throw(`Transfer is aborted by ${s?"sender":"receiver"}`,!s)}throw(s,t=!0){this.incomingTransport.transfers.delete(this.id),clearInterval(this.#r),this.error=new Error(s);for(let{error:i}of this.listeners)i?.call(...this[h],this,this.error);t&&this.ws.sendMessage(r.error,this.id,s)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}static methods={object:{setup(){this.data=""},collect(s){this.data+=s},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(s){this.data+=s},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(s){this.data+=s}}}};var m=class e{constructor(s,t={}){s.incomingTransport=this;let{sizeLimit:i=w}=t;this.sizeLimit=i,s.listenerHandlers.add(this.listenerHandler),s.isWebSocketServer?(this.listenerHandlerRegExp=/^client-transfer:(.*)$/,s.on(`client-message:${r.request}`,(...n)=>e.handleRequest.call(...n)),s.on(`client-message:${r.chunk}`,(...n)=>e.handleChunk.call(...n)),s.on(`client-message:${r.sent}`,(...n)=>e.handleSent.call(...n)),s.on(`client-message:${r.abort}`,(...n)=>e.handleAbort.call(...n))):(this.listenerHandlerRegExp=/^transfer:(.*)$/,s.on(`message:${r.request}`,e.handleRequest),s.on(`message:${r.chunk}`,e.handleChunk),s.on(`message:${r.sent}`,e.handleSent),s.on(`message:${r.abort}`,e.handleAbort))}listeners=new Map;listenerHandler=(s,t,i)=>{let n=t.match(this.listenerHandlerRegExp)?.[1];if(n)return s?this.listeners.get(n)?.add(i)??this.listeners.set(n,new Set([i])):i?this.listeners.get(n)?.delete(i):this.listeners.delete(n),!0};transfers=new Map;static IncomingTransfer=c;static handleRequest(s,t,{type:i,size:n,metadata:a,...g}){let{incomingTransport:o}=this.wss??this,d=o.constructor.IncomingTransfer;o.listeners.has(s)?o.transfers.has(t)?this.sendMessage(r.error,t,"Transfer already exists"):d.methods[i]?n>this.sizeLimit?this.sendMessage(r.error,t,`Transfer size (${n} bytes) exeeds limit of ${this.sizeLimit} bytes`):new d(this,s,t,{type:i,size:n,metadata:a,...g}):this.sendMessage(r.error,t,"Unknown type of transfer"):this.sendMessage(r.error,t,`Unknown kind of file "${s}"`)}static handleChunk(s,...t){(this.wss??this).incomingTransport.transfers.get(s)?.handleChunk(...t)}static handleSent(s){(this.wss??this).incomingTransport.transfers.get(s)?.handleSent()}static handleAbort(s){(this.wss??this).incomingTransport.transfers.get(s)?.abort(!0)}};var p=class extends L{constructor(s){super(),this.writable=s,this.promise=new Promise((t,i)=>{s.on("close",t),s.on("error",i)}),this.pipe(s)}_read(){}};function O(e){let s=new p(e);return this.streams?.push(s)??(this.streams=[s]),e}var M={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=O},transformChunk(e){if(e=this.isBuffer?Buffer.from(e,"base64"):Buffer.from(e,"base64").toString(this.encoding),this.streams)for(let s of this.streams)s.push(e);return e},collect(e){this.isBuffer?this.data=Buffer.concat([this.data,e]):this.data+=e},async done(){if(this.streams){let e=[];for(let s of this.streams)s.push(null),e.push(s.promise);await Promise.all(e)}}},b=class extends c{static methods={stream:M,file:M,...c.methods}},x=class extends m{static IncomingTransfer=b};import $ from"node:fs";import B from"node:path";import j from"mime";import{uid as q}from"@nesvet/n";var f=class{constructor(s,t={}){this.string=s,this.size=this.string.length;let{chunkSize:i=1024*256}=t;this.chunkSize=i}#s=0;#t=0;isAborted=!1;start(s){this.listener=s,this.#e()}async#e(){if(!this.isAborted){this.#t=Math.min(this.#s+this.chunkSize,this.size);let s=await new Promise(t=>t(this.string.slice(this.#s,this.#t)));this.isAborted||(await this.listener(s),this.#t<this.size&&(this.#s=this.#t,this.#e()))}}abort(){this.isAborted=!0}};var l=class{constructor(s,t,{data:i,type:n,incomingType:a,collect:g,metadata:o,size:d,chunkSize:v,encoding:E,incomingEncoding:I,onBegin:y,onSenderProgress:S,onProgress:k,onEnd:T,onError:A}){return this.ws=s,this[h]=s.wss?[s.wss,s]:[s],this.outgoingTransport=(s.wss??s).outgoingTransport,this.kind=t,this.data=i,this.collect=g??!1,this.metadata=o,this.size=d??null,this.encoding=E,this.chunkSize=v??this.constructor.chunkSize,y&&(this.onBegin=y),S&&(this.onSenderProgress=S),k&&(this.onProgress=k),T&&(this.onEnd=T),A&&(this.onError=A),this.outgoingTransport.transfers.set(this.id,this),(async()=>(await this.#r(n),this.ws.sendMessage(r.request,this.kind,this.id,{type:a??this.type,collect:this.collect,encoding:I??this.encoding,size:this.size,metadata:this.metadata}),this))()}id=q();#s=null;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#t=null;#e=[];#i=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;async#r(s){for(let[t,i,n]of this.constructor.methods)if(s===t||i(this.data)){this.type=t,this.#s=n;break}if(this.type)await this.#s.setup.call(this),delete this.data;else throw new Error("Unknown type of transfer")}async handleConfirm(s){this.confirmResponse=s,this.beginAt=this.#t=Date.now(),await this.onBegin?.call(...this[h],this),this.#s.confirm.call(this)}handleChunk=s=>{this.#e.push(s),this.#i||(this.#i=!0,this.#n())};async#n(){let s=this.#e.shift(),t=s.length;this.#s.transformChunk&&(s=await this.#s.transformChunk.call(this,s)),this.ws.sendMessage(r.chunk,this.id,s,t);let i=Date.now();this.bytesPerMs=t/(i-this.#t),this.#t=i,this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.onSenderProgress?.call(...this[h],this),this.#e.length?this.#n():(this.#i=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(r.sent,this.id);handleProgress(s){this.progress=s,this.onProgress?.call(...this[h],this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.outgoingTransport.transfers.delete(this.id),this.progress!==1&&(this.progress=1,await this.onProgress?.call(...this[h],this)),this.onEnd?.call(...this[h],this)}throw(s){this.outgoingTransport.transfers.delete(this.id),this.error=new Error(s),this.onError?.call(...this[h],this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(r.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}static methods=[["object",s=>typeof s=="object",{setup(){this.stringStreamer=new f(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",s=>typeof s=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(s),{setup(){let[s,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new f(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:s}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",s=>typeof s=="string",{setup(){this.stringStreamer=new f(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=C};var u=class e{constructor(s){s.outgoingTransport=this,s.isWebSocketServer?(s.on("client-connect",e.handleClientConnect),s.on(`client-message:${r.confirm}`,(...t)=>e.handleConfirm.call(...t)),s.on(`client-message:${r.progress}`,(...t)=>e.handleProgress.call(...t)),s.on(`client-message:${r.completed}`,(...t)=>e.handleCompleted.call(...t)),s.on(`client-message:${r.error}`,(...t)=>e.handleError.call(...t))):(s.transfer=e.transfer,s.on(`message:${r.confirm}`,e.handleConfirm),s.on(`message:${r.progress}`,e.handleProgress),s.on(`message:${r.completed}`,e.handleCompleted),s.on(`message:${r.error}`,e.handleError))}transfers=new Map;static OutgoingTransfer=l;static async transfer(...s){let t=(this.wss??this).outgoingTransport.constructor.OutgoingTransfer;return new t(this,...s)}static handleConfirm(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleConfirm(...t)}static handleProgress(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleProgress(...t)}static handleCompleted(s,...t){(this.wss??this).outgoingTransport.transfers.get(s)?.handleCompleted(...t)}static handleError(s,t){(this.wss??this).outgoingTransport.transfers.get(s)?.throw(t)}static handleClientConnect(s){Object.assign(s,{transfer:e.transfer})}};var z=class extends l{static methods=[["stream",s=>typeof s=="object"&&typeof s.on=="function"&&typeof s.read=="function",{setup(){this.stream=this.data,this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0)},confirm(){this.stream.on("data",this.handleChunk),this.size||this.stream.on("end",this.sent)},transformChunk(s){return(this.isBuffer?s:Buffer.from(s,this.encoding)).toString("base64")}}],["file",s=>typeof s=="string"&&/^(\/|(\/[^/]+)+)$/.test(s),{async setup(){let s=this.data,t=B.basename(s),{size:i,mtimeMs:n}=await $.promises.stat(s),a={name:t,type:j.getType(B.extname(t).slice(1)),size:i,modifiedAt:n};this.stream=$.createReadStream(s),this.size=i,this.encoding="buffer",this.metadata?Object.assign(this.metadata,a):this.metadata=a},confirm(){this.stream.on("data",this.handleChunk)},transformChunk(s){return s.toString("base64")}}],...l.methods]},R=class extends u{static OutgoingTransfer=z};export{b as IncomingTransfer,x as IncomingTransport,z as OutgoingTransfer,R as OutgoingTransport};
2
- //# sourceMappingURL=node.js.map
package/dist/node.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/node/incoming.js", "../src/common.js", "../src/IncomingTransfer.js", "../src/IncomingTransport.js", "../src/node/outgoing.js", "../src/OutgoingTransfer.js", "../src/StringStreamer.js", "../src/OutgoingTransport.js"],
4
- "sourcesContent": ["import { Readable } from \"node:stream\";\nimport { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\n\n\nclass TransferStream extends Readable {\n\tconstructor(writableStream) {\n\t\tsuper();\n\t\t\n\t\tthis.writable = writableStream;\n\t\t\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\twritableStream.on(\"close\", resolve);\n\t\t\twritableStream.on(\"error\", reject);\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.pipe(writableStream);\n\t\t\n\t}\n\t\n\t_read() {}\n\t\n}\n\nfunction pipeTo(writableStream) {\n\tconst stream = new TransferStream(writableStream);\n\t\n\tthis.streams?.push(stream) ??\n\t\t(this.streams = [ stream ]);\n\t\n\treturn writableStream;\n}\n\nconst streamMethod = {\n\tsetup() {\n\t\t\n\t\tif (!this.encoding)\n\t\t\tthis.encoding = \"buffer\";\n\t\t\n\t\tif (this.encoding === \"buffer\")\n\t\t\tthis.isBuffer = true;\n\t\t\n\t\tif (this.collect)\n\t\t\tthis.data = this.isBuffer ? Buffer.from(\"\") : \"\";\n\t\t\n\t\tthis.pipeTo = pipeTo;\n\t\t\n\t},\n\t\n\ttransformChunk(chunk) {\n\t\tchunk = this.isBuffer ? Buffer.from(chunk, \"base64\") : Buffer.from(chunk, \"base64\").toString(this.encoding);\n\t\t\n\t\tif (this.streams)\n\t\t\tfor (const stream of this.streams)\n\t\t\t\tstream.push(chunk);\n\t\t\n\t\treturn chunk;\n\t},\n\t\n\tcollect(chunk) {\n\t\tif (this.isBuffer)\n\t\t\tthis.data = Buffer.concat([ this.data, chunk ]);\n\t\telse\n\t\t\tthis.data += chunk;\n\t\t\n\t},\n\t\n\tasync done() {\n\t\t\n\t\tif (this.streams) {\n\t\t\tconst promises = [];\n\t\t\t\n\t\t\tfor (const stream of this.streams) {\n\t\t\t\tstream.push(null);\n\t\t\t\tpromises.push(stream.promise);\n\t\t\t}\n\t\t\t\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t\t\n\t}\n};\n\n\nclass NodeIncomingTransfer extends IncomingTransfer {\n\t\n\tstatic methods = {\n\t\t\n\t\tstream: streamMethod,\n\t\t\n\t\tfile: streamMethod,\n\t\t\n\t\t...IncomingTransfer.methods\n\t\t\n\t};\n\t\n}\n\nclass NodeIncomingTransport extends IncomingTransport {\n\t\n\tstatic IncomingTransfer = NodeIncomingTransfer;\n\t\n}\n\n\nexport { NodeIncomingTransfer as IncomingTransfer,\n\tNodeIncomingTransport as IncomingTransport };\n", "export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const callArgsSymbol = Symbol(\"callArgs\");\n\nexport const progressInterval = 250;\n", "import { callArgsSymbol, headers, progressInterval } from \"./common\";\n\n\nexport class IncomingTransfer {\n\tconstructor(ws, kind, id, { type, collect, encoding, size, metadata }) {\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = ws.wss ? [ ws.wss, ws ] : [ ws ];\n\t\tthis.incomingTransport = (ws.wss ?? ws).incomingTransport;\n\t\t\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.listeners = this.incomingTransport.listeners.get(this.kind);\n\t\t\n\t\tthis.incomingTransport.transfers.set(this.id, this);\n\t\t\n\t\treturn (async () => {\n\t\t\tawait this.#setup();\n\t\t\t\n\t\t\tthis.confirm();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\t#methods;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse;\n\tbeginAt = null;\n\t#prevChunkAt = null;\n\t#chunksQueue = [];\n\t#isProcessing = false;\n\tduration = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs = null;\n\tprogress = 0;\n\tendAt = null;\n\terror = null;\n\t\n\t\n\t#progressInterval;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = this.constructor.methods[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${this.type}\"`);\n\t\t\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tfor (const { begin } of this.listeners)\n\t\t\tif (await begin?.call(...this[callArgsSymbol], this) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t}\n\t\n\thandleChunk(chunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift();\n\t\t\n\t\tif (this.#methods.transformChunk)\n\t\t\tchunk = await this.#methods.transformChunk.call(this, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods.collect.call(this, chunk);\n\t\t\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.listeners)\n\t\t\tawait (chunkListener ?? progressListener)?.call(...this[callArgsSymbol], this, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tthis.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\thandleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tthis.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods.done?.call(this);\n\t\t\n\t\tfor (const { end } of this.listeners)\n\t\t\tawait end?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.incomingTransport.transfers.delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage, sendToSender = true) {\n\t\t\n\t\tthis.incomingTransport.transfers.delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tfor (const { error } of this.listeners)\n\t\t\terror?.call(...this[callArgsSymbol], this, this.error);\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic methods = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type};base64,${this.data}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import { headers, sizeLimit as defaultSizeLimit } from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\n\n\nexport class IncomingTransport {\n\tconstructor(ws, options = {}) {\n\t\tws.incomingTransport = this;\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tws.listenerHandlers.add(this.listenerHandler);\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tthis.listenerHandlerRegExp = /^client-transfer:(.*)$/;\n\t\t\t\n\t\t\tws.on(`client-message:${headers.request}`, (...args) => IncomingTransport.handleRequest.call(...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (...args) => IncomingTransport.handleChunk.call(...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (...args) => IncomingTransport.handleSent.call(...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (...args) => IncomingTransport.handleAbort.call(...args));\n\t\t} else {\n\t\t\tthis.listenerHandlerRegExp = /^transfer:(.*)$/;\n\t\t\t\n\t\t\tws.on(`message:${headers.request}`, IncomingTransport.handleRequest);\n\t\t\tws.on(`message:${headers.chunk}`, IncomingTransport.handleChunk);\n\t\t\tws.on(`message:${headers.sent}`, IncomingTransport.handleSent);\n\t\t\tws.on(`message:${headers.abort}`, IncomingTransport.handleAbort);\n\t\t}\n\t\t\n\t}\n\t\n\tlisteners = new Map();\n\t\n\tlistenerHandler = (add, eventName, listener) => {\n\t\tconst kind = eventName.match(this.listenerHandlerRegExp)?.[1];\n\t\tif (kind) {\n\t\t\tif (add)\n\t\t\t\tthis.listeners.get(kind)?.add(listener) ??\n\t\t\t\t\tthis.listeners.set(kind, new Set([ listener ]));\n\t\t\telse\n\t\t\t\tif (listener)\n\t\t\t\t\tthis.listeners.get(kind)?.delete(listener);\n\t\t\t\telse\n\t\t\t\t\tthis.listeners.delete(kind);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\t};\n\t\n\ttransfers = new Map();\n\t\n\t\n\tstatic IncomingTransfer = IncomingTransfer;\n\t\n\tstatic handleRequest(kind, id, { type, size, metadata, ...restProps }) {\n\t\t\n\t\tconst { incomingTransport } = this.wss ?? this;\n\t\tconst IncomingTransportTransfer = incomingTransport.constructor.IncomingTransfer;\n\t\t\n\t\tif (!incomingTransport.listeners.has(kind))\n\t\t\tthis.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (incomingTransport.transfers.has(id))\n\t\t\tthis.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!IncomingTransportTransfer.methods[type])\n\t\t\tthis.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tthis.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tnew IncomingTransportTransfer(this, kind, id, { type, size, metadata, ...restProps });\n\t\t\n\t}\n\t\n\tstatic handleChunk(id, ...restArgs) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.handleChunk(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleSent(id) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tstatic handleAbort(id) {\n\t\t(this.wss ?? this).incomingTransport.transfers.get(id)?.abort(true);\n\t\t\n\t}\n\t\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport mime from \"mime\";\nimport { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\n\n\nclass NodeOutgoingTransfer extends OutgoingTransfer {\n\t\n\tstatic methods = [\n\t\t\n\t\t[ \"stream\", data => typeof data == \"object\" && typeof data.on == \"function\" && typeof data.read == \"function\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stream = this.data;\n\t\t\t\t\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t\tif (this.encoding === \"buffer\")\n\t\t\t\t\tthis.isBuffer = true;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stream.on(\"data\", this.handleChunk);\n\t\t\t\tif (!this.size)\n\t\t\t\t\tthis.stream.on(\"end\", this.sent);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn (this.isBuffer ? chunk : Buffer.from(chunk, this.encoding)).toString(\"base64\");\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"file\", data => typeof data == \"string\" && /^(\\/|(\\/[^/]+)+)$/.test(data), {\n\t\t\t\n\t\t\tasync setup() {\n\t\t\t\t\n\t\t\t\tconst fileName = this.data;\n\t\t\t\tconst name = path.basename(fileName);\n\t\t\t\tconst { size, mtimeMs: modifiedAt } = await fs.promises.stat(fileName);\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname,\n\t\t\t\t\ttype: mime.getType(path.extname(name).slice(1)),\n\t\t\t\t\tsize,\n\t\t\t\t\tmodifiedAt\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tthis.stream = fs.createReadStream(fileName);\n\t\t\t\t\n\t\t\t\tthis.size = size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stream.on(\"data\", this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn chunk.toString(\"base64\");\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.methods\n\t\t\n\t];\n\t\n}\n\nclass NodeOutgoingTransport extends OutgoingTransport {\n\t\n\tstatic OutgoingTransfer = NodeOutgoingTransfer;\n\t\n}\n\n\nexport { NodeOutgoingTransfer as OutgoingTransfer,\n\tNodeOutgoingTransport as OutgoingTransport };\n", "import { uid } from \"@nesvet/n\";\nimport { callArgsSymbol, chunkSize, headers } from \"./common\";\nimport { StringStreamer } from \"./StringStreamer\";\n\n\n// FIXME\n\n\nexport class OutgoingTransfer {\n\tconstructor(ws, kind, {\n\t\tdata,\n\t\ttype,\n\t\tincomingType,\n\t\tcollect,\n\t\tmetadata,\n\t\tsize,\n\t\tchunkSize,\n\t\tencoding,\n\t\tincomingEncoding,\n\t\tonBegin,\n\t\tonSenderProgress,\n\t\tonProgress,\n\t\tonEnd,\n\t\tonError\n\t}) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis[callArgsSymbol] = ws.wss ? [ ws.wss, ws ] : [ ws ];\n\t\tthis.outgoingTransport = (ws.wss ?? ws).outgoingTransport;\n\t\t\n\t\tthis.kind = kind;\n\t\t\n\t\tthis.data = data;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? this.constructor.chunkSize;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.onError = onError;\n\t\t\n\t\tthis.outgoingTransport.transfers.set(this.id, this);\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tawait this.#setup(type);\n\t\t\t\n\t\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\t\ttype: incomingType ?? this.type,\n\t\t\t\tcollect: this.collect,\n\t\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\t\tsize: this.size,\n\t\t\t\tmetadata: this.metadata\n\t\t\t});\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tid = uid();\n\t#methods = null;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse;\n\tbeginAt = null;\n\t#prevChunkAt = null;\n\t#chunksQueue = [];\n\t#isProcessing = false;\n\tduration = null;\n\ttransferedSize = 0;\n\tbytesPerMs = null;\n\tsenderProgress = 0;\n\tprogress = 0;\n\tendAt = null;\n\terror = null;\n\t\n\tasync #setup(type) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of this.constructor.methods)\n\t\t\tif (type === availableType || test(this.data)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods.setup.call(this);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t}\n\t\n\tasync handleConfirm(confirmResponse) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tawait this.onBegin?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tthis.#methods.confirm.call(this);\n\t\t\n\t}\n\t\n\thandleChunk = chunk => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tthis.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift();\n\t\t\n\t\tconst chunkLength = chunk.length;\n\t\t\n\t\tif (this.#methods.transformChunk)\n\t\t\tchunk = await this.#methods.transformChunk.call(this, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tawait this.onSenderProgress?.call(...this[callArgsSymbol], this);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tthis.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress) {\n\t\tthis.progress = progress;\n\t\t\n\t\tthis.onProgress?.call(...this[callArgsSymbol], this);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.outgoingTransport.transfers.delete(this.id);\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait this.onProgress?.call(...this[callArgsSymbol], this);\n\t\t}\n\t\t\n\t\tthis.onEnd?.call(...this[callArgsSymbol], this);\n\t\t\n\t}\n\t\n\tthrow(errorMessage) {\n\t\t\n\t\tthis.outgoingTransport.transfers.delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tthis.onError?.call(...this[callArgsSymbol], this, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic methods = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = this.data.split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = chunkSize;\n\t\n}\n", "export class StringStreamer {\n\tconstructor(string, options = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise(resolve => resolve(this.string.slice(this.#start, this.#end)));\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tthis.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { headers } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\n\n\nexport class OutgoingTransport {\n\tconstructor(ws) {\n\t\tws.outgoingTransport = this;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(\"client-connect\", OutgoingTransport.handleClientConnect);\n\t\t\t\n\t\t\tws.on(`client-message:${headers.confirm}`, (...args) => OutgoingTransport.handleConfirm.call(...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (...args) => OutgoingTransport.handleProgress.call(...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (...args) => OutgoingTransport.handleCompleted.call(...args));\n\t\t\tws.on(`client-message:${headers.error}`, (...args) => OutgoingTransport.handleError.call(...args));\n\t\t} else {\n\t\t\tws.transfer = OutgoingTransport.transfer;\n\t\t\t\n\t\t\tws.on(`message:${headers.confirm}`, OutgoingTransport.handleConfirm);\n\t\t\tws.on(`message:${headers.progress}`, OutgoingTransport.handleProgress);\n\t\t\tws.on(`message:${headers.completed}`, OutgoingTransport.handleCompleted);\n\t\t\tws.on(`message:${headers.error}`, OutgoingTransport.handleError);\n\t\t}\n\t\t\n\t}\n\t\n\ttransfers = new Map();\n\t\n\t\n\tstatic OutgoingTransfer = OutgoingTransfer;\n\t\n\tstatic async transfer(...args) {\n\t\t\n\t\tconst OutgoingTransportTransfer = (this.wss ?? this).outgoingTransport.constructor.OutgoingTransfer;\n\t\t\n\t\treturn new OutgoingTransportTransfer(this, ...args);\n\t}\n\t\n\tstatic handleConfirm(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleConfirm(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleProgress(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleProgress(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleCompleted(id, ...restArgs) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.handleCompleted(...restArgs);\n\t\t\n\t}\n\t\n\tstatic handleError(id, errorMessage) {\n\t\t(this.wss ?? this).outgoingTransport.transfers.get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientConnect(ws) {\n\t\tObject.assign(ws, {\n\t\t\ttransfer: OutgoingTransport.transfer\n\t\t});\n\t\t\n\t}\n\t\n}\n"],
5
- "mappings": "AAAA,OAAS,YAAAA,MAAgB,cCAlB,IAAMC,EAAU,CACtB,QAAS,aACT,QAAS,aACT,MAAO,OACP,SAAU,OACV,KAAM,UACN,UAAW,eACX,MAAO,WACP,MAAO,UACR,EAEaC,EAAY,GAAK,KAAO,KAAO,KAE/BC,EAAY,KAAO,IAEnBC,EAAiB,OAAO,UAAU,EAElCC,EAAmB,ICdzB,IAAMC,EAAN,KAAuB,CAC7B,YAAYC,EAAIC,EAAMC,EAAI,CAAE,KAAAC,EAAM,QAAAC,EAAS,SAAAC,EAAU,KAAAC,EAAM,SAAAC,CAAS,EAAG,CACtE,YAAK,GAAKP,EACV,KAAKQ,CAAc,EAAIR,EAAG,IAAM,CAAEA,EAAG,IAAKA,CAAG,EAAI,CAAEA,CAAG,EACtD,KAAK,mBAAqBA,EAAG,KAAOA,GAAI,kBAExC,KAAK,KAAOC,EACZ,KAAK,GAAKC,EACV,KAAK,KAAOC,EACZ,KAAK,QAAU,CAAC,CAACC,EACjB,KAAK,SAAWC,EAChB,KAAK,KAAOC,EACZ,KAAK,SAAWC,EAEhB,KAAK,UAAY,KAAK,kBAAkB,UAAU,IAAI,KAAK,IAAI,EAE/D,KAAK,kBAAkB,UAAU,IAAI,KAAK,GAAI,IAAI,GAE1C,UACP,MAAM,KAAKE,GAAO,EAElB,KAAK,QAAQ,EAEN,OACL,CACJ,CAEAC,GACA,UAAY,GACZ,kBAAoB,GACpB,oBAAsB,GACtB,aAAe,GACf,gBACA,QAAU,KACVC,GAAe,KACfC,GAAe,CAAC,EAChBC,GAAgB,GAChB,SAAW,KACX,eAAiB,EACjB,cAAgB,EAChB,WAAa,KACb,SAAW,EACX,MAAQ,KACR,MAAQ,KAGRC,GACAC,GAAgB,EAEhB,KAAMN,IAAS,CAId,GAFA,KAAKC,GAAW,KAAK,YAAY,QAAQ,KAAK,IAAI,EAE9C,KAAKA,GACR,MAAM,KAAKA,GAAS,MAAM,KAAK,IAAI,MAEnC,OAAM,IAAI,MAAM,6BAA6B,KAAK,IAAI,GAAG,CAE3D,CAEA,MAAM,SAAU,CAEf,OAAW,CAAE,MAAAM,CAAM,IAAK,KAAK,UAC5B,GAAI,MAAMA,GAAO,KAAK,GAAG,KAAKR,CAAc,EAAG,IAAI,IAAM,GACxD,OAAO,KAAK,MAAM,mCAAmC,EAEvD,KAAK,QACJ,KAAKG,GACJ,KAAK,IAAI,EAEX,KAAK,GAAG,YAAYM,EAAQ,QAAS,KAAK,GAAI,KAAK,eAAe,EAElE,KAAKH,GAAoB,YAAY,IAAM,CAEtC,KAAKC,KAAkB,KAAK,WAC/B,KAAKA,GAAgB,KAAK,SAC1B,KAAK,GAAG,YAAYE,EAAQ,SAAU,KAAK,GAAI,KAAK,QAAQ,EAG9D,EAAGC,CAAgB,CAEpB,CAEA,YAAYC,EAAOC,EAASD,EAAM,OAAQ,CAEzC,IAAME,EAAK,KAAK,IAAI,EACpB,KAAK,WAAaD,GAAUC,EAAK,KAAKV,IACtC,KAAKA,GAAeU,EACpB,KAAK,gBAAkBD,EAEvB,KAAKR,GAAa,KAAK,CAAEO,EAAOC,CAAO,CAAC,EAEnC,KAAKP,KACT,KAAKA,GAAgB,GACrB,KAAKS,GAAS,EAGhB,CAEA,KAAMA,IAAW,CAEhB,GAAI,CAAEH,EAAOC,CAAO,EAAI,KAAKR,GAAa,MAAM,EAE5C,KAAKF,GAAS,iBACjBS,EAAQ,MAAM,KAAKT,GAAS,eAAe,KAAK,KAAMS,CAAK,GAExD,KAAK,SACR,MAAM,KAAKT,GAAS,QAAQ,KAAK,KAAMS,CAAK,EAE7C,OAAW,CAAE,MAAOI,EAAe,SAAUC,CAAiB,IAAK,KAAK,UACvE,MAAOD,GAAiBC,IAAmB,KAAK,GAAG,KAAKhB,CAAc,EAAG,KAAMW,CAAK,EAErF,KAAK,eAAiBC,EAClB,KAAK,OACR,KAAK,SAAW,KAAK,cAAgB,KAAK,MAEvC,KAAKR,GAAa,OACrB,KAAKU,GAAS,GAEd,KAAKT,GAAgB,GAEjB,KAAK,cACR,KAAKY,GAAU,EAGlB,CAEA,YAAa,CAEZ,KAAK,aAAe,GAEf,KAAK,OACT,KAAK,KAAO,KAAK,gBAElB,KAAK,MAAQ,KAAK,IAAI,EACtB,KAAK,SAAW,KAAK,MAAQ,KAAK,QAClC,KAAK,WAAa,KAAK,KAAO,KAAK,SAE9B,KAAKZ,IACT,KAAKY,GAAU,CAEjB,CAEA,KAAMA,IAAY,CAEjB,KAAK,SAAW,EAEhB,MAAM,KAAKf,GAAS,MAAM,KAAK,IAAI,EAEnC,OAAW,CAAE,IAAAgB,CAAI,IAAK,KAAK,UAC1B,MAAMA,GAAK,KAAK,GAAG,KAAKlB,CAAc,EAAG,IAAI,EAE9C,cAAc,KAAKM,EAAiB,EAEpC,KAAK,kBAAkB,UAAU,OAAO,KAAK,EAAE,EAE/C,KAAK,GAAG,YAAYG,EAAQ,UAAW,KAAK,EAAE,CAE/C,CAEA,MAAMU,EAAW,GAAO,CAEvB,YAAK,UAAY,GACjB,KAAK,kBAAoBA,EACzB,KAAK,oBAAsB,CAACA,EAErB,KAAK,MAAM,0BAA0BA,EAAW,SAAW,UAAU,GAAI,CAACA,CAAQ,CAC1F,CAEA,MAAMC,EAAcC,EAAe,GAAM,CAExC,KAAK,kBAAkB,UAAU,OAAO,KAAK,EAAE,EAE/C,cAAc,KAAKf,EAAiB,EAEpC,KAAK,MAAQ,IAAI,MAAMc,CAAY,EAEnC,OAAW,CAAE,MAAAE,CAAM,IAAK,KAAK,UAC5BA,GAAO,KAAK,GAAG,KAAKtB,CAAc,EAAG,KAAM,KAAK,KAAK,EAElDqB,GACH,KAAK,GAAG,YAAYZ,EAAQ,MAAO,KAAK,GAAIW,CAAY,CAE1D,CAEA,WAAY,CACX,MAAO,CACN,GAAI,KAAK,GACT,KAAM,KAAK,KACX,KAAM,KAAK,KACX,QAAS,KAAK,QACd,SAAU,KAAK,SACf,KAAM,KAAK,KACX,SAAU,KAAK,SACf,UAAW,KAAK,UAChB,kBAAmB,KAAK,kBACxB,oBAAqB,KAAK,oBAC1B,aAAc,KAAK,aACnB,gBAAiB,KAAK,gBACtB,QAAS,KAAK,QACd,SAAU,KAAK,SACf,eAAgB,KAAK,eACrB,cAAe,KAAK,cACpB,WAAY,KAAK,WACjB,SAAU,KAAK,SACf,MAAO,KAAK,MACZ,MAAO,KAAK,KACb,CACD,CAGA,OAAO,QAAU,CAEhB,OAAQ,CACP,OAAQ,CAEP,KAAK,KAAO,EAEb,EAEA,QAAQT,EAAO,CACd,KAAK,MAAQA,CAEd,EAEA,MAAO,CACN,KAAK,KAAO,KAAK,MAAM,KAAK,IAAI,CAEjC,CACD,EAEA,QAAS,CACR,OAAQ,CAEH,KAAK,UACR,KAAK,KAAO,GAEd,EAEA,QAAQA,EAAO,CACd,KAAK,MAAQA,CAEd,EAEA,MAAO,CAEF,KAAK,UACR,KAAK,KAAO,QAAQ,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,GAE5D,CACD,EAEA,OAAQ,CACP,OAAQ,CAEH,KAAK,UACR,KAAK,KAAO,GAEd,EAEA,QAAQA,EAAO,CACd,KAAK,MAAQA,CAEd,CACD,CAED,CAED,EC3QO,IAAMY,EAAN,MAAMC,CAAkB,CAC9B,YAAYC,EAAIC,EAAU,CAAC,EAAG,CAC7BD,EAAG,kBAAoB,KAEvB,GAAM,CACL,UAAAE,EAAYA,CACb,EAAID,EAEJ,KAAK,UAAYC,EAEjBF,EAAG,iBAAiB,IAAI,KAAK,eAAe,EAExCA,EAAG,mBACN,KAAK,sBAAwB,yBAE7BA,EAAG,GAAG,kBAAkBG,EAAQ,OAAO,GAAI,IAAIC,IAASL,EAAkB,cAAc,KAAK,GAAGK,CAAI,CAAC,EACrGJ,EAAG,GAAG,kBAAkBG,EAAQ,KAAK,GAAI,IAAIC,IAASL,EAAkB,YAAY,KAAK,GAAGK,CAAI,CAAC,EACjGJ,EAAG,GAAG,kBAAkBG,EAAQ,IAAI,GAAI,IAAIC,IAASL,EAAkB,WAAW,KAAK,GAAGK,CAAI,CAAC,EAC/FJ,EAAG,GAAG,kBAAkBG,EAAQ,KAAK,GAAI,IAAIC,IAASL,EAAkB,YAAY,KAAK,GAAGK,CAAI,CAAC,IAEjG,KAAK,sBAAwB,kBAE7BJ,EAAG,GAAG,WAAWG,EAAQ,OAAO,GAAIJ,EAAkB,aAAa,EACnEC,EAAG,GAAG,WAAWG,EAAQ,KAAK,GAAIJ,EAAkB,WAAW,EAC/DC,EAAG,GAAG,WAAWG,EAAQ,IAAI,GAAIJ,EAAkB,UAAU,EAC7DC,EAAG,GAAG,WAAWG,EAAQ,KAAK,GAAIJ,EAAkB,WAAW,EAGjE,CAEA,UAAY,IAAI,IAEhB,gBAAkB,CAACM,EAAKC,EAAWC,IAAa,CAC/C,IAAMC,EAAOF,EAAU,MAAM,KAAK,qBAAqB,IAAI,CAAC,EAC5D,GAAIE,EACH,OAAIH,EACH,KAAK,UAAU,IAAIG,CAAI,GAAG,IAAID,CAAQ,GACrC,KAAK,UAAU,IAAIC,EAAM,IAAI,IAAI,CAAED,CAAS,CAAC,CAAC,EAE3CA,EACH,KAAK,UAAU,IAAIC,CAAI,GAAG,OAAOD,CAAQ,EAEzC,KAAK,UAAU,OAAOC,CAAI,EAErB,EAGT,EAEA,UAAY,IAAI,IAGhB,OAAO,iBAAmBC,EAE1B,OAAO,cAAcD,EAAME,EAAI,CAAE,KAAAC,EAAM,KAAAC,EAAM,SAAAC,EAAU,GAAGC,CAAU,EAAG,CAEtE,GAAM,CAAE,kBAAAC,CAAkB,EAAI,KAAK,KAAO,KACpCC,EAA4BD,EAAkB,YAAY,iBAE3DA,EAAkB,UAAU,IAAIP,CAAI,EAEhCO,EAAkB,UAAU,IAAIL,CAAE,EAC1C,KAAK,YAAYP,EAAQ,MAAOO,EAAI,yBAAyB,EACpDM,EAA0B,QAAQL,CAAI,EAEvCC,EAAO,KAAK,UACpB,KAAK,YAAYT,EAAQ,MAAOO,EAAI,kBAAkBE,CAAI,2BAA2B,KAAK,SAAS,QAAQ,EAE3G,IAAII,EAA0B,KAAMR,EAAME,EAAI,CAAE,KAAAC,EAAM,KAAAC,EAAM,SAAAC,EAAU,GAAGC,CAAU,CAAC,EAJpF,KAAK,YAAYX,EAAQ,MAAOO,EAAI,0BAA0B,EAJ9D,KAAK,YAAYP,EAAQ,MAAOO,EAAI,yBAAyBF,CAAI,GAAG,CAUtE,CAEA,OAAO,YAAYE,KAAOO,EAAU,EAClC,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAIP,CAAE,GAAG,YAAY,GAAGO,CAAQ,CAEhF,CAEA,OAAO,WAAWP,EAAI,EACpB,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAIA,CAAE,GAAG,WAAW,CAEpE,CAEA,OAAO,YAAYA,EAAI,EACrB,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAIA,CAAE,GAAG,MAAM,EAAI,CAEnE,CAED,EHtFA,IAAMQ,EAAN,cAA6BC,CAAS,CACrC,YAAYC,EAAgB,CAC3B,MAAM,EAEN,KAAK,SAAWA,EAEhB,KAAK,QAAU,IAAI,QAAQ,CAACC,EAASC,IAAW,CAC/CF,EAAe,GAAG,QAASC,CAAO,EAClCD,EAAe,GAAG,QAASE,CAAM,CAElC,CAAC,EAED,KAAK,KAAKF,CAAc,CAEzB,CAEA,OAAQ,CAAC,CAEV,EAEA,SAASG,EAAOH,EAAgB,CAC/B,IAAMI,EAAS,IAAIN,EAAeE,CAAc,EAEhD,YAAK,SAAS,KAAKI,CAAM,IACvB,KAAK,QAAU,CAAEA,CAAO,GAEnBJ,CACR,CAEA,IAAMK,EAAe,CACpB,OAAQ,CAEF,KAAK,WACT,KAAK,SAAW,UAEb,KAAK,WAAa,WACrB,KAAK,SAAW,IAEb,KAAK,UACR,KAAK,KAAO,KAAK,SAAW,OAAO,KAAK,EAAE,EAAI,IAE/C,KAAK,OAASF,CAEf,EAEA,eAAeG,EAAO,CAGrB,GAFAA,EAAQ,KAAK,SAAW,OAAO,KAAKA,EAAO,QAAQ,EAAI,OAAO,KAAKA,EAAO,QAAQ,EAAE,SAAS,KAAK,QAAQ,EAEtG,KAAK,QACR,QAAWF,KAAU,KAAK,QACzBA,EAAO,KAAKE,CAAK,EAEnB,OAAOA,CACR,EAEA,QAAQA,EAAO,CACV,KAAK,SACR,KAAK,KAAO,OAAO,OAAO,CAAE,KAAK,KAAMA,CAAM,CAAC,EAE9C,KAAK,MAAQA,CAEf,EAEA,MAAM,MAAO,CAEZ,GAAI,KAAK,QAAS,CACjB,IAAMC,EAAW,CAAC,EAElB,QAAWH,KAAU,KAAK,QACzBA,EAAO,KAAK,IAAI,EAChBG,EAAS,KAAKH,EAAO,OAAO,EAG7B,MAAM,QAAQ,IAAIG,CAAQ,CAC3B,CAED,CACD,EAGMC,EAAN,cAAmCC,CAAiB,CAEnD,OAAO,QAAU,CAEhB,OAAQJ,EAER,KAAMA,EAEN,GAAGI,EAAiB,OAErB,CAED,EAEMC,EAAN,cAAoCC,CAAkB,CAErD,OAAO,iBAAmBH,CAE3B,EIvGA,OAAOI,MAAQ,UACf,OAAOC,MAAU,YACjB,OAAOC,MAAU,OCFjB,OAAS,OAAAC,MAAW,YCAb,IAAMC,EAAN,KAAqB,CAC3B,YAAYC,EAAQC,EAAU,CAAC,EAAG,CACjC,KAAK,OAASD,EACd,KAAK,KAAO,KAAK,OAAO,OAExB,GAAM,CACL,UAAAE,EAAY,KAAO,GACpB,EAAID,EAEJ,KAAK,UAAYC,CAElB,CAEAC,GAAS,EACTC,GAAO,EAEP,UAAY,GAEZ,MAAMC,EAAU,CACf,KAAK,SAAWA,EAEhB,KAAKC,GAAM,CAEZ,CAEA,KAAMA,IAAQ,CAEb,GAAI,CAAC,KAAK,UAAW,CACpB,KAAKF,GAAO,KAAK,IAAI,KAAKD,GAAS,KAAK,UAAW,KAAK,IAAI,EAE5D,IAAMI,EAAQ,MAAM,IAAI,QAAQC,GAAWA,EAAQ,KAAK,OAAO,MAAM,KAAKL,GAAQ,KAAKC,EAAI,CAAC,CAAC,EAExF,KAAK,YACT,MAAM,KAAK,SAASG,CAAK,EAErB,KAAKH,GAAO,KAAK,OACpB,KAAKD,GAAS,KAAKC,GAEnB,KAAKE,GAAM,GAGd,CAED,CAEA,OAAQ,CAEP,KAAK,UAAY,EAElB,CAED,ED3CO,IAAMG,EAAN,KAAuB,CAC7B,YAAYC,EAAIC,EAAM,CACrB,KAAAC,EACA,KAAAC,EACA,aAAAC,EACA,QAAAC,EACA,SAAAC,EACA,KAAAC,EACA,UAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,CACD,EAAG,CAEF,YAAK,GAAKf,EACV,KAAKgB,CAAc,EAAIhB,EAAG,IAAM,CAAEA,EAAG,IAAKA,CAAG,EAAI,CAAEA,CAAG,EACtD,KAAK,mBAAqBA,EAAG,KAAOA,GAAI,kBAExC,KAAK,KAAOC,EAEZ,KAAK,KAAOC,EACZ,KAAK,QAAUG,GAAW,GAC1B,KAAK,SAAWC,EAChB,KAAK,KAAOC,GAAQ,KACpB,KAAK,SAAWE,EAChB,KAAK,UAAYD,GAAa,KAAK,YAAY,UAE3CG,IACH,KAAK,QAAUA,GACZC,IACH,KAAK,iBAAmBA,GACrBC,IACH,KAAK,WAAaA,GACfC,IACH,KAAK,MAAQA,GACVC,IACH,KAAK,QAAUA,GAEhB,KAAK,kBAAkB,UAAU,IAAI,KAAK,GAAI,IAAI,GAE1C,UAEP,MAAM,KAAKE,GAAOd,CAAI,EAEtB,KAAK,GAAG,YAAYe,EAAQ,QAAS,KAAK,KAAM,KAAK,GAAI,CACxD,KAAMd,GAAgB,KAAK,KAC3B,QAAS,KAAK,QACd,SAAUM,GAAoB,KAAK,SACnC,KAAM,KAAK,KACX,SAAU,KAAK,QAChB,CAAC,EAEM,OACL,CACJ,CAEA,GAAKS,EAAI,EACTC,GAAW,KACX,UAAY,GACZ,aAAe,GACf,gBACA,QAAU,KACVC,GAAe,KACfC,GAAe,CAAC,EAChBC,GAAgB,GAChB,SAAW,KACX,eAAiB,EACjB,WAAa,KACb,eAAiB,EACjB,SAAW,EACX,MAAQ,KACR,MAAQ,KAER,KAAMN,GAAOd,EAAM,CAElB,OAAW,CAAEqB,EAAeC,EAAMC,CAAQ,IAAK,KAAK,YAAY,QAC/D,GAAIvB,IAASqB,GAAiBC,EAAK,KAAK,IAAI,EAAG,CAC9C,KAAK,KAAOD,EACZ,KAAKJ,GAAWM,EAChB,KACD,CAED,GAAI,KAAK,KACR,MAAM,KAAKN,GAAS,MAAM,KAAK,IAAI,EACnC,OAAO,KAAK,SAEZ,OAAM,IAAI,MAAM,0BAA0B,CAE5C,CAEA,MAAM,cAAcO,EAAiB,CACpC,KAAK,gBAAkBA,EAEvB,KAAK,QACJ,KAAKN,GACJ,KAAK,IAAI,EAEX,MAAM,KAAK,SAAS,KAAK,GAAG,KAAKL,CAAc,EAAG,IAAI,EAEtD,KAAKI,GAAS,QAAQ,KAAK,IAAI,CAEhC,CAEA,YAAcQ,GAAS,CACtB,KAAKN,GAAa,KAAKM,CAAK,EAEvB,KAAKL,KACT,KAAKA,GAAgB,GACrB,KAAKM,GAAS,EAGhB,EAEA,KAAMA,IAAW,CAEhB,IAAID,EAAQ,KAAKN,GAAa,MAAM,EAE9BQ,EAAcF,EAAM,OAEtB,KAAKR,GAAS,iBACjBQ,EAAQ,MAAM,KAAKR,GAAS,eAAe,KAAK,KAAMQ,CAAK,GAE5D,KAAK,GAAG,YAAYV,EAAQ,MAAO,KAAK,GAAIU,EAAOE,CAAW,EAE9D,IAAMC,EAAK,KAAK,IAAI,EACpB,KAAK,WAAaD,GAAeC,EAAK,KAAKV,IAC3C,KAAKA,GAAeU,EACpB,KAAK,gBAAkBD,EAEnB,KAAK,OACR,KAAK,eAAiB,KAAK,eAAiB,KAAK,MAElD,MAAM,KAAK,kBAAkB,KAAK,GAAG,KAAKd,CAAc,EAAG,IAAI,EAE3D,KAAKM,GAAa,OACrB,KAAKO,GAAS,GAEd,KAAKN,GAAgB,GAEjB,KAAK,iBAAmB,GAC3B,KAAK,KAAK,EAGb,CAEA,KAAO,IAAM,KAAK,GAAG,YAAYL,EAAQ,KAAM,KAAK,EAAE,EAEtD,eAAec,EAAU,CACxB,KAAK,SAAWA,EAEhB,KAAK,YAAY,KAAK,GAAG,KAAKhB,CAAc,EAAG,IAAI,CAEpD,CAEA,MAAM,iBAAkB,CAEvB,KAAK,aAAe,GAEf,KAAK,OACT,KAAK,KAAO,KAAK,eACjB,KAAK,eAAiB,GAGvB,KAAK,MAAQ,KAAK,IAAI,EACtB,KAAK,SAAW,KAAK,MAAQ,KAAK,QAClC,KAAK,WAAa,KAAK,KAAO,KAAK,SAEnC,KAAK,kBAAkB,UAAU,OAAO,KAAK,EAAE,EAE3C,KAAK,WAAa,IACrB,KAAK,SAAW,EAChB,MAAM,KAAK,YAAY,KAAK,GAAG,KAAKA,CAAc,EAAG,IAAI,GAG1D,KAAK,OAAO,KAAK,GAAG,KAAKA,CAAc,EAAG,IAAI,CAE/C,CAEA,MAAMiB,EAAc,CAEnB,KAAK,kBAAkB,UAAU,OAAO,KAAK,EAAE,EAE/C,KAAK,MAAQ,IAAI,MAAMA,CAAY,EAEnC,KAAK,SAAS,KAAK,GAAG,KAAKjB,CAAc,EAAG,KAAM,KAAK,KAAK,CAE7D,CAEA,OAAQ,CAEP,YAAK,UAAY,GAEjB,KAAK,GAAG,YAAYE,EAAQ,MAAO,KAAK,EAAE,EAEnC,KAAK,MAAM,+BAA+B,CAClD,CAEA,WAAY,CACX,MAAO,CACN,GAAI,KAAK,GACT,KAAM,KAAK,KACX,KAAM,KAAK,KACX,QAAS,KAAK,QACd,SAAU,KAAK,SACf,KAAM,KAAK,KACX,SAAU,KAAK,SACf,UAAW,KAAK,UAChB,aAAc,KAAK,aACnB,gBAAiB,KAAK,gBACtB,QAAS,KAAK,QACd,SAAU,KAAK,SACf,eAAgB,KAAK,eACrB,WAAY,KAAK,WACjB,eAAgB,KAAK,eACrB,SAAU,KAAK,SACf,MAAO,KAAK,MACZ,MAAO,KAAK,KACb,CACD,CAGA,OAAO,QAAU,CAEhB,CAAE,SAAUhB,GAAQ,OAAOA,GAAQ,SAAU,CAE5C,OAAQ,CAEP,KAAK,eAAiB,IAAIgC,EAAe,KAAK,UAAU,KAAK,IAAI,EAAG,CAAE,UAAW,KAAK,SAAU,CAAC,EACjG,KAAK,QAAU,GACf,KAAK,KAAO,KAAK,eAAe,KAChC,KAAK,SAAW,MAEjB,EAEA,SAAU,CAET,KAAK,eAAe,MAAM,KAAK,WAAW,CAE3C,CACD,CAAE,EAEF,CAAE,UAAWhC,GAAQ,OAAOA,GAAQ,UAAY,wCAAwC,KAAKA,CAAI,EAAG,CAEnG,OAAQ,CAEP,GAAM,CAAEC,EAAMD,CAAK,EAAI,KAAK,KAAK,MAAM,mBAAmB,EAAE,MAAM,CAAC,EAEnE,KAAK,eAAiB,IAAIgC,EAAehC,EAAM,CAAE,UAAW,KAAK,SAAU,CAAC,EAC5E,KAAK,KAAO,KAAK,eAAe,KAChC,KAAK,SAAW,SAChB,KAAK,SAAW,CAAE,GAAG,KAAK,SAAU,KAAAC,CAAK,CAE1C,EAEA,SAAU,CAET,KAAK,eAAe,MAAM,KAAK,WAAW,CAE3C,CACD,CAAE,EAEF,CAAE,SAAUD,GAAQ,OAAOA,GAAQ,SAAU,CAE5C,OAAQ,CAEP,KAAK,eAAiB,IAAIgC,EAAe,KAAK,KAAM,CAAE,UAAW,KAAK,SAAU,CAAC,EACjF,KAAK,KAAO,KAAK,eAAe,KAC3B,KAAK,WACT,KAAK,SAAW,OAElB,EAEA,SAAU,CAET,KAAK,eAAe,MAAM,KAAK,WAAW,CAE3C,CACD,CAAE,CAEH,EAEA,OAAO,UAAY1B,CAEpB,EEnSO,IAAM2B,EAAN,MAAMC,CAAkB,CAC9B,YAAYC,EAAI,CACfA,EAAG,kBAAoB,KAEnBA,EAAG,mBACNA,EAAG,GAAG,iBAAkBD,EAAkB,mBAAmB,EAE7DC,EAAG,GAAG,kBAAkBC,EAAQ,OAAO,GAAI,IAAIC,IAASH,EAAkB,cAAc,KAAK,GAAGG,CAAI,CAAC,EACrGF,EAAG,GAAG,kBAAkBC,EAAQ,QAAQ,GAAI,IAAIC,IAASH,EAAkB,eAAe,KAAK,GAAGG,CAAI,CAAC,EACvGF,EAAG,GAAG,kBAAkBC,EAAQ,SAAS,GAAI,IAAIC,IAASH,EAAkB,gBAAgB,KAAK,GAAGG,CAAI,CAAC,EACzGF,EAAG,GAAG,kBAAkBC,EAAQ,KAAK,GAAI,IAAIC,IAASH,EAAkB,YAAY,KAAK,GAAGG,CAAI,CAAC,IAEjGF,EAAG,SAAWD,EAAkB,SAEhCC,EAAG,GAAG,WAAWC,EAAQ,OAAO,GAAIF,EAAkB,aAAa,EACnEC,EAAG,GAAG,WAAWC,EAAQ,QAAQ,GAAIF,EAAkB,cAAc,EACrEC,EAAG,GAAG,WAAWC,EAAQ,SAAS,GAAIF,EAAkB,eAAe,EACvEC,EAAG,GAAG,WAAWC,EAAQ,KAAK,GAAIF,EAAkB,WAAW,EAGjE,CAEA,UAAY,IAAI,IAGhB,OAAO,iBAAmBI,EAE1B,aAAa,YAAYD,EAAM,CAE9B,IAAME,GAA6B,KAAK,KAAO,MAAM,kBAAkB,YAAY,iBAEnF,OAAO,IAAIA,EAA0B,KAAM,GAAGF,CAAI,CACnD,CAEA,OAAO,cAAcG,KAAOC,EAAU,EACpC,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAID,CAAE,GAAG,cAAc,GAAGC,CAAQ,CAElF,CAEA,OAAO,eAAeD,KAAOC,EAAU,EACrC,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAID,CAAE,GAAG,eAAe,GAAGC,CAAQ,CAEnF,CAEA,OAAO,gBAAgBD,KAAOC,EAAU,EACtC,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAID,CAAE,GAAG,gBAAgB,GAAGC,CAAQ,CAEpF,CAEA,OAAO,YAAYD,EAAIE,EAAc,EACnC,KAAK,KAAO,MAAM,kBAAkB,UAAU,IAAIF,CAAE,GAAG,MAAME,CAAY,CAE3E,CAGA,OAAO,oBAAoBP,EAAI,CAC9B,OAAO,OAAOA,EAAI,CACjB,SAAUD,EAAkB,QAC7B,CAAC,CAEF,CAED,EH3DA,IAAMS,EAAN,cAAmCC,CAAiB,CAEnD,OAAO,QAAU,CAEhB,CAAE,SAAUC,GAAQ,OAAOA,GAAQ,UAAY,OAAOA,EAAK,IAAM,YAAc,OAAOA,EAAK,MAAQ,WAAY,CAE9G,OAAQ,CAEP,KAAK,OAAS,KAAK,KAEd,KAAK,WACT,KAAK,SAAW,UAEb,KAAK,WAAa,WACrB,KAAK,SAAW,GAElB,EAEA,SAAU,CAET,KAAK,OAAO,GAAG,OAAQ,KAAK,WAAW,EAClC,KAAK,MACT,KAAK,OAAO,GAAG,MAAO,KAAK,IAAI,CAEjC,EAEA,eAAeC,EAAO,CACrB,OAAQ,KAAK,SAAWA,EAAQ,OAAO,KAAKA,EAAO,KAAK,QAAQ,GAAG,SAAS,QAAQ,CACrF,CACD,CAAE,EAEF,CAAE,OAAQD,GAAQ,OAAOA,GAAQ,UAAY,oBAAoB,KAAKA,CAAI,EAAG,CAE5E,MAAM,OAAQ,CAEb,IAAME,EAAW,KAAK,KAChBC,EAAOC,EAAK,SAASF,CAAQ,EAC7B,CAAE,KAAAG,EAAM,QAASC,CAAW,EAAI,MAAMC,EAAG,SAAS,KAAKL,CAAQ,EAE/DM,EAAW,CAChB,KAAAL,EACA,KAAMM,EAAK,QAAQL,EAAK,QAAQD,CAAI,EAAE,MAAM,CAAC,CAAC,EAC9C,KAAAE,EACA,WAAAC,CACD,EAEA,KAAK,OAASC,EAAG,iBAAiBL,CAAQ,EAE1C,KAAK,KAAOG,EACZ,KAAK,SAAW,SAEZ,KAAK,SACR,OAAO,OAAO,KAAK,SAAUG,CAAQ,EAErC,KAAK,SAAWA,CAElB,EAEA,SAAU,CAET,KAAK,OAAO,GAAG,OAAQ,KAAK,WAAW,CAExC,EAEA,eAAeP,EAAO,CACrB,OAAOA,EAAM,SAAS,QAAQ,CAC/B,CACD,CAAE,EAEF,GAAGF,EAAiB,OAErB,CAED,EAEMW,EAAN,cAAoCC,CAAkB,CAErD,OAAO,iBAAmBb,CAE3B",
6
- "names": ["Readable", "headers", "sizeLimit", "chunkSize", "callArgsSymbol", "progressInterval", "IncomingTransfer", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "callArgsSymbol", "#setup", "#methods", "#prevChunkAt", "#chunksQueue", "#isProcessing", "#progressInterval", "#lastProgress", "begin", "headers", "progressInterval", "chunk", "length", "ts", "#process", "chunkListener", "progressListener", "#complete", "end", "bySender", "errorMessage", "sendToSender", "error", "IncomingTransport", "_IncomingTransport", "ws", "options", "sizeLimit", "headers", "args", "add", "eventName", "listener", "kind", "IncomingTransfer", "id", "type", "size", "metadata", "restProps", "incomingTransport", "IncomingTransportTransfer", "restArgs", "TransferStream", "Readable", "writableStream", "resolve", "reject", "pipeTo", "stream", "streamMethod", "chunk", "promises", "NodeIncomingTransfer", "IncomingTransfer", "NodeIncomingTransport", "IncomingTransport", "fs", "path", "mime", "uid", "StringStreamer", "string", "options", "chunkSize", "#start", "#end", "listener", "#next", "chunk", "resolve", "OutgoingTransfer", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "callArgsSymbol", "#setup", "headers", "uid", "#methods", "#prevChunkAt", "#chunksQueue", "#isProcessing", "availableType", "test", "methods", "confirmResponse", "chunk", "#process", "chunkLength", "ts", "progress", "errorMessage", "StringStreamer", "OutgoingTransport", "_OutgoingTransport", "ws", "headers", "args", "OutgoingTransfer", "OutgoingTransportTransfer", "id", "restArgs", "errorMessage", "NodeOutgoingTransfer", "OutgoingTransfer", "data", "chunk", "fileName", "name", "path", "size", "modifiedAt", "fs", "metadata", "mime", "NodeOutgoingTransport", "OutgoingTransport"]
7
- }