Skip to content

Commit 83e18d7

Browse files
committed
fix: Host and Port types are only used internally now
When creating or getting the host and port information, they are now used as a string and number. Internally they are the Opaque types `Host` and `Port`.
1 parent 4e4c464 commit 83e18d7

File tree

12 files changed

+173
-127
lines changed

12 files changed

+173
-127
lines changed

package-lock.json

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/QUICClient.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import type { ContextTimed } from '@matrixai/contexts';
33
import type {
44
ClientCrypto,
55
Host,
6-
Hostname,
7-
Port,
86
VerifyCallback,
97
} from './types';
108
import type { Config } from './native/types';
@@ -76,16 +74,16 @@ class QUICClient extends EventTarget {
7674
*/
7775
public static createQUICClient(
7876
opts: {
79-
host: Host | Hostname;
80-
port: Port;
81-
localHost?: Host | Hostname;
82-
localPort?: Port;
77+
host: string;
78+
port: number;
79+
localHost?: string;
80+
localPort?: number;
8381
crypto: {
8482
ops: ClientCrypto;
8583
};
8684
config?: Partial<QUICConfig>;
8785
socket?: QUICSocket;
88-
resolveHostname?: (hostname: Hostname) => Host | PromiseLike<Host>;
86+
resolveHostname?: (hostname: string) => Host | PromiseLike<Host>;
8987
reasonToCode?: StreamReasonToCode;
9088
codeToReason?: StreamCodeToReason;
9189
verifyCallback?: VerifyCallback;
@@ -98,8 +96,8 @@ class QUICClient extends EventTarget {
9896
{
9997
host,
10098
port,
101-
localHost = '::' as Host,
102-
localPort = 0 as Port,
99+
localHost = '::',
100+
localPort = 0,
103101
crypto,
104102
config = {},
105103
socket,
@@ -109,18 +107,18 @@ class QUICClient extends EventTarget {
109107
verifyCallback,
110108
logger = new Logger(`${this.name}`),
111109
}: {
112-
host: Host | Hostname;
113-
port: Port;
114-
localHost?: Host | Hostname;
115-
localPort?: Port;
110+
host: string;
111+
port: number;
112+
localHost?: string;
113+
localPort?: number;
116114
crypto: {
117115
ops: {
118116
randomBytes(data: ArrayBuffer): Promise<void>;
119117
};
120118
};
121119
config?: Partial<QUICConfig>;
122120
socket?: QUICSocket;
123-
resolveHostname?: (hostname: Hostname) => Host | PromiseLike<Host>;
121+
resolveHostname?: (hostname: string) => Host | PromiseLike<Host>;
124122
reasonToCode?: StreamReasonToCode;
125123
codeToReason?: StreamCodeToReason;
126124
verifyCallback?: VerifyCallback;
@@ -139,7 +137,12 @@ class QUICClient extends EventTarget {
139137
const scidBuffer = new ArrayBuffer(quiche.MAX_CONN_ID_LEN);
140138
await crypto.ops.randomBytes(scidBuffer);
141139
const scid = new QUICConnectionId(scidBuffer);
140+
// validating host and port types
142141
let [host_] = await utils.resolveHost(host, resolveHostname);
142+
let [localHost_] = await utils.resolveHost(host, resolveHostname);
143+
if (!utils.isPort(port) || !utils.isPort(localPort)) {
144+
throw Error('TMP Not a valid port number');
145+
}
143146
// If the target host is in fact a zero IP, it cannot be used
144147
// as a target host, so we need to resolve it to a non-zero IP
145148
// in this case, 0.0.0.0 is resolved to 127.0.0.1 and :: and ::0 is
@@ -159,7 +162,7 @@ class QUICClient extends EventTarget {
159162
});
160163
isSocketShared = false;
161164
await socket.start({
162-
host: localHost,
165+
host: localHost_,
163166
port: localPort,
164167
});
165168
} else {
@@ -388,12 +391,12 @@ class QUICClient extends EventTarget {
388391
}
389392

390393
@ready(new errors.ErrorQUICClientDestroyed())
391-
public get host() {
394+
public get host(): string {
392395
return this.socket.host;
393396
}
394397

395398
@ready(new errors.ErrorQUICClientDestroyed())
396-
public get port() {
399+
public get port(): number {
397400
return this.socket.port;
398401
}
399402

src/QUICConnection.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -453,19 +453,19 @@ class QUICConnection extends EventTarget {
453453
this.rejectClosedP = rejectClosedP;
454454
}
455455

456-
public get remoteHost() {
456+
public get remoteHost(): string {
457457
return this._remoteHost;
458458
}
459459

460-
public get remotePort() {
460+
public get remotePort(): number {
461461
return this._remotePort;
462462
}
463463

464-
public get localHost() {
464+
public get localHost(): string {
465465
return this.socket.host;
466466
}
467467

468-
public get localPort() {
468+
public get localPort(): number {
469469
return this.socket.port;
470470
}
471471

src/QUICServer.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class QUICServer extends EventTarget {
122122
cert: string | Array<string> | Uint8Array | Array<Uint8Array>;
123123
};
124124
socket?: QUICSocket;
125-
resolveHostname?: (hostname: Hostname) => Host | PromiseLike<Host>;
125+
resolveHostname?: (hostname: string) => Host | PromiseLike<Host>;
126126
reasonToCode?: StreamReasonToCode;
127127
codeToReason?: StreamCodeToReason;
128128
verifyCallback?: VerifyCallback;
@@ -156,12 +156,12 @@ class QUICServer extends EventTarget {
156156
}
157157

158158
@ready(new errors.ErrorQUICServerNotRunning())
159-
public get host() {
159+
public get host(): string {
160160
return this.socket.host;
161161
}
162162

163163
@ready(new errors.ErrorQUICServerNotRunning())
164-
public get port() {
164+
public get port(): number {
165165
return this.socket.port;
166166
}
167167

@@ -172,12 +172,12 @@ class QUICServer extends EventTarget {
172172
* In which case, the `host` and `port` parameters here are ignored.
173173
*/
174174
public async start({
175-
host = '::' as Host,
176-
port = 0 as Port,
175+
host = '::',
176+
port = 0,
177177
reuseAddr,
178178
}: {
179-
host?: Host | Hostname;
180-
port?: Port;
179+
host?: string;
180+
port?: number;
181181
reuseAddr?: boolean;
182182
} = {}) {
183183
let address: string;

src/QUICSocket.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class QUICSocket extends EventTarget {
3333
protected logger: Logger;
3434
protected server?: QUICServer;
3535

36-
protected resolveHostname: (hostname: Hostname) => Host | PromiseLike<Host>;
36+
protected resolveHostname: (hostname: string) => Host | PromiseLike<Host>;
3737

3838
protected socketBind: (port: number, host: string) => Promise<void>;
3939
protected socketClose: () => Promise<void>;
@@ -138,7 +138,7 @@ class QUICSocket extends EventTarget {
138138
resolveHostname = utils.resolveHostname,
139139
logger,
140140
}: {
141-
resolveHostname?: (hostname: Hostname) => Host | PromiseLike<Host>;
141+
resolveHostname?: (hostname: string) => Host | PromiseLike<Host>;
142142
logger?: Logger;
143143
}) {
144144
super();
@@ -184,13 +184,13 @@ class QUICSocket extends EventTarget {
184184
* If the host is a hostname such as `localhost`, this will perform do local resolution.
185185
*/
186186
public async start({
187-
host = '::' as Host,
188-
port = 0 as Port,
187+
host = '::',
188+
port = 0,
189189
reuseAddr = false,
190190
ipv6Only = false,
191191
}: {
192-
host?: Host | Hostname;
193-
port?: Port;
192+
host?: string;
193+
port?: number;
194194
reuseAddr?: boolean;
195195
ipv6Only?: boolean;
196196
} = {}): Promise<void> {
@@ -202,6 +202,7 @@ class QUICSocket extends EventTarget {
202202
host,
203203
this.resolveHostname,
204204
);
205+
if (!utils.isPort(port)) throw Error('TMP invalid port');
205206
this.socket = dgram.createSocket({
206207
type: udpType,
207208
reuseAddr,

src/types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ type StreamCodeToReason = (
106106

107107
type ConnectionMetadata = {
108108
remoteCertificates: Array<string> | null;
109-
localHost: Host;
110-
localPort: Port;
111-
remoteHost: Host;
112-
remotePort: Port;
109+
localHost: string;
110+
localPort: number;
111+
remoteHost: string;
112+
remotePort: number;
113113
};
114114

115115
type QUICConfig = {

src/utils.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
ConnectionIdString,
66
Host,
77
Hostname,
8+
Port,
89
ServerCrypto,
910
} from './types';
1011
import type { Connection } from './native';
@@ -146,7 +147,7 @@ function toCanonicalIp(host: string) {
146147
* It could be an IPv6 address or IPv4 address.
147148
* This uses the OS's DNS resolution system.
148149
*/
149-
async function resolveHostname(hostname: Hostname): Promise<Host> {
150+
async function resolveHostname(hostname: string): Promise<Host> {
150151
const result = await dns.promises.lookup(hostname, {
151152
family: 0,
152153
all: false,
@@ -160,19 +161,27 @@ async function resolveHostname(hostname: Hostname): Promise<Host> {
160161
* The `resolveHostname` can be overridden.
161162
*/
162163
async function resolveHost(
163-
host: Host | Hostname,
164-
resolveHostname: (hostname: Hostname) => Host | PromiseLike<Host>,
164+
host: string,
165+
resolveHostname: (hostname: string) => Host | PromiseLike<Host>,
165166
): Promise<[Host, 'udp4' | 'udp6']> {
166167
if (isIPv4(host)) {
167168
return [host as Host, 'udp4'];
168169
} else if (isIPv6(host)) {
169170
return [host as Host, 'udp6'];
170171
} else {
171-
host = await resolveHostname(host as Hostname);
172+
host = await resolveHostname(host);
172173
return resolveHost(host, resolveHostname);
173174
}
174175
}
175176

177+
/**
178+
* Is it a valid Port?
179+
*/
180+
function isPort(port: any): port is Port {
181+
if (typeof port !== 'number') return false;
182+
return port >= 0 && port <= 65535;
183+
}
184+
176185
/**
177186
* Convert callback-style to promise-style
178187
* If this is applied to overloaded function
@@ -455,6 +464,7 @@ export {
455464
toCanonicalIp,
456465
resolveHostname,
457466
resolveHost,
467+
isPort,
458468
promisify,
459469
promise,
460470
bufferWrap,

0 commit comments

Comments
 (0)