Skip to content

Commit 606f88d

Browse files
committed
refactor: replace [email protected] node imports with node: built-ins
1 parent ff75e74 commit 606f88d

27 files changed

+6367
-22
lines changed

deno/mod.js.bak

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @deno-types="./types/index.d.ts"
2+
export { default } from './src/index.js'

deno/polyfills.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* global Deno */
22

3-
import { Buffer } from 'https://deno.land/[email protected]/node/buffer.ts'
4-
import { isIP } from 'https://deno.land/[email protected]/node/net.ts'
3+
import { Buffer } from 'node:buffer'
4+
import { isIP } from 'node:net'
55

66
const events = () => ({ data: [], error: [], drain: [], connect: [], secureConnect: [], close: [] })
77

deno/polyfills.js.bak

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
/* global Deno */
2+
3+
import { Buffer } from 'https://deno.land/[email protected]/node/buffer.ts'
4+
import { isIP } from 'https://deno.land/[email protected]/node/net.ts'
5+
6+
const events = () => ({ data: [], error: [], drain: [], connect: [], secureConnect: [], close: [] })
7+
8+
class Socket {
9+
constructor() {
10+
return createSocket()
11+
}
12+
}
13+
14+
function createSocket() {
15+
let paused
16+
, resume
17+
, keepAlive
18+
19+
const socket = {
20+
error,
21+
success,
22+
readyState: 'open',
23+
setKeepAlive: x => {
24+
keepAlive = x
25+
socket.raw && socket.raw.setKeepAlive && socket.raw.setKeepAlive(x)
26+
},
27+
connect: (port, hostname) => {
28+
socket.raw = null
29+
socket.readyState = 'connecting'
30+
typeof port === 'string'
31+
? Deno.connect({ transport: 'unix', path: socket.path = port }).then(success, error)
32+
: Deno.connect({ transport: 'tcp', port: socket.port = port, hostname: socket.hostname = hostname || 'localhost' }).then(success, error) // eslint-disable-line
33+
return socket
34+
},
35+
pause: () => {
36+
paused = new Promise(r => resume = r)
37+
},
38+
resume: () => {
39+
resume && resume()
40+
paused = null
41+
},
42+
isPaused: () => !!paused,
43+
removeAllListeners: () => socket.events = events(),
44+
events: events(),
45+
raw: null,
46+
on: (x, fn) => socket.events[x].push(fn),
47+
once: (x, fn) => {
48+
if (x === 'data')
49+
socket.break = true
50+
const e = socket.events[x]
51+
e.push(once)
52+
once.once = fn
53+
function once(...args) {
54+
fn(...args)
55+
e.indexOf(once) > -1 && e.splice(e.indexOf(once), 1)
56+
}
57+
},
58+
removeListener: (x, fn) => {
59+
socket.events[x] = socket.events[x].filter(x => x !== fn && x.once !== fn)
60+
},
61+
write: (x, cb) => {
62+
socket.raw.write(x).then(l => {
63+
l < x.length
64+
? socket.write(x.slice(l), cb)
65+
: (cb && cb(null))
66+
}).catch(err => {
67+
cb && cb()
68+
call(socket.events.error, err)
69+
})
70+
return false
71+
},
72+
destroy: () => close(),
73+
end: (x) => {
74+
x && socket.write(x)
75+
close()
76+
}
77+
}
78+
79+
return socket
80+
81+
async function success(raw) {
82+
if (socket.readyState !== 'connecting')
83+
return raw.close()
84+
85+
const encrypted = socket.encrypted
86+
socket.raw = raw
87+
keepAlive != null && raw.setKeepAlive && raw.setKeepAlive(keepAlive)
88+
socket.readyState = 'open'
89+
socket.encrypted
90+
? call(socket.events.secureConnect)
91+
: call(socket.events.connect)
92+
93+
const b = new Uint8Array(1024)
94+
let result
95+
96+
try {
97+
while ((result = socket.readyState === 'open' && await raw.read(b))) {
98+
call(socket.events.data, Buffer.from(b.subarray(0, result)))
99+
if (!encrypted && socket.break && (socket.break = false, b[0] === 83))
100+
return socket.break = false
101+
paused && await paused
102+
}
103+
} catch (e) {
104+
if (e instanceof Deno.errors.BadResource === false)
105+
error(e)
106+
}
107+
108+
if (!socket.encrypted || encrypted)
109+
closed()
110+
}
111+
112+
function close() {
113+
try {
114+
socket.raw && socket.raw.close()
115+
} catch (e) {
116+
if (e instanceof Deno.errors.BadResource === false)
117+
call(socket.events.error, e)
118+
}
119+
}
120+
121+
function closed() {
122+
if (socket.readyState === 'closed')
123+
return
124+
125+
socket.break = socket.encrypted = false
126+
socket.readyState = 'closed'
127+
call(socket.events.close)
128+
}
129+
130+
function error(err) {
131+
call(socket.events.error, err)
132+
socket.raw
133+
? close()
134+
: closed()
135+
}
136+
137+
function call(xs, x) {
138+
xs.slice().forEach(fn => fn(x))
139+
}
140+
}
141+
142+
export const net = {
143+
isIP,
144+
createServer() {
145+
const server = {
146+
address() {
147+
return { port: 9876 }
148+
},
149+
async listen() {
150+
server.raw = Deno.listen({ port: 9876, transport: 'tcp' })
151+
for await (const conn of server.raw)
152+
setTimeout(() => conn.close(), 500)
153+
},
154+
close() {
155+
server.raw.close()
156+
}
157+
}
158+
return server
159+
},
160+
Socket
161+
}
162+
163+
export const tls = {
164+
connect({ socket, ...options }) {
165+
socket.encrypted = true
166+
socket.readyState = 'connecting'
167+
Deno.startTls(socket.raw, { hostname: socket.hostname, ...options })
168+
.then(socket.success, socket.error)
169+
socket.raw = null
170+
return socket
171+
}
172+
}
173+
174+
let ids = 1
175+
const tasks = new Set()
176+
export const setImmediate = fn => {
177+
const id = ids++
178+
tasks.add(id)
179+
queueMicrotask(() => {
180+
if (tasks.has(id)) {
181+
fn()
182+
tasks.delete(id)
183+
}
184+
})
185+
return id
186+
}
187+
188+
export const clearImmediate = id => tasks.delete(id)
189+

deno/src/bytes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Buffer } from 'https://deno.land/[email protected]/node/buffer.ts'
1+
import { Buffer } from 'node:buffer'
22
const size = 256
33
let buffer = Buffer.allocUnsafe(size)
44

deno/src/bytes.js.bak

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { Buffer } from 'https://deno.land/[email protected]/node/buffer.ts'
2+
const size = 256
3+
let buffer = Buffer.allocUnsafe(size)
4+
5+
const messages = 'BCcDdEFfHPpQSX'.split('').reduce((acc, x) => {
6+
const v = x.charCodeAt(0)
7+
acc[x] = () => {
8+
buffer[0] = v
9+
b.i = 5
10+
return b
11+
}
12+
return acc
13+
}, {})
14+
15+
const b = Object.assign(reset, messages, {
16+
N: String.fromCharCode(0),
17+
i: 0,
18+
inc(x) {
19+
b.i += x
20+
return b
21+
},
22+
str(x) {
23+
const length = Buffer.byteLength(x)
24+
fit(length)
25+
b.i += buffer.write(x, b.i, length, 'utf8')
26+
return b
27+
},
28+
i16(x) {
29+
fit(2)
30+
buffer.writeUInt16BE(x, b.i)
31+
b.i += 2
32+
return b
33+
},
34+
i32(x, i) {
35+
if (i || i === 0) {
36+
buffer.writeUInt32BE(x, i)
37+
return b
38+
}
39+
fit(4)
40+
buffer.writeUInt32BE(x, b.i)
41+
b.i += 4
42+
return b
43+
},
44+
z(x) {
45+
fit(x)
46+
buffer.fill(0, b.i, b.i + x)
47+
b.i += x
48+
return b
49+
},
50+
raw(x) {
51+
buffer = Buffer.concat([buffer.subarray(0, b.i), x])
52+
b.i = buffer.length
53+
return b
54+
},
55+
end(at = 1) {
56+
buffer.writeUInt32BE(b.i - at, at)
57+
const out = buffer.subarray(0, b.i)
58+
b.i = 0
59+
buffer = Buffer.allocUnsafe(size)
60+
return out
61+
}
62+
})
63+
64+
export default b
65+
66+
function fit(x) {
67+
if (buffer.length - b.i < x) {
68+
const prev = buffer
69+
, length = prev.length
70+
71+
buffer = Buffer.allocUnsafe(length + (length >> 1) + x)
72+
prev.copy(buffer)
73+
}
74+
}
75+
76+
function reset() {
77+
b.i = 0
78+
return b
79+
}

deno/src/connection.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { HmacSha256 } from 'https://deno.land/[email protected]/hash/sha256.ts'
2-
import { Buffer } from 'https://deno.land/[email protected]/node/buffer.ts'
2+
import { Buffer } from 'node:buffer'
33
import { setImmediate, clearImmediate } from '../polyfills.js'
44
import { net } from '../polyfills.js'
55
import { tls } from '../polyfills.js'
6-
import crypto from 'https://deno.land/[email protected]/node/crypto.ts'
7-
import Stream from 'https://deno.land/[email protected]/node/stream.ts'
6+
import crypto from 'node:crypto'
7+
import Stream from 'node:stream'
88

99

1010
import { stringify, handleValue, arrayParser, arraySerializer } from './types.js'

0 commit comments

Comments
 (0)