1
- import { BufReader , writeAll } from "../../deps.ts" ;
2
1
import {
3
2
MongoDriverError ,
4
3
MongoErrorInfo ,
@@ -9,7 +8,6 @@ import { handshake } from "./handshake.ts";
9
8
import { parseHeader } from "./header.ts" ;
10
9
import { deserializeMessage , Message , serializeMessage } from "./message.ts" ;
11
10
12
- type Socket = Deno . Reader & Deno . Writer ;
13
11
interface CommandTask {
14
12
requestId : number ;
15
13
db : string ;
@@ -19,7 +17,7 @@ interface CommandTask {
19
17
let nextRequestId = 0 ;
20
18
21
19
export class WireProtocol {
22
- #socket: Socket ;
20
+ #conn: Deno . Conn ;
23
21
#isPendingResponse = false ;
24
22
#isPendingRequest = false ;
25
23
#pendingResponses: Map < number , {
@@ -28,12 +26,10 @@ export class WireProtocol {
28
26
// deno-lint-ignore no-explicit-any
29
27
reject : ( reason ?: any ) => void ;
30
28
} > = new Map ( ) ;
31
- #reader: BufReader ;
32
29
#commandQueue: CommandTask [ ] = [ ] ;
33
30
34
- constructor ( socket : Socket ) {
35
- this . #socket = socket ;
36
- this . #reader = new BufReader ( this . #socket) ;
31
+ constructor ( socket : Deno . Conn ) {
32
+ this . #conn = socket ;
37
33
}
38
34
39
35
async connect ( ) {
@@ -98,7 +94,9 @@ export class WireProtocol {
98
94
] ,
99
95
} ) ;
100
96
101
- await writeAll ( this . #socket, buffer ) ;
97
+ const w = this . #conn. writable . getWriter ( ) ;
98
+ await w . write ( buffer ) ;
99
+ w . releaseLock ( ) ;
102
100
}
103
101
this . #isPendingRequest = false ;
104
102
}
@@ -107,14 +105,14 @@ export class WireProtocol {
107
105
if ( this . #isPendingResponse) return ;
108
106
this . #isPendingResponse = true ;
109
107
while ( this . #pendingResponses. size > 0 ) {
110
- const headerBuffer = await this . #reader . readFull ( new Uint8Array ( 16 ) ) ;
108
+ const headerBuffer = await this . read_socket ( 16 ) ;
111
109
if ( ! headerBuffer ) {
112
110
throw new MongoDriverError ( "Invalid response header" ) ;
113
111
}
114
112
const header = parseHeader ( headerBuffer ) ;
115
- const bodyBuffer = await this . #reader . readFull (
116
- new Uint8Array ( header . messageLength - 16 ) ,
117
- ) ;
113
+ let bodyBytes = header . messageLength - 16 ;
114
+ if ( bodyBytes < 0 ) bodyBytes = 0 ;
115
+ const bodyBuffer = await this . read_socket ( header . messageLength - 16 ) ;
118
116
if ( ! bodyBuffer ) {
119
117
throw new MongoDriverError ( "Invalid response body" ) ;
120
118
}
@@ -125,4 +123,13 @@ export class WireProtocol {
125
123
}
126
124
this . #isPendingResponse = false ;
127
125
}
126
+
127
+ private async read_socket (
128
+ b : number ,
129
+ ) : Promise < Uint8Array | undefined > {
130
+ const reader = this . #conn. readable . getReader ( { mode : "byob" } ) ;
131
+ const { value } = await reader . read ( new Uint8Array ( b ) ) ;
132
+ reader . releaseLock ( ) ;
133
+ return value ;
134
+ }
128
135
}
0 commit comments