1
1
import { Transport } from "../transport.js" ;
2
2
import { nextTick } from "./websocket-constructor.js" ;
3
3
import {
4
- encodePacketToBinary ,
5
- decodePacketFromBinary ,
6
4
Packet ,
5
+ createPacketDecoderStream ,
6
+ createPacketEncoderStream ,
7
7
} from "engine.io-parser" ;
8
8
import debugModule from "debug" ; // debug()
9
9
10
10
const debug = debugModule ( "engine.io-client:webtransport" ) ; // debug()
11
11
12
- function shouldIncludeBinaryHeader ( packet , encoded ) {
13
- // 48 === "0".charCodeAt(0) (OPEN packet type)
14
- // 54 === "6".charCodeAt(0) (NOOP packet type)
15
- return (
16
- packet . type === "message" &&
17
- typeof packet . data !== "string" &&
18
- encoded [ 0 ] >= 48 &&
19
- encoded [ 0 ] <= 54
20
- ) ;
21
- }
22
-
23
12
export class WT extends Transport {
24
13
private transport : any ;
25
14
private writer : any ;
@@ -52,10 +41,16 @@ export class WT extends Transport {
52
41
// note: we could have used async/await, but that would require some additional polyfills
53
42
this . transport . ready . then ( ( ) => {
54
43
this . transport . createBidirectionalStream ( ) . then ( ( stream ) => {
55
- const reader = stream . readable . getReader ( ) ;
56
- this . writer = stream . writable . getWriter ( ) ;
44
+ const decoderStream = createPacketDecoderStream (
45
+ Number . MAX_SAFE_INTEGER ,
46
+ // TODO expose binarytype
47
+ "arraybuffer"
48
+ ) ;
49
+ const reader = stream . readable . pipeThrough ( decoderStream ) . getReader ( ) ;
57
50
58
- let binaryFlag ;
51
+ const encoderStream = createPacketEncoderStream ( ) ;
52
+ encoderStream . readable . pipeTo ( stream . writable ) ;
53
+ this . writer = encoderStream . writable . getWriter ( ) ;
59
54
60
55
const read = ( ) => {
61
56
reader
@@ -66,15 +61,7 @@ export class WT extends Transport {
66
61
return ;
67
62
}
68
63
debug ( "received chunk: %o" , value ) ;
69
- if ( ! binaryFlag && value . byteLength === 1 && value [ 0 ] === 54 ) {
70
- binaryFlag = true ;
71
- } else {
72
- // TODO expose binarytype
73
- this . onPacket (
74
- decodePacketFromBinary ( value , binaryFlag , "arraybuffer" )
75
- ) ;
76
- binaryFlag = false ;
77
- }
64
+ this . onPacket ( value ) ;
78
65
read ( ) ;
79
66
} )
80
67
. catch ( ( err ) => {
@@ -84,10 +71,11 @@ export class WT extends Transport {
84
71
85
72
read ( ) ;
86
73
87
- const handshake = this . query . sid ? `0{"sid":"${ this . query . sid } "}` : "0" ;
88
- this . writer
89
- . write ( new TextEncoder ( ) . encode ( handshake ) )
90
- . then ( ( ) => this . onOpen ( ) ) ;
74
+ const packet : Packet = { type : "open" } ;
75
+ if ( this . query . sid ) {
76
+ packet . data = `{"sid":"${ this . query . sid } "}` ;
77
+ }
78
+ this . writer . write ( packet ) . then ( ( ) => this . onOpen ( ) ) ;
91
79
} ) ;
92
80
} ) ;
93
81
}
@@ -99,20 +87,13 @@ export class WT extends Transport {
99
87
const packet = packets [ i ] ;
100
88
const lastPacket = i === packets . length - 1 ;
101
89
102
- encodePacketToBinary ( packet , ( data ) => {
103
- if ( shouldIncludeBinaryHeader ( packet , data ) ) {
104
- debug ( "writing binary header" ) ;
105
- this . writer . write ( Uint8Array . of ( 54 ) ) ;
90
+ this . writer . write ( packet ) . then ( ( ) => {
91
+ if ( lastPacket ) {
92
+ nextTick ( ( ) => {
93
+ this . writable = true ;
94
+ this . emitReserved ( "drain" ) ;
95
+ } , this . setTimeoutFn ) ;
106
96
}
107
- debug ( "writing chunk: %o" , data ) ;
108
- this . writer . write ( data ) . then ( ( ) => {
109
- if ( lastPacket ) {
110
- nextTick ( ( ) => {
111
- this . writable = true ;
112
- this . emitReserved ( "drain" ) ;
113
- } , this . setTimeoutFn ) ;
114
- }
115
- } ) ;
116
97
} ) ;
117
98
}
118
99
}
0 commit comments