socket-function 1.1.0 → 1.1.2

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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket-function",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "dependencies": {
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 is slow, add a LZ4 version, which uses lz4-wasm-nodejs. This should be about 10X faster in both dcompression and decompression, only using 50% more space (which isn't great, but... if it is lagging the main thread it might be worth it).
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.deflate(buffer));
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.gunzipSync(buffer);
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 await new Promise<Buffer>((resolve, reject) => {
60
- zlib.gunzip(buffer, (err: any, result: Buffer) => {
61
- if (err) reject(err);
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.inflate(buffer));
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
 
@@ -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;
package/src/nodeCache.ts CHANGED
@@ -61,7 +61,7 @@ export function getNodeIdDomainMaybeUndefined(nodeId: string): string | undefine
61
61
  if (!location) {
62
62
  return undefined;
63
63
  }
64
- return new URL(location.address).hostname.split(".").slice(-2).join(".");
64
+ return new URL("https://" + location.address).hostname.split(".").slice(-2).join(".");
65
65
  }
66
66
 
67
67
  // NOTE: CallFactory turns into an actual CallFactory when registerNodeClient is called