@seriousme/opifex 2.1.0 → 2.3.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/README.md +7 -6
- package/bin/mqtt.ts +1 -1
- package/client/client.ts +58 -7
- package/client/context.ts +2 -2
- package/client/deps.ts +3 -3
- package/client/mod.ts +2 -2
- package/connNext/connNext.ts +44 -0
- package/deno/README.md +1 -1
- package/deno/denoConnToNext.ts +104 -0
- package/deno/mod.ts +7 -0
- package/deno/tcpClient.ts +8 -24
- package/deno/tcpServer.test.ts +14 -103
- package/deno/tcpServer.ts +14 -6
- package/deno/tlsServer.test.ts +14 -58
- package/deno/tlsServer.ts +14 -6
- package/deno/wsServer.test.ts +15 -61
- package/deno/wsServer.ts +77 -35
- package/dev_utils/asyncStreamPair.ts +114 -0
- package/dev_utils/asyncStreamToNext.ts +171 -0
- package/dev_utils/connNextPair.test.ts +179 -0
- package/dev_utils/mockConn.ts +115 -29
- package/dev_utils/mockServer.ts +3 -4
- package/dev_utils/mod.ts +1 -2
- package/dev_utils/testClient.ts +64 -0
- package/dev_utils/webStreamToNext.ts +187 -0
- package/dist/bin/mqtt.js +1 -1
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/client.d.ts +21 -3
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +43 -5
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +2 -2
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/deps.d.ts +1 -1
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/mod.d.ts +1 -1
- package/dist/client/mod.d.ts.map +1 -1
- package/dist/connNext/connNext.d.ts +43 -0
- package/dist/connNext/connNext.d.ts.map +1 -0
- package/dist/connNext/connNext.js +2 -0
- package/dist/connNext/connNext.js.map +1 -0
- package/dist/examples/authHandler.test.js +2 -2
- package/dist/examples/authHandler.test.js.map +1 -1
- package/dist/examples/mqtt+mqtts.test.d.ts +2 -0
- package/dist/examples/mqtt+mqtts.test.d.ts.map +1 -0
- package/dist/examples/mqtt+mqtts.test.js +104 -0
- package/dist/examples/mqtt+mqtts.test.js.map +1 -0
- package/dist/examples/mqtt.test.js +2 -2
- package/dist/examples/mqtt.test.js.map +1 -1
- package/dist/examples/mqtts.test.js +2 -2
- package/dist/examples/mqtts.test.js.map +1 -1
- package/dist/mqttConn/mqttConn.d.ts +5 -6
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +2 -3
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/mqttPacket/protocolLevels.d.ts +2 -0
- package/dist/mqttPacket/protocolLevels.d.ts.map +1 -1
- package/dist/node/nodeSocketToNext.d.ts +20 -0
- package/dist/node/nodeSocketToNext.d.ts.map +1 -0
- package/dist/node/nodeSocketToNext.js +161 -0
- package/dist/node/nodeSocketToNext.js.map +1 -0
- package/dist/node/tcpClient.d.ts +4 -6
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +6 -21
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts +8 -4
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +14 -6
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +7 -3
- package/dist/node/tlsServer.d.ts.map +1 -1
- package/dist/node/tlsServer.js +13 -5
- package/dist/node/tlsServer.js.map +1 -1
- package/dist/server/context.d.ts +5 -5
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +4 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +1 -1
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/mod.d.ts +1 -1
- package/dist/server/mod.d.ts.map +1 -1
- package/dist/server/server.d.ts +3 -3
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +3 -3
- package/dist/utils/utils.d.ts +1 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +3 -2
- package/dist/utils/utils.js.map +1 -1
- package/dist/web/webSocketToNext.d.ts +3 -0
- package/dist/web/webSocketToNext.d.ts.map +1 -0
- package/dist/web/webSocketToNext.js +160 -0
- package/dist/web/webSocketToNext.js.map +1 -0
- package/dist/web/wsClient.d.ts +8 -3
- package/dist/web/wsClient.d.ts.map +1 -1
- package/dist/web/wsClient.js +20 -6
- package/dist/web/wsClient.js.map +1 -1
- package/dist/web/wsClient.test.js +15 -0
- package/dist/web/wsClient.test.js.map +1 -1
- package/examples/README.md +21 -0
- package/examples/authHandler.test.ts +2 -2
- package/examples/mqtt+mqtts.test.ts +122 -0
- package/examples/mqtt.test.ts +2 -2
- package/examples/mqtts.test.ts +2 -2
- package/examples/webSocket.test.ts +10 -64
- package/examples/webSocketServer.ts +98 -0
- package/mqttConn/mqttConn.test.ts +6 -6
- package/mqttConn/mqttConn.ts +8 -9
- package/mqttPacket/protocolLevels.ts +2 -0
- package/node/README.md +1 -1
- package/node/mod.ts +7 -0
- package/node/{socket-node-stream.ts → nodeSocketToNext.ts} +78 -65
- package/node/tcpClient.ts +13 -27
- package/node/tcpServer.test.ts +12 -58
- package/node/tcpServer.ts +18 -8
- package/node/tlsServer.test.ts +11 -58
- package/node/tlsServer.ts +17 -7
- package/package.json +8 -2
- package/server/context.ts +9 -6
- package/server/deps.ts +1 -1
- package/server/mod.ts +1 -1
- package/server/server.ts +6 -6
- package/utils/utils.ts +3 -2
- package/web/webSocketToNext.ts +183 -0
- package/web/wsClient.test.ts +22 -0
- package/web/wsClient.ts +22 -9
- package/dist/node/wrapNodeSocket.d.ts +0 -12
- package/dist/node/wrapNodeSocket.d.ts.map +0 -1
- package/dist/node/wrapNodeSocket.js +0 -36
- package/dist/node/wrapNodeSocket.js.map +0 -1
- package/dist/socket/socket.d.ts +0 -40
- package/dist/socket/socket.d.ts.map +0 -1
- package/dist/socket/socket.js +0 -94
- package/dist/socket/socket.js.map +0 -1
- package/dist/web/webSocketStream.d.ts +0 -29
- package/dist/web/webSocketStream.d.ts.map +0 -1
- package/dist/web/webSocketStream.js +0 -69
- package/dist/web/webSocketStream.js.map +0 -1
- package/dist/web/wrapWebSocket.d.ts +0 -12
- package/dist/web/wrapWebSocket.d.ts.map +0 -1
- package/dist/web/wrapWebSocket.js +0 -41
- package/dist/web/wrapWebSocket.js.map +0 -1
- package/node/socket-node-stream.test.ts +0 -322
- package/node/wrapNodeSocket.ts +0 -44
- package/socket/socket.test.ts +0 -91
- package/socket/socket.ts +0 -124
- package/web/webSocketStream.ts +0 -97
- package/web/wrapWebSocket.ts +0 -52
package/web/wsClient.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* this is a WebSockets specific client
|
|
3
3
|
* it extends the platform agnostic Client class
|
|
4
4
|
* @module
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import { Client } from "../client/client.ts";
|
|
8
8
|
import { logger } from "../client/deps.ts";
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
9
|
+
import type { ConnNext, NetAddr } from "../client/deps.ts";
|
|
10
|
+
import { webSocketToNext } from "./webSocketToNext.ts";
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* WsClient extends the Client class to provide WebSocket based clients
|
|
@@ -15,15 +15,28 @@ import { wrapWebSocket } from "./wrapWebSocket.ts";
|
|
|
15
15
|
* see the /examples folder for an example
|
|
16
16
|
*/
|
|
17
17
|
export class WsClient extends Client {
|
|
18
|
-
/** create a websocket and wrap it in a
|
|
19
|
-
private async establishSocket(url: string): Promise<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
/** create a websocket and wrap it in a ConnNext */
|
|
19
|
+
private async establishSocket(url: string): Promise<ConnNext> {
|
|
20
|
+
try {
|
|
21
|
+
const urlObj = new URL(url);
|
|
22
|
+
const remoteAddr: NetAddr = {
|
|
23
|
+
transport: "tcp",
|
|
24
|
+
hostname: urlObj.hostname,
|
|
25
|
+
port: Number(urlObj.port || 0),
|
|
26
|
+
};
|
|
27
|
+
const ws = new WebSocket(url);
|
|
28
|
+
const connNext = await webSocketToNext(ws, remoteAddr);
|
|
29
|
+
return connNext;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
const message = error instanceof ErrorEvent
|
|
32
|
+
? ` because of ${error.message}`
|
|
33
|
+
: "";
|
|
34
|
+
throw new Error(`Failed to connect to WebSocket at ${url}${message}`);
|
|
35
|
+
}
|
|
23
36
|
}
|
|
24
37
|
|
|
25
38
|
/** createConn provides support for both "ws:" and "wss:" URLs */
|
|
26
|
-
protected override createConn(): Promise<
|
|
39
|
+
protected override createConn(): Promise<ConnNext> {
|
|
27
40
|
const { protocol, hostname, port: portStr, pathname } = this.connectUrl;
|
|
28
41
|
const port = portStr ? Number(portStr) : (protocol === "wss:" ? 443 : 80);
|
|
29
42
|
const path = pathname || "/mqtt";
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping Node.js sockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
import type { Socket } from "node:net";
|
|
5
|
-
import type { SockConn } from "../socket/socket.ts";
|
|
6
|
-
/**
|
|
7
|
-
* Wraps a Node.js socket into a standard web streams-based socket connection
|
|
8
|
-
* @param socket - The Node.js socket to wrap
|
|
9
|
-
* @returns A socket connection object with readable/writable streams and close method
|
|
10
|
-
*/
|
|
11
|
-
export declare function wrapNodeSocket(socket: Socket): SockConn;
|
|
12
|
-
//# sourceMappingURL=wrapNodeSocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapNodeSocket.d.ts","sourceRoot":"","sources":["../../node/wrapNodeSocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAc7D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAmBvD"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Readable, Writable } from "node:stream";
|
|
2
|
-
/**
|
|
3
|
-
* Closes a Node.js socket if it is not already closed
|
|
4
|
-
* @param sock - The Node.js socket to close
|
|
5
|
-
*/
|
|
6
|
-
function closer(sock) {
|
|
7
|
-
// deno-coverage-ignore-start
|
|
8
|
-
if (!sock.closed) {
|
|
9
|
-
sock.end();
|
|
10
|
-
}
|
|
11
|
-
// deno-coverage-ignore-stop
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Wraps a Node.js socket into a standard web streams-based socket connection
|
|
15
|
-
* @param socket - The Node.js socket to wrap
|
|
16
|
-
* @returns A socket connection object with readable/writable streams and close method
|
|
17
|
-
*/
|
|
18
|
-
export function wrapNodeSocket(socket) {
|
|
19
|
-
const readable = Readable.toWeb(socket);
|
|
20
|
-
const writable = Writable.toWeb(socket);
|
|
21
|
-
// deno-coverage-ignore-start
|
|
22
|
-
const remoteAddr = {
|
|
23
|
-
hostname: socket.remoteAddress || "",
|
|
24
|
-
port: socket.remotePort || 0,
|
|
25
|
-
transport: "tcp",
|
|
26
|
-
};
|
|
27
|
-
// deno-coverage-ignore-stop
|
|
28
|
-
const conn = {
|
|
29
|
-
readable: readable,
|
|
30
|
-
writable: writable,
|
|
31
|
-
close: () => closer(socket),
|
|
32
|
-
remoteAddr,
|
|
33
|
-
};
|
|
34
|
-
return conn;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=wrapNodeSocket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapNodeSocket.js","sourceRoot":"","sources":["../../node/wrapNodeSocket.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGjD;;;GAGG;AACH,SAAS,MAAM,CAAC,IAAY;IAC1B,6BAA6B;IAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IACD,4BAA4B;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAExC,6BAA6B;IAC7B,MAAM,UAAU,GAAY;QAC1B,QAAQ,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;QACpC,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;QAC5B,SAAS,EAAE,KAAK;KACjB,CAAC;IACF,4BAA4B;IAE5B,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,QAAsC;QAChD,QAAQ,EAAE,QAAsC;QAChD,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3B,UAAU;KACX,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/socket/socket.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/** Net adresses */
|
|
2
|
-
export type NetAddr = {
|
|
3
|
-
transport: "tcp" | "udp";
|
|
4
|
-
hostname: string;
|
|
5
|
-
port: number;
|
|
6
|
-
};
|
|
7
|
-
/** Unix adresses */
|
|
8
|
-
export type UnixAddr = {
|
|
9
|
-
transport: "unix" | "unixpacket";
|
|
10
|
-
path: string;
|
|
11
|
-
};
|
|
12
|
-
/** vSock adresses */
|
|
13
|
-
export type VsockAddr = {
|
|
14
|
-
transport: "vsock";
|
|
15
|
-
cid: number;
|
|
16
|
-
port: number;
|
|
17
|
-
};
|
|
18
|
-
/** Socket adresses */
|
|
19
|
-
export type SockAddr = NetAddr | UnixAddr | VsockAddr;
|
|
20
|
-
/** Socket connection descriptor. */
|
|
21
|
-
export type SockConn = {
|
|
22
|
-
readable: ReadableStream<Uint8Array>;
|
|
23
|
-
writable: WritableStream<Uint8Array>;
|
|
24
|
-
close: () => void;
|
|
25
|
-
localAddr?: SockAddr;
|
|
26
|
-
remoteAddr?: SockAddr;
|
|
27
|
-
};
|
|
28
|
-
export declare class Conn {
|
|
29
|
-
reader: ReadableStreamDefaultReader<Uint8Array>;
|
|
30
|
-
writer: WritableStreamDefaultWriter<Uint8Array>;
|
|
31
|
-
closed: boolean;
|
|
32
|
-
remoteAddr: SockAddr | undefined;
|
|
33
|
-
closer: () => void;
|
|
34
|
-
private leftover;
|
|
35
|
-
constructor(sockConn: SockConn);
|
|
36
|
-
read(length: number): Promise<Uint8Array | null>;
|
|
37
|
-
write(data: Uint8Array): Promise<number>;
|
|
38
|
-
close(): void;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../socket/socket.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,oBAAoB;AACpB,MAAM,MAAM,QAAQ,GAAG;IAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1E,qBAAqB;AACrB,MAAM,MAAM,SAAS,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1E,sBAAsB;AACtB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AACtD,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,UAAU,CAAC,EAAE,QAAQ,CAAC;CACvB,CAAC;AAEF,qBAAa,IAAI;IACf,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB,OAAO,CAAC,QAAQ,CAAiC;IAEjD,YAAY,QAAQ,EAAE,QAAQ,EAQ7B;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6CrD;IAEK,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7C;IAED,KAAK,SAsBJ;CACF"}
|
package/dist/socket/socket.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
export class Conn {
|
|
2
|
-
reader;
|
|
3
|
-
writer;
|
|
4
|
-
closed;
|
|
5
|
-
remoteAddr;
|
|
6
|
-
closer;
|
|
7
|
-
leftover = new Uint8Array(0);
|
|
8
|
-
constructor(sockConn) {
|
|
9
|
-
this.closed = false;
|
|
10
|
-
this.reader = sockConn.readable.getReader();
|
|
11
|
-
this.writer = sockConn.writable.getWriter();
|
|
12
|
-
this.closer = sockConn.close.bind(sockConn);
|
|
13
|
-
this.reader.closed.catch(() => { });
|
|
14
|
-
this.writer.closed.catch(() => { });
|
|
15
|
-
this.remoteAddr = sockConn.remoteAddr;
|
|
16
|
-
}
|
|
17
|
-
async read(length) {
|
|
18
|
-
if (this.closed || length < 0) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
if (length === 0) {
|
|
22
|
-
return new Uint8Array(0);
|
|
23
|
-
}
|
|
24
|
-
const result = new Uint8Array(length);
|
|
25
|
-
let bytesAccumulated = 0;
|
|
26
|
-
// Do we have data from the previous read()
|
|
27
|
-
if (this.leftover.length > 0) {
|
|
28
|
-
const take = Math.min(this.leftover.length, length);
|
|
29
|
-
result.set(this.leftover.subarray(0, take), bytesAccumulated);
|
|
30
|
-
bytesAccumulated += take;
|
|
31
|
-
this.leftover = this.leftover.subarray(take);
|
|
32
|
-
}
|
|
33
|
-
// Keep readin until we have enough data
|
|
34
|
-
while (bytesAccumulated < length) {
|
|
35
|
-
const { value, done } = await this.reader.read();
|
|
36
|
-
if (value) {
|
|
37
|
-
const needed = length - bytesAccumulated;
|
|
38
|
-
if (value.length <= needed) {
|
|
39
|
-
// We need the whole chunk
|
|
40
|
-
result.set(value, bytesAccumulated);
|
|
41
|
-
bytesAccumulated += value.length;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
// Chunk is bigger than what we need
|
|
45
|
-
result.set(value.subarray(0, needed), bytesAccumulated);
|
|
46
|
-
bytesAccumulated += needed;
|
|
47
|
-
// Save the rest for the next read() call
|
|
48
|
-
this.leftover = value.subarray(needed);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (done) {
|
|
52
|
-
// if the stream closed and not enough data was returned, return null
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
async write(data) {
|
|
59
|
-
if (this.closed) {
|
|
60
|
-
return Promise.reject(new Error("Connection closed"));
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
await this.writer.write(data);
|
|
64
|
-
return data.length;
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
this.closed = true;
|
|
68
|
-
throw err;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
close() {
|
|
72
|
-
if (!this.closed) {
|
|
73
|
-
this.closed = true;
|
|
74
|
-
// deno-coverage-ignore-start
|
|
75
|
-
void this.writer.close().catch(() => {
|
|
76
|
-
// ignore duplicate/late close attempts; the stream may already be closed
|
|
77
|
-
});
|
|
78
|
-
// deno-coverage-ignore-stop
|
|
79
|
-
try {
|
|
80
|
-
void this.reader.cancel().catch(() => {
|
|
81
|
-
// ignore duplicate/late cancel attempts; the stream may already be closed
|
|
82
|
-
});
|
|
83
|
-
this.reader?.releaseLock();
|
|
84
|
-
// deno-coverage-ignore
|
|
85
|
-
}
|
|
86
|
-
catch (_err) { /* swallow */ }
|
|
87
|
-
try {
|
|
88
|
-
this.closer();
|
|
89
|
-
}
|
|
90
|
-
catch (_err) { /* swallow */ }
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=socket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../socket/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping standard WebSockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
export interface WebSocketConnection<T extends Uint8Array | string = Uint8Array | string> {
|
|
5
|
-
readable: ReadableStream<T>;
|
|
6
|
-
writable: WritableStream<T>;
|
|
7
|
-
protocol: string;
|
|
8
|
-
extensions: string;
|
|
9
|
-
}
|
|
10
|
-
export interface WebSocketCloseInfo {
|
|
11
|
-
closeCode?: number;
|
|
12
|
-
reason?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface WebSocketStreamOptions {
|
|
15
|
-
protocols?: string[];
|
|
16
|
-
signal?: AbortSignal;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) with [Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API)
|
|
20
|
-
*
|
|
21
|
-
* @see https://web.dev/websocketstream/
|
|
22
|
-
*/
|
|
23
|
-
export declare class WebSocketStream<T extends Uint8Array | string = Uint8Array | string> {
|
|
24
|
-
readonly opened: Promise<WebSocketConnection<T>>;
|
|
25
|
-
readonly closed: Promise<WebSocketCloseInfo>;
|
|
26
|
-
readonly close: (closeInfo?: WebSocketCloseInfo) => void;
|
|
27
|
-
constructor(ws: WebSocket, options?: WebSocketStreamOptions);
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=webSocketStream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketStream.d.ts","sourceRoot":"","sources":["../../web/webSocketStream.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM;IAEnD,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,eAAe,CAC1B,CAAC,SAAS,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM;IAEnD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE7C,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEzD,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,sBAA2B,EA0D9D;CACF"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping standard WebSockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) with [Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API)
|
|
6
|
-
*
|
|
7
|
-
* @see https://web.dev/websocketstream/
|
|
8
|
-
*/
|
|
9
|
-
export class WebSocketStream {
|
|
10
|
-
opened;
|
|
11
|
-
closed;
|
|
12
|
-
close;
|
|
13
|
-
constructor(ws, options = {}) {
|
|
14
|
-
if (options.signal?.aborted) {
|
|
15
|
-
throw new DOMException("This operation was aborted", "AbortError");
|
|
16
|
-
}
|
|
17
|
-
const closeWithInfo = ({ closeCode: code, reason } = {}) => ws.close(code, reason);
|
|
18
|
-
this.opened = new Promise((resolve, reject) => {
|
|
19
|
-
ws.onopen = () => {
|
|
20
|
-
resolve({
|
|
21
|
-
readable: new ReadableStream({
|
|
22
|
-
start(controller) {
|
|
23
|
-
ws.onmessage = ({ data }) => {
|
|
24
|
-
if (data instanceof ArrayBuffer) {
|
|
25
|
-
controller.enqueue(new Uint8Array(data));
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
controller.enqueue(data);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
ws.onerror = (e) => controller.error(e);
|
|
32
|
-
},
|
|
33
|
-
cancel: closeWithInfo,
|
|
34
|
-
}),
|
|
35
|
-
writable: new WritableStream({
|
|
36
|
-
write(chunk) {
|
|
37
|
-
if (chunk instanceof Uint8Array) {
|
|
38
|
-
ws.send(chunk.buffer);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
ws.send(chunk);
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
abort() {
|
|
45
|
-
ws.close();
|
|
46
|
-
},
|
|
47
|
-
close: closeWithInfo,
|
|
48
|
-
}),
|
|
49
|
-
protocol: ws.protocol,
|
|
50
|
-
extensions: ws.extensions,
|
|
51
|
-
});
|
|
52
|
-
ws.removeEventListener("error", reject);
|
|
53
|
-
};
|
|
54
|
-
ws.addEventListener("error", reject);
|
|
55
|
-
});
|
|
56
|
-
this.closed = new Promise((resolve, reject) => {
|
|
57
|
-
ws.onclose = ({ code, reason }) => {
|
|
58
|
-
resolve({ closeCode: code, reason });
|
|
59
|
-
ws.removeEventListener("error", reject);
|
|
60
|
-
};
|
|
61
|
-
ws.addEventListener("error", reject);
|
|
62
|
-
});
|
|
63
|
-
if (options.signal) {
|
|
64
|
-
options.signal.onabort = () => ws.close();
|
|
65
|
-
}
|
|
66
|
-
this.close = closeWithInfo;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=webSocketStream.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketStream.js","sourceRoot":"","sources":["../../web/webSocketStream.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAGjB,MAAM,CAAkC;IAExC,MAAM,CAA8B;IAEpC,KAAK,CAA2C;IAEzD,YAAY,EAAa,EAAE,OAAO,GAA2B,EAAE;QAC7D,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,aAAa,GAAG,CACpB,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAuB,EAAE,EACpD,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE5B,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;gBACf,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,cAAc,CAAI;wBAC9B,KAAK,CAAC,UAAU;4BACd,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gCAC1B,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;oCAChC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAM,CAAC,CAAC;gCAChD,CAAC;qCAAM,CAAC;oCACN,UAAU,CAAC,OAAO,CAAC,IAAS,CAAC,CAAC;gCAChC,CAAC;4BACH,CAAC,CAAC;4BACF,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC1C,CAAC;wBACD,MAAM,EAAE,aAAa;qBACtB,CAAC;oBACF,QAAQ,EAAE,IAAI,cAAc,CAAI;wBAC9B,KAAK,CAAC,KAAK;4BACT,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;gCAChC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;4BACvC,CAAC;iCAAM,CAAC;gCACN,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACjB,CAAC;wBACH,CAAC;wBACD,KAAK;4BACH,EAAE,CAAC,KAAK,EAAE,CAAC;wBACb,CAAC;wBACD,KAAK,EAAE,aAAa;qBACrB,CAAC;oBACF,QAAQ,EAAE,EAAE,CAAC,QAAQ;oBACrB,UAAU,EAAE,EAAE,CAAC,UAAU;iBAC1B,CAAC,CAAC;gBACH,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChE,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;gBAChC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACrC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { SockConn } from "../socket/socket.ts";
|
|
2
|
-
export type HostnamePort = {
|
|
3
|
-
hostname?: string;
|
|
4
|
-
port?: string | number;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Wraps a WebSocketStream socket into a standard web streams-based socket connection
|
|
8
|
-
* @param ws - The WebSocket to wrap
|
|
9
|
-
* @returns A SockConn object
|
|
10
|
-
*/
|
|
11
|
-
export declare function wrapWebSocket(ws: WebSocket, remoteAddr?: HostnamePort): Promise<SockConn>;
|
|
12
|
-
//# sourceMappingURL=wrapWebSocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapWebSocket.d.ts","sourceRoot":"","sources":["../../web/wrapWebSocket.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAAC;AAYF;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,SAAS,EACb,UAAU,CAAC,EAAE,YAAY,GACxB,OAAO,CAAC,QAAQ,CAAC,CAqBnB"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping WebSocketStream sockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
import { WebSocketStream } from "./webSocketStream.js";
|
|
5
|
-
import { logger } from "../utils/logger.js";
|
|
6
|
-
/**
|
|
7
|
-
* Closes a WebSocketStream socket if it is not already closed
|
|
8
|
-
* @param sock - The WebSocketStream socket to close
|
|
9
|
-
*/
|
|
10
|
-
async function closer(stream) {
|
|
11
|
-
if (!await stream.closed) {
|
|
12
|
-
stream.close();
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Wraps a WebSocketStream socket into a standard web streams-based socket connection
|
|
17
|
-
* @param ws - The WebSocket to wrap
|
|
18
|
-
* @returns A SockConn object
|
|
19
|
-
*/
|
|
20
|
-
export async function wrapWebSocket(ws, remoteAddr) {
|
|
21
|
-
ws.binaryType = "arraybuffer";
|
|
22
|
-
const wsstream = new WebSocketStream(ws);
|
|
23
|
-
logger.debug("created wsstream");
|
|
24
|
-
const stream = await wsstream.opened;
|
|
25
|
-
logger.debug("wsstream is opened");
|
|
26
|
-
const readable = stream.readable;
|
|
27
|
-
const writable = stream.writable;
|
|
28
|
-
const { hostname = "localhost", port = 0 } = remoteAddr || {};
|
|
29
|
-
const conn = {
|
|
30
|
-
readable: readable,
|
|
31
|
-
writable: writable,
|
|
32
|
-
close: () => closer(wsstream),
|
|
33
|
-
remoteAddr: {
|
|
34
|
-
hostname,
|
|
35
|
-
port: Number(port),
|
|
36
|
-
transport: "tcp",
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
return conn;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=wrapWebSocket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrapWebSocket.js","sourceRoot":"","sources":["../../web/wrapWebSocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C;;;GAGG;AACH,KAAK,UAAU,MAAM,CAAC,MAAuB;IAC3C,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAa,EACb,UAAyB;IAEzB,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAa,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,EAAE,QAAQ,GAAG,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC;IAE9D,MAAM,IAAI,GAAa;QACrB,QAAQ,EAAE,QAAsC;QAChD,QAAQ,EAAE,QAAsC;QAChD,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7B,UAAU,EAAE;YACV,QAAQ;YACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;YAClB,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
|