socket-function 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +2 -2
- package/package.json +1 -1
- package/src/Zip.d.ts +2 -2
- package/src/Zip.ts +42 -39
- package/src/callManager.ts +1 -5
package/index.d.ts
CHANGED
|
@@ -537,10 +537,10 @@ declare module "socket-function/src/Zip" {
|
|
|
537
537
|
static gzipSync(buffer: Buffer, level?: number): Buffer;
|
|
538
538
|
static gunzip(buffer: Buffer): MaybePromise<Buffer>;
|
|
539
539
|
static gunzipAsyncBase(buffer: Buffer): Promise<Buffer>;
|
|
540
|
-
static gunzipUntracked(buffer: Buffer): Promise<Buffer>;
|
|
541
540
|
static gunzipSync(buffer: Buffer): Buffer;
|
|
542
|
-
private static gunzipUntrackedSync;
|
|
543
541
|
static gunzipBatch(buffers: Buffer[]): Promise<Buffer[]>;
|
|
542
|
+
static gunzipUntracked(buffer: Buffer): MaybePromise<Buffer>;
|
|
543
|
+
private static gunzipUntrackedSync;
|
|
544
544
|
}
|
|
545
545
|
|
|
546
546
|
}
|
package/package.json
CHANGED
package/src/Zip.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ export declare class Zip {
|
|
|
6
6
|
static gzipSync(buffer: Buffer, level?: number): Buffer;
|
|
7
7
|
static gunzip(buffer: Buffer): MaybePromise<Buffer>;
|
|
8
8
|
static gunzipAsyncBase(buffer: Buffer): Promise<Buffer>;
|
|
9
|
-
static gunzipUntracked(buffer: Buffer): Promise<Buffer>;
|
|
10
9
|
static gunzipSync(buffer: Buffer): Buffer;
|
|
11
|
-
private static gunzipUntrackedSync;
|
|
12
10
|
static gunzipBatch(buffers: Buffer[]): Promise<Buffer[]>;
|
|
11
|
+
static gunzipUntracked(buffer: Buffer): MaybePromise<Buffer>;
|
|
12
|
+
private static gunzipUntrackedSync;
|
|
13
13
|
}
|
package/src/Zip.ts
CHANGED
|
@@ -8,10 +8,15 @@ import { MaybePromise } from "./types";
|
|
|
8
8
|
setFlag(require, "pako", "allowclient", true);
|
|
9
9
|
|
|
10
10
|
const SYNC_THRESHOLD_BYTES = 100_000_000;
|
|
11
|
+
const ZIP_SYNC_THRESHOLD_BYTES = 10_000_000;
|
|
11
12
|
|
|
13
|
+
// IMPORTANT! If this ever profiles as being slow, we should switch to a wasm implementation of L4Z. For our highly repetitive data, it's almost as efficient in terms of size, and it should be significantly more efficient in terms of time.
|
|
12
14
|
export class Zip {
|
|
13
15
|
@measureFnc
|
|
14
16
|
public static async gzip(buffer: Buffer, level?: number): Promise<Buffer> {
|
|
17
|
+
if (buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
|
|
18
|
+
return this.gzipSync(buffer, level);
|
|
19
|
+
}
|
|
15
20
|
if (isNode()) {
|
|
16
21
|
return new Promise((resolve, reject) => {
|
|
17
22
|
zlib.gzip(buffer, { level }, (err: any, result: Buffer) => {
|
|
@@ -26,17 +31,46 @@ export class Zip {
|
|
|
26
31
|
}
|
|
27
32
|
@measureFnc
|
|
28
33
|
public static gzipSync(buffer: Buffer, level?: number): Buffer {
|
|
29
|
-
if (isNode()) {
|
|
34
|
+
if (isNode() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
|
|
30
35
|
return Buffer.from(zlib.gzipSync(buffer, { level }));
|
|
31
36
|
}
|
|
32
|
-
return Buffer.from(pako.
|
|
37
|
+
return Buffer.from(pako.gzip(buffer));
|
|
33
38
|
}
|
|
39
|
+
|
|
40
|
+
@measureFnc
|
|
34
41
|
public static gunzip(buffer: Buffer): MaybePromise<Buffer> {
|
|
42
|
+
return this.gunzipUntracked(buffer);
|
|
43
|
+
}
|
|
44
|
+
@measureFnc
|
|
45
|
+
public static async gunzipAsyncBase(buffer: Buffer): Promise<Buffer> {
|
|
46
|
+
return this.gunzipUntracked(buffer);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@measureFnc
|
|
50
|
+
public static gunzipSync(buffer: Buffer): Buffer {
|
|
51
|
+
return this.gunzipUntrackedSync(buffer);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@measureFnc
|
|
55
|
+
public static async gunzipBatch(buffers: Buffer[]): Promise<Buffer[]> {
|
|
56
|
+
let time = Date.now();
|
|
57
|
+
buffers = await Promise.all(buffers.map(x => {
|
|
58
|
+
return this.gunzipUntracked(x);
|
|
59
|
+
}));
|
|
60
|
+
time = Date.now() - time;
|
|
61
|
+
// let totalSize = buffers.reduce((acc, buffer) => acc + buffer.length, 0);
|
|
62
|
+
//console.log(`Gunzip ${formatNumber(totalSize)}B at ${formatNumber(totalSize / time * 1000)}B/s`);
|
|
63
|
+
return buffers;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
public static gunzipUntracked(buffer: Buffer): MaybePromise<Buffer> {
|
|
35
69
|
// Switch to the synchronous version if the buffer is small. This is a lot faster in Node.js and clientside.
|
|
36
70
|
// - On tests of random small amounts of data, this seems to be up to 7X faster (on node). However, on non-random data, on the actual data we're using, it seems to be almost 50 times faster. So... definitely worth it...
|
|
37
71
|
if (buffer.length < SYNC_THRESHOLD_BYTES) {
|
|
38
72
|
let time = Date.now();
|
|
39
|
-
let result = Zip.
|
|
73
|
+
let result = Zip.gunzipUntrackedSync(buffer);
|
|
40
74
|
let duration = Date.now() - time;
|
|
41
75
|
if (duration > 50) {
|
|
42
76
|
// Wait, so we don't lock up the main thread. And if we already wait it 50ms, then waiting for one frame is marginal, even client-side.
|
|
@@ -47,49 +81,18 @@ export class Zip {
|
|
|
47
81
|
}
|
|
48
82
|
return result;
|
|
49
83
|
}
|
|
50
|
-
return Zip.gunzipAsyncBase(buffer);
|
|
51
|
-
}
|
|
52
|
-
@measureFnc
|
|
53
|
-
public static async gunzipAsyncBase(buffer: Buffer): Promise<Buffer> {
|
|
54
|
-
return Zip.gunzipUntracked(buffer);
|
|
55
|
-
}
|
|
56
|
-
// A base function, so we can avoid instrumentation for batch calls
|
|
57
|
-
public static async gunzipUntracked(buffer: Buffer): Promise<Buffer> {
|
|
58
84
|
if (isNode()) {
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
else resolve(result);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
85
|
+
return doStream(new DecompressionStream("gzip"), buffer);
|
|
86
|
+
} else {
|
|
87
|
+
return Zip.gunzipUntrackedSync(buffer);
|
|
65
88
|
}
|
|
66
|
-
return await doStream(new DecompressionStream("gzip"), buffer);
|
|
67
89
|
}
|
|
68
90
|
|
|
69
|
-
@measureFnc
|
|
70
|
-
public static gunzipSync(buffer: Buffer): Buffer {
|
|
71
|
-
return this.gunzipUntrackedSync(buffer);
|
|
72
|
-
}
|
|
73
91
|
private static gunzipUntrackedSync(buffer: Buffer): Buffer {
|
|
74
|
-
if (isNode()) {
|
|
92
|
+
if (isNode() && buffer.length < ZIP_SYNC_THRESHOLD_BYTES) {
|
|
75
93
|
return Buffer.from(zlib.gunzipSync(buffer));
|
|
76
94
|
}
|
|
77
|
-
return Buffer.from(pako.
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
@measureFnc
|
|
81
|
-
public static async gunzipBatch(buffers: Buffer[]): Promise<Buffer[]> {
|
|
82
|
-
let time = Date.now();
|
|
83
|
-
buffers = await Promise.all(buffers.map(x => {
|
|
84
|
-
if (x.length < SYNC_THRESHOLD_BYTES) {
|
|
85
|
-
return this.gunzipUntrackedSync(x);
|
|
86
|
-
}
|
|
87
|
-
return this.gunzipUntracked(x);
|
|
88
|
-
}));
|
|
89
|
-
time = Date.now() - time;
|
|
90
|
-
let totalSize = buffers.reduce((acc, buffer) => acc + buffer.length, 0);
|
|
91
|
-
//console.log(`Gunzip ${formatNumber(totalSize)}B at ${formatNumber(totalSize / time * 1000)}B/s`);
|
|
92
|
-
return buffers;
|
|
95
|
+
return Buffer.from(pako.ungzip(buffer));
|
|
93
96
|
}
|
|
94
97
|
}
|
|
95
98
|
|
package/src/callManager.ts
CHANGED
|
@@ -87,12 +87,8 @@ export function registerClass(classGuid: string, controller: SocketExposedInterf
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
if (!config?.noFunctionMeasure) {
|
|
90
|
-
let keys = new Set([
|
|
91
|
-
...Object.keys(controller),
|
|
92
|
-
...Object.getOwnPropertyNames(controller.__proto__ || {}),
|
|
93
|
-
]);
|
|
94
90
|
let niceClassName = controller.constructor.name || classGuid;
|
|
95
|
-
for (let functionName of keys) {
|
|
91
|
+
for (let functionName of Object.keys(shape)) {
|
|
96
92
|
if (functionName === "constructor") continue;
|
|
97
93
|
let fnc = controller[functionName];
|
|
98
94
|
if (typeof fnc !== "function") continue;
|