@perspective-dev/client 4.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.
- package/LICENSE.md +193 -0
- package/README.md +3 -0
- package/dist/cdn/perspective-server.worker.js +2 -0
- package/dist/cdn/perspective-server.worker.js.map +7 -0
- package/dist/cdn/perspective.js +3 -0
- package/dist/cdn/perspective.js.map +7 -0
- package/dist/esm/perspective-server.worker.d.ts +1 -0
- package/dist/esm/perspective.browser.d.ts +14 -0
- package/dist/esm/perspective.inline.js +3 -0
- package/dist/esm/perspective.inline.js.map +7 -0
- package/dist/esm/perspective.js +3 -0
- package/dist/esm/perspective.js.map +7 -0
- package/dist/esm/perspective.node.d.ts +60 -0
- package/dist/esm/perspective.node.js +2431 -0
- package/dist/esm/perspective.node.js.map +7 -0
- package/dist/esm/ts-rs/Aggregate.d.ts +1 -0
- package/dist/esm/ts-rs/ColumnWindow.d.ts +4 -0
- package/dist/esm/ts-rs/DeleteOptions.d.ts +6 -0
- package/dist/esm/ts-rs/Expressions.d.ts +3 -0
- package/dist/esm/ts-rs/Filter.d.ts +2 -0
- package/dist/esm/ts-rs/FilterReducer.d.ts +1 -0
- package/dist/esm/ts-rs/FilterTerm.d.ts +2 -0
- package/dist/esm/ts-rs/OnUpdateMode.d.ts +9 -0
- package/dist/esm/ts-rs/OnUpdateOptions.d.ts +7 -0
- package/dist/esm/ts-rs/Scalar.d.ts +5 -0
- package/dist/esm/ts-rs/Sort.d.ts +2 -0
- package/dist/esm/ts-rs/SortDir.d.ts +1 -0
- package/dist/esm/ts-rs/SystemInfo.d.ts +40 -0
- package/dist/esm/ts-rs/TableInitOptions.d.ts +22 -0
- package/dist/esm/ts-rs/TableReadFormat.d.ts +7 -0
- package/dist/esm/ts-rs/UpdateOptions.d.ts +8 -0
- package/dist/esm/ts-rs/ViewConfigUpdate.d.ts +90 -0
- package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +4 -0
- package/dist/esm/ts-rs/ViewWindow.d.ts +23 -0
- package/dist/esm/wasm/browser.d.ts +21 -0
- package/dist/esm/wasm/decompress.d.ts +1 -0
- package/dist/esm/wasm/emscripten_api.d.ts +5 -0
- package/dist/esm/wasm/engine.d.ts +40 -0
- package/dist/esm/wasm/perspective-server.poly.d.ts +1 -0
- package/dist/esm/websocket.d.ts +4 -0
- package/dist/wasm/perspective-js.d.ts +712 -0
- package/dist/wasm/perspective-js.js +1934 -0
- package/dist/wasm/perspective-js.wasm +0 -0
- package/dist/wasm/perspective-js.wasm.d.ts +75 -0
- package/package.json +68 -0
- package/src/rust/client.rs +483 -0
- package/src/rust/lib.rs +70 -0
- package/src/rust/table.rs +364 -0
- package/src/rust/table_data.rs +159 -0
- package/src/rust/utils/browser.rs +39 -0
- package/src/rust/utils/console_logger.rs +236 -0
- package/src/rust/utils/errors.rs +288 -0
- package/src/rust/utils/futures.rs +174 -0
- package/src/rust/utils/json.rs +252 -0
- package/src/rust/utils/local_poll_loop.rs +63 -0
- package/src/rust/utils/mod.rs +32 -0
- package/src/rust/utils/serde.rs +46 -0
- package/src/rust/utils/trace_allocator.rs +98 -0
- package/src/rust/view.rs +355 -0
- package/src/ts/perspective-server.worker.ts +54 -0
- package/src/ts/perspective.browser.ts +132 -0
- package/src/ts/perspective.cdn.ts +22 -0
- package/src/ts/perspective.inline.ts +27 -0
- package/src/ts/perspective.node.ts +315 -0
- package/src/ts/ts-rs/Aggregate.ts +3 -0
- package/src/ts/ts-rs/ColumnWindow.ts +3 -0
- package/src/ts/ts-rs/DeleteOptions.ts +6 -0
- package/src/ts/ts-rs/Expressions.ts +3 -0
- package/src/ts/ts-rs/Filter.ts +4 -0
- package/src/ts/ts-rs/FilterReducer.ts +3 -0
- package/src/ts/ts-rs/FilterTerm.ts +4 -0
- package/src/ts/ts-rs/OnUpdateData.ts +8 -0
- package/src/ts/ts-rs/OnUpdateMode.ts +11 -0
- package/src/ts/ts-rs/OnUpdateOptions.ts +7 -0
- package/src/ts/ts-rs/Scalar.ts +7 -0
- package/src/ts/ts-rs/Sort.ts +4 -0
- package/src/ts/ts-rs/SortDir.ts +3 -0
- package/src/ts/ts-rs/SystemInfo.ts +41 -0
- package/src/ts/ts-rs/TableInitOptions.ts +21 -0
- package/src/ts/ts-rs/TableReadFormat.ts +9 -0
- package/src/ts/ts-rs/UpdateOptions.ts +7 -0
- package/src/ts/ts-rs/ViewConfigUpdate.ts +87 -0
- package/src/ts/ts-rs/ViewOnUpdateResp.ts +3 -0
- package/src/ts/ts-rs/ViewWindow.ts +17 -0
- package/src/ts/wasm/browser.ts +123 -0
- package/src/ts/wasm/decompress.ts +64 -0
- package/src/ts/wasm/emscripten_api.ts +63 -0
- package/src/ts/wasm/engine.ts +271 -0
- package/src/ts/wasm/perspective-server.poly.ts +244 -0
- package/src/ts/websocket.ts +95 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
import type * as perspective_server from "@perspective-dev/server/dist/wasm/perspective-server.js";
|
|
14
|
+
|
|
15
|
+
type PspPtr = bigint | number;
|
|
16
|
+
type EmscriptenServer = number;
|
|
17
|
+
|
|
18
|
+
var out = console.log.bind(console);
|
|
19
|
+
var err = console.error.bind(console);
|
|
20
|
+
|
|
21
|
+
var UTF8Decoder = new TextDecoder("utf8");
|
|
22
|
+
var printCharBuffers: Array<Array<number> | null> = [null, [], []];
|
|
23
|
+
|
|
24
|
+
function UTF8ArrayToString(
|
|
25
|
+
heapOrArray: Uint8Array | Array<number>,
|
|
26
|
+
idx = 0,
|
|
27
|
+
maxBytesToRead = NaN,
|
|
28
|
+
) {
|
|
29
|
+
var endIdx = idx + maxBytesToRead;
|
|
30
|
+
var endPtr = idx;
|
|
31
|
+
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
|
|
32
|
+
return UTF8Decoder.decode(
|
|
33
|
+
heapOrArray instanceof Uint8Array
|
|
34
|
+
? heapOrArray.subarray(idx, endPtr)
|
|
35
|
+
: new Uint8Array(heapOrArray.slice(idx, endPtr)),
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function printChar(stream: number, curr: number) {
|
|
40
|
+
var buffer: Array<number> = printCharBuffers[stream]!;
|
|
41
|
+
if (curr === 0 || curr === 10) {
|
|
42
|
+
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
|
|
43
|
+
buffer.length = 0;
|
|
44
|
+
} else {
|
|
45
|
+
buffer.push(curr);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default async function (obj: any) {
|
|
50
|
+
let psp_module: perspective_server.MainModule;
|
|
51
|
+
let is_memory64 = false;
|
|
52
|
+
let wasm_memory: WebAssembly.Memory;
|
|
53
|
+
const module = {
|
|
54
|
+
HaveOffsetConverter() {
|
|
55
|
+
console.error("HaveOffsetConverter");
|
|
56
|
+
},
|
|
57
|
+
__syscall_ftruncate64(...args: any[]) {
|
|
58
|
+
console.error("__syscall_frtuncate64", args);
|
|
59
|
+
},
|
|
60
|
+
__syscall_getdents64(...args: any[]) {
|
|
61
|
+
console.error("__syscall_frtuncate64", args);
|
|
62
|
+
},
|
|
63
|
+
__syscall_unlinkat(...args: any[]) {
|
|
64
|
+
console.error("__syscall_frtuncate64", args);
|
|
65
|
+
},
|
|
66
|
+
__throw_exception_with_stack_trace(ex: number) {
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
const e = new WebAssembly.Exception(
|
|
69
|
+
(psp_module as any).__cpp_exception,
|
|
70
|
+
[ex],
|
|
71
|
+
{
|
|
72
|
+
traceStack: true,
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// e.message = getExceptionMessage(e);
|
|
77
|
+
e.message = "Unexpected internal error";
|
|
78
|
+
throw e;
|
|
79
|
+
},
|
|
80
|
+
clock_time_get(
|
|
81
|
+
clk_id: number,
|
|
82
|
+
ignored_precision: bigint,
|
|
83
|
+
ptime: bigint | number,
|
|
84
|
+
) {
|
|
85
|
+
if (is_memory64) {
|
|
86
|
+
ptime = ptime as bigint;
|
|
87
|
+
ptime = Number(ptime);
|
|
88
|
+
if (
|
|
89
|
+
!(clk_id == 0 || clk_id == 1 || clk_id == 2 || clk_id == 3)
|
|
90
|
+
) {
|
|
91
|
+
return 28;
|
|
92
|
+
}
|
|
93
|
+
var now;
|
|
94
|
+
|
|
95
|
+
if (clk_id === 0) {
|
|
96
|
+
now = Date.now();
|
|
97
|
+
} else {
|
|
98
|
+
now = performance.now();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const nsec = Math.round(now * 1000 * 1000);
|
|
102
|
+
const HEAP64 = new BigInt64Array(wasm_memory.buffer);
|
|
103
|
+
HEAP64[ptime / 8] = BigInt(nsec);
|
|
104
|
+
return 0;
|
|
105
|
+
} else {
|
|
106
|
+
ptime = ptime as number;
|
|
107
|
+
ptime >>>= 0;
|
|
108
|
+
if (
|
|
109
|
+
!(clk_id == 0 || clk_id == 1 || clk_id == 2 || clk_id == 3)
|
|
110
|
+
) {
|
|
111
|
+
return 28;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var now;
|
|
115
|
+
if (clk_id === 0) {
|
|
116
|
+
now = Date.now();
|
|
117
|
+
} else {
|
|
118
|
+
now = performance.now();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var nsec = Math.round(now * 1e6);
|
|
122
|
+
const HEAP64 = new BigInt64Array(wasm_memory.buffer);
|
|
123
|
+
HEAP64[ptime >>> 3] = BigInt(nsec);
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
emscripten_asm_const_int(...args: any[]) {
|
|
128
|
+
return 0;
|
|
129
|
+
},
|
|
130
|
+
emscripten_notify_memory_growth(memoryIndex: bigint | number) {
|
|
131
|
+
if (is_memory64) {
|
|
132
|
+
memoryIndex = Number(memoryIndex as bigint);
|
|
133
|
+
} else {
|
|
134
|
+
memoryIndex = memoryIndex as number;
|
|
135
|
+
memoryIndex >>>= 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (memoryIndex != 0) {
|
|
139
|
+
console.error("abort");
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
environ_get(...args: any[]) {
|
|
143
|
+
return 0;
|
|
144
|
+
},
|
|
145
|
+
environ_sizes_get(...args: any[]) {
|
|
146
|
+
return 0;
|
|
147
|
+
},
|
|
148
|
+
fd_close(...args: any[]) {
|
|
149
|
+
console.error("fd_close", args);
|
|
150
|
+
return 0;
|
|
151
|
+
},
|
|
152
|
+
fd_read(...args: any[]) {
|
|
153
|
+
console.error("fd_read", args);
|
|
154
|
+
return 0;
|
|
155
|
+
},
|
|
156
|
+
fd_seek(...args: any[]) {
|
|
157
|
+
console.error("fs_seek", args);
|
|
158
|
+
return 0;
|
|
159
|
+
},
|
|
160
|
+
fd_write(
|
|
161
|
+
fd: number,
|
|
162
|
+
iov: number | bigint,
|
|
163
|
+
iovcnt: number | bigint,
|
|
164
|
+
pnum: number | bigint,
|
|
165
|
+
) {
|
|
166
|
+
const HEAPU8 = new Uint8Array(wasm_memory.buffer);
|
|
167
|
+
|
|
168
|
+
if (!is_memory64) {
|
|
169
|
+
iov = iov as number;
|
|
170
|
+
iovcnt = iovcnt as number;
|
|
171
|
+
pnum = pnum as number;
|
|
172
|
+
iov >>>= 0;
|
|
173
|
+
iovcnt >>>= 0;
|
|
174
|
+
pnum >>>= 0;
|
|
175
|
+
let num = 0;
|
|
176
|
+
const HEAPU32 = new Uint32Array(wasm_memory.buffer);
|
|
177
|
+
|
|
178
|
+
for (let i = 0; i < iovcnt; i++) {
|
|
179
|
+
let ptr = HEAPU32[(iov >>> 2) >>> 0];
|
|
180
|
+
let len = HEAPU32[((iov + 4) >>> 2) >>> 0];
|
|
181
|
+
iov += 8;
|
|
182
|
+
for (let j = 0; j < len; j++) {
|
|
183
|
+
printChar(fd, HEAPU8[(ptr + j) >>> 0]);
|
|
184
|
+
}
|
|
185
|
+
num += len;
|
|
186
|
+
}
|
|
187
|
+
HEAPU32[(pnum >>> 2) >>> 0] = num;
|
|
188
|
+
return 0;
|
|
189
|
+
} else {
|
|
190
|
+
iov = Number(iov as bigint);
|
|
191
|
+
iovcnt = Number(iovcnt as bigint);
|
|
192
|
+
pnum = Number(pnum as bigint);
|
|
193
|
+
let num = 0;
|
|
194
|
+
const HEAPU64 = new BigUint64Array(wasm_memory.buffer);
|
|
195
|
+
|
|
196
|
+
for (let i = 0; i < iovcnt; i++) {
|
|
197
|
+
let ptr = Number(HEAPU64[iov / 8]);
|
|
198
|
+
let len = Number(HEAPU64[(iov + 8) / 8]);
|
|
199
|
+
iov += 16;
|
|
200
|
+
for (let j = 0; j < len; j++) {
|
|
201
|
+
printChar(fd, HEAPU8[ptr + j]);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
num += len;
|
|
205
|
+
}
|
|
206
|
+
HEAPU64[pnum / 8] = BigInt(num);
|
|
207
|
+
return 0;
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
proc_exit(e: number) {
|
|
211
|
+
console.error("proc_exit", e);
|
|
212
|
+
return 0;
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const x = await obj.instantiateWasm(
|
|
217
|
+
{ env: module, wasi_snapshot_preview1: module },
|
|
218
|
+
(instance: WebAssembly.Instance) => {
|
|
219
|
+
psp_module =
|
|
220
|
+
instance.exports as any as perspective_server.MainModule;
|
|
221
|
+
|
|
222
|
+
// @ts-ignore
|
|
223
|
+
is_memory64 = !!psp_module.psp_is_memory64();
|
|
224
|
+
wasm_memory = instance.exports.memory as WebAssembly.Memory;
|
|
225
|
+
|
|
226
|
+
// @ts-ignore
|
|
227
|
+
psp_module._initialize();
|
|
228
|
+
},
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
const extensions: Record<string, any> = {};
|
|
232
|
+
for (const [name, func] of Object.entries(x)) {
|
|
233
|
+
extensions[`_${name}`] = func;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
...x,
|
|
238
|
+
...extensions,
|
|
239
|
+
get HEAPU8() {
|
|
240
|
+
// @ts-ignore
|
|
241
|
+
return new Uint8Array(wasm_memory.buffer);
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
import type * as perspective_client from "../../dist/wasm/perspective-js.js";
|
|
14
|
+
|
|
15
|
+
function invert_promise<T>(): [(t: T) => void, Promise<T>, (t: any) => void] {
|
|
16
|
+
let sender: ((t: T) => void) | undefined = undefined,
|
|
17
|
+
reject: ((t: any) => void) | undefined = undefined;
|
|
18
|
+
let receiver: Promise<T> = new Promise((x, u) => {
|
|
19
|
+
sender = x;
|
|
20
|
+
reject = u;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return [sender!, receiver, reject!];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function websocket(
|
|
27
|
+
WebSocket: typeof window.WebSocket,
|
|
28
|
+
Client: typeof perspective_client.Client,
|
|
29
|
+
url: string | URL,
|
|
30
|
+
options?: { maxPayload: number },
|
|
31
|
+
): Promise<perspective_client.Client> {
|
|
32
|
+
let client: perspective_client.Client, ws: WebSocket;
|
|
33
|
+
|
|
34
|
+
async function connect() {
|
|
35
|
+
if (
|
|
36
|
+
ws?.readyState === WebSocket.CONNECTING ||
|
|
37
|
+
ws?.readyState === WebSocket.OPEN
|
|
38
|
+
) {
|
|
39
|
+
console.warn(`Already connected ${ws.readyState}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let [sender, receiver, reject] = invert_promise();
|
|
44
|
+
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
ws = new WebSocket(url, options);
|
|
47
|
+
ws.onopen = sender;
|
|
48
|
+
ws.binaryType = "arraybuffer";
|
|
49
|
+
ws.onerror = (event) => {
|
|
50
|
+
// @ts-expect-error
|
|
51
|
+
const msg = event.message || "Generic Websocket Error";
|
|
52
|
+
client.handle_error(msg, connect);
|
|
53
|
+
reject(msg);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
ws.onclose = (event) => {
|
|
57
|
+
// https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1
|
|
58
|
+
const msg = `WebSocket closed ${event.code}`;
|
|
59
|
+
client.handle_error(msg, connect);
|
|
60
|
+
reject(msg);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
ws.onmessage = (event) => {
|
|
64
|
+
client.handle_response(event.data);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
await receiver;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function send_message(proto: Uint8Array) {
|
|
71
|
+
if (
|
|
72
|
+
ws.readyState === WebSocket.CLOSING ||
|
|
73
|
+
ws.readyState === WebSocket.CLOSED
|
|
74
|
+
) {
|
|
75
|
+
const msg = `WebSocket transport error (${ws.readyState})`;
|
|
76
|
+
client.handle_error(msg, connect);
|
|
77
|
+
throw new Error(msg);
|
|
78
|
+
} else if (ws.readyState === WebSocket.CONNECTING) {
|
|
79
|
+
const msg = `WebSocket message dropped (${ws.readyState})`;
|
|
80
|
+
throw new Error(msg);
|
|
81
|
+
} else {
|
|
82
|
+
const buffer = proto.slice().buffer;
|
|
83
|
+
ws.send(buffer);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function on_close() {
|
|
88
|
+
console.debug("Closing WebSocket");
|
|
89
|
+
ws.close();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
client = new Client(send_message, on_close);
|
|
93
|
+
await connect();
|
|
94
|
+
return client;
|
|
95
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowImportingTsExtensions": true,
|
|
4
|
+
"strict": true,
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"target": "ESNext",
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"emitDeclarationOnly": true,
|
|
9
|
+
"outDir": "./dist/esm",
|
|
10
|
+
"rootDir": ".",
|
|
11
|
+
"moduleResolution": "NodeNext",
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"resolveJsonModule": true
|
|
14
|
+
},
|
|
15
|
+
"include": [
|
|
16
|
+
"./src/ts/perspective.node.ts",
|
|
17
|
+
"./src/ts/perspective.cdn.ts",
|
|
18
|
+
"./test/js/*.ts"
|
|
19
|
+
]
|
|
20
|
+
}
|