socket-function 1.0.6 → 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 -3
- package/package.json +1 -1
- package/src/Zip.d.ts +3 -4
- package/src/Zip.ts +46 -43
- package/src/callManager.ts +1 -5
package/index.d.ts
CHANGED
|
@@ -529,7 +529,6 @@ declare module "socket-function/src/JSONLACKS/JSONLACKS.generated.js" {
|
|
|
529
529
|
}
|
|
530
530
|
|
|
531
531
|
declare module "socket-function/src/Zip" {
|
|
532
|
-
/// <reference path="../index.d.ts" />
|
|
533
532
|
/// <reference types="node" />
|
|
534
533
|
/// <reference types="node" />
|
|
535
534
|
import { MaybePromise } from "socket-function/src/types";
|
|
@@ -538,10 +537,10 @@ declare module "socket-function/src/Zip" {
|
|
|
538
537
|
static gzipSync(buffer: Buffer, level?: number): Buffer;
|
|
539
538
|
static gunzip(buffer: Buffer): MaybePromise<Buffer>;
|
|
540
539
|
static gunzipAsyncBase(buffer: Buffer): Promise<Buffer>;
|
|
541
|
-
static gunzipUntracked(buffer: Buffer): Promise<Buffer>;
|
|
542
540
|
static gunzipSync(buffer: Buffer): Buffer;
|
|
543
|
-
private static gunzipUntrackedSync;
|
|
544
541
|
static gunzipBatch(buffers: Buffer[]): Promise<Buffer[]>;
|
|
542
|
+
static gunzipUntracked(buffer: Buffer): MaybePromise<Buffer>;
|
|
543
|
+
private static gunzipUntrackedSync;
|
|
545
544
|
}
|
|
546
545
|
|
|
547
546
|
}
|
package/package.json
CHANGED
package/src/Zip.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
/// <reference path="../index.d.ts" />
|
|
2
1
|
/// <reference types="node" />
|
|
3
2
|
/// <reference types="node" />
|
|
4
|
-
import { MaybePromise } from "
|
|
3
|
+
import { MaybePromise } from "./types";
|
|
5
4
|
export declare class Zip {
|
|
6
5
|
static gzip(buffer: Buffer, level?: number): Promise<Buffer>;
|
|
7
6
|
static gzipSync(buffer: Buffer, level?: number): Buffer;
|
|
8
7
|
static gunzip(buffer: Buffer): MaybePromise<Buffer>;
|
|
9
8
|
static gunzipAsyncBase(buffer: Buffer): Promise<Buffer>;
|
|
10
|
-
static gunzipUntracked(buffer: Buffer): Promise<Buffer>;
|
|
11
9
|
static gunzipSync(buffer: Buffer): Buffer;
|
|
12
|
-
private static gunzipUntrackedSync;
|
|
13
10
|
static gunzipBatch(buffers: Buffer[]): Promise<Buffer[]>;
|
|
11
|
+
static gunzipUntracked(buffer: Buffer): MaybePromise<Buffer>;
|
|
12
|
+
private static gunzipUntrackedSync;
|
|
14
13
|
}
|
package/src/Zip.ts
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import { isNode } from "
|
|
2
|
-
import { measureFnc } from "
|
|
1
|
+
import { isNode } from "./misc";
|
|
2
|
+
import { measureFnc } from "./profiling/measure";
|
|
3
3
|
import zlib from "zlib";
|
|
4
4
|
import * as pako from "pako";
|
|
5
5
|
|
|
6
|
-
import { setFlag } from "
|
|
7
|
-
import { MaybePromise } from "
|
|
6
|
+
import { setFlag } from "../require/compileFlags";
|
|
7
|
+
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;
|