-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathsocket.ts
More file actions
73 lines (65 loc) · 1.71 KB
/
socket.ts
File metadata and controls
73 lines (65 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
export type SockAddr = NetAddr | UnixAddr | VsockAddr;
export interface NetAddr {
transport: "tcp" | "udp";
hostname: string;
port: number;
}
export interface UnixAddr {
transport: "unix" | "unixpacket";
path: string;
}
export interface VsockAddr {
transport: "vsock";
cid: number;
port: number;
}
export type SockConn = {
readable: ReadableStream<Uint8Array>;
writable: WritableStream<Uint8Array>;
close: () => void;
localAddr?: SockAddr;
remoteAddr?: SockAddr;
};
export class Conn {
reader: ReadableStreamBYOBReader;
writer: WritableStreamDefaultWriter<Uint8Array>;
closed: boolean;
remoteAddr: SockAddr | undefined;
closer: () => void;
constructor(sockConn: SockConn) {
this.closed = false;
this.reader = sockConn.readable.getReader({ mode: "byob" });
this.writer = sockConn.writable.getWriter();
// this.writer.closed.then(() => this.closed = true);
this.closer = sockConn.close.bind(sockConn);
this.remoteAddr = sockConn.remoteAddr;
}
async read(buff: Uint8Array): Promise<number | null> {
const buff2 = new Uint8Array(buff.length);
const result = await this.reader.read(buff2);
if (!result.done) {
buff.set(result.value);
}
return result.value?.byteLength || null;
}
write(data: Uint8Array): Promise<number> {
if (this.closed) {
return Promise.reject();
}
this.writer.write(data);
return new Promise((resolve) => resolve(data.length));
}
close() {
if (!this.closed) {
try {
this.writer.close();
} catch (_err) { /* swallow any errors on close */ }
this.closed = true;
try {
this.closer();
} catch (_err) {
// swallow any errors on close
}
}
}
}