viem 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/_cjs/clients/transports/http.js +8 -5
- package/_cjs/clients/transports/http.js.map +1 -1
- package/_cjs/clients/transports/ipc.js +77 -0
- package/_cjs/clients/transports/ipc.js.map +1 -0
- package/_cjs/clients/transports/webSocket.js +11 -7
- package/_cjs/clients/transports/webSocket.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/node/index.js +8 -0
- package/_cjs/node/index.js.map +1 -0
- package/_cjs/utils/index.js +13 -6
- package/_cjs/utils/index.js.map +1 -1
- package/_cjs/utils/rpc/compat.js +35 -0
- package/_cjs/utils/rpc/compat.js.map +1 -0
- package/_cjs/utils/rpc/http.js +74 -0
- package/_cjs/utils/rpc/http.js.map +1 -0
- package/_cjs/utils/rpc/id.js +17 -0
- package/_cjs/utils/rpc/id.js.map +1 -0
- package/_cjs/utils/rpc/ipc.js +75 -0
- package/_cjs/utils/rpc/ipc.js.map +1 -0
- package/_cjs/utils/rpc/socket.js +85 -0
- package/_cjs/utils/rpc/socket.js.map +1 -0
- package/_cjs/utils/rpc/webSocket.js +50 -0
- package/_cjs/utils/rpc/webSocket.js.map +1 -0
- package/_esm/clients/transports/http.js +8 -5
- package/_esm/clients/transports/http.js.map +1 -1
- package/_esm/clients/transports/ipc.js +77 -0
- package/_esm/clients/transports/ipc.js.map +1 -0
- package/_esm/clients/transports/webSocket.js +10 -6
- package/_esm/clients/transports/webSocket.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/node/index.js +3 -0
- package/_esm/node/index.js.map +1 -0
- package/_esm/utils/index.js +4 -1
- package/_esm/utils/index.js.map +1 -1
- package/_esm/utils/rpc/compat.js +86 -0
- package/_esm/utils/rpc/compat.js.map +1 -0
- package/_esm/utils/rpc/http.js +70 -0
- package/_esm/utils/rpc/http.js.map +1 -0
- package/_esm/utils/rpc/id.js +13 -0
- package/_esm/utils/rpc/id.js.map +1 -0
- package/_esm/utils/rpc/ipc.js +71 -0
- package/_esm/utils/rpc/ipc.js.map +1 -0
- package/_esm/utils/rpc/socket.js +90 -0
- package/_esm/utils/rpc/socket.js.map +1 -0
- package/_esm/utils/rpc/webSocket.js +48 -0
- package/_esm/utils/rpc/webSocket.js.map +1 -0
- package/_types/clients/transports/http.d.ts +2 -2
- package/_types/clients/transports/http.d.ts.map +1 -1
- package/_types/clients/transports/ipc.d.ts +46 -0
- package/_types/clients/transports/ipc.d.ts.map +1 -0
- package/_types/clients/transports/webSocket.d.ts +6 -1
- package/_types/clients/transports/webSocket.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/node/index.d.ts +3 -0
- package/_types/node/index.d.ts.map +1 -0
- package/_types/types/rpc.d.ts +35 -0
- package/_types/types/rpc.d.ts.map +1 -1
- package/_types/utils/buildRequest.d.ts +2 -2
- package/_types/utils/buildRequest.d.ts.map +1 -1
- package/_types/utils/index.d.ts +4 -1
- package/_types/utils/index.d.ts.map +1 -1
- package/_types/utils/rpc/compat.d.ts +78 -0
- package/_types/utils/rpc/compat.d.ts.map +1 -0
- package/_types/utils/rpc/http.d.ts +20 -0
- package/_types/utils/rpc/http.d.ts.map +1 -0
- package/_types/utils/rpc/id.d.ts +11 -0
- package/_types/utils/rpc/id.d.ts.map +1 -0
- package/_types/utils/rpc/ipc.d.ts +8 -0
- package/_types/utils/rpc/ipc.d.ts.map +1 -0
- package/_types/utils/rpc/socket.d.ts +45 -0
- package/_types/utils/rpc/socket.d.ts.map +1 -0
- package/_types/utils/rpc/webSocket.d.ts +3 -0
- package/_types/utils/rpc/webSocket.d.ts.map +1 -0
- package/clients/transports/http.ts +15 -6
- package/clients/transports/ipc.ts +144 -0
- package/clients/transports/webSocket.ts +16 -6
- package/errors/version.ts +1 -1
- package/node/index.ts +11 -0
- package/node/package.json +6 -0
- package/package.json +9 -1
- package/types/rpc.ts +44 -0
- package/utils/buildRequest.ts +2 -2
- package/utils/index.ts +19 -8
- package/utils/rpc/compat.ts +117 -0
- package/utils/rpc/http.ts +132 -0
- package/utils/rpc/id.ts +13 -0
- package/utils/rpc/ipc.ts +89 -0
- package/utils/rpc/socket.ts +162 -0
- package/utils/rpc/webSocket.ts +63 -0
- package/_cjs/utils/rpc.js +0 -154
- package/_cjs/utils/rpc.js.map +0 -1
- package/_esm/utils/rpc.js +0 -160
- package/_esm/utils/rpc.js.map +0 -1
- package/_types/utils/rpc.d.ts +0 -80
- package/_types/utils/rpc.d.ts.map +0 -1
- package/utils/rpc.ts +0 -318
package/utils/rpc/ipc.ts
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
import { type Socket as NetSocket, connect } from 'node:net'
|
2
|
+
import { WebSocketRequestError } from '../../index.js'
|
3
|
+
import {
|
4
|
+
type Socket,
|
5
|
+
type SocketRpcClient,
|
6
|
+
getSocketRpcClient,
|
7
|
+
} from './socket.js'
|
8
|
+
|
9
|
+
const openingBrace = '{'.charCodeAt(0)
|
10
|
+
const closingBrace = '}'.charCodeAt(0)
|
11
|
+
|
12
|
+
export function extractMessages(buffer: Buffer): [Buffer[], Buffer] {
|
13
|
+
const messages: Buffer[] = []
|
14
|
+
|
15
|
+
let cursor = 0
|
16
|
+
let level = 0
|
17
|
+
for (let i = 0; i < buffer.length; i++) {
|
18
|
+
if (buffer[i] === openingBrace) level++
|
19
|
+
if (buffer[i] === closingBrace) level--
|
20
|
+
if (level === 0) {
|
21
|
+
const message = buffer.subarray(cursor, i + 1)
|
22
|
+
if (
|
23
|
+
message[0] === openingBrace &&
|
24
|
+
message[message.length - 1] === closingBrace
|
25
|
+
)
|
26
|
+
messages.push(message)
|
27
|
+
cursor = i + 1
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
return [messages, buffer.subarray(cursor)]
|
32
|
+
}
|
33
|
+
|
34
|
+
export type IpcRpcClient = SocketRpcClient<NetSocket>
|
35
|
+
|
36
|
+
export async function getIpcRpcClient(path: string): Promise<IpcRpcClient> {
|
37
|
+
return getSocketRpcClient({
|
38
|
+
async getSocket({ onResponse }) {
|
39
|
+
const socket = connect(path)
|
40
|
+
|
41
|
+
function onClose() {
|
42
|
+
socket.off('close', onClose)
|
43
|
+
socket.off('message', onData)
|
44
|
+
}
|
45
|
+
|
46
|
+
let lastRemaining = Buffer.alloc(0)
|
47
|
+
function onData(buffer: Buffer) {
|
48
|
+
const [messages, remaining] = extractMessages(
|
49
|
+
Buffer.concat([lastRemaining, buffer]),
|
50
|
+
)
|
51
|
+
for (const message of messages) {
|
52
|
+
const response = JSON.parse(Buffer.from(message).toString())
|
53
|
+
onResponse(response)
|
54
|
+
}
|
55
|
+
lastRemaining = remaining
|
56
|
+
}
|
57
|
+
|
58
|
+
socket.on('close', onClose)
|
59
|
+
socket.on('data', onData)
|
60
|
+
|
61
|
+
// Wait for the socket to open.
|
62
|
+
await new Promise<void>((resolve, reject) => {
|
63
|
+
socket.on('ready', () => {
|
64
|
+
resolve()
|
65
|
+
socket.off('error', reject)
|
66
|
+
})
|
67
|
+
socket.on('error', reject)
|
68
|
+
})
|
69
|
+
|
70
|
+
return Object.assign(socket, {
|
71
|
+
close() {
|
72
|
+
socket.destroy()
|
73
|
+
socket.end()
|
74
|
+
},
|
75
|
+
request({ body }) {
|
76
|
+
if (socket.readyState !== 'open')
|
77
|
+
throw new WebSocketRequestError({
|
78
|
+
body,
|
79
|
+
url: path,
|
80
|
+
details: 'Socket is closed.',
|
81
|
+
})
|
82
|
+
|
83
|
+
return socket.write(JSON.stringify(body))
|
84
|
+
},
|
85
|
+
} as Socket<{}>)
|
86
|
+
},
|
87
|
+
url: path,
|
88
|
+
})
|
89
|
+
}
|
@@ -0,0 +1,162 @@
|
|
1
|
+
import { TimeoutError } from '../../errors/request.js'
|
2
|
+
import type { ErrorType } from '../../errors/utils.js'
|
3
|
+
import type { RpcRequest, RpcResponse } from '../../types/rpc.js'
|
4
|
+
import {
|
5
|
+
type CreateBatchSchedulerErrorType,
|
6
|
+
createBatchScheduler,
|
7
|
+
} from '../promise/createBatchScheduler.js'
|
8
|
+
import { withTimeout } from '../promise/withTimeout.js'
|
9
|
+
import { idCache } from './id.js'
|
10
|
+
|
11
|
+
type Id = string | number
|
12
|
+
type CallbackFn = (message: any) => void
|
13
|
+
type CallbackMap = Map<Id, CallbackFn>
|
14
|
+
|
15
|
+
export type GetSocketParameters = {
|
16
|
+
onResponse: (data: RpcResponse) => void
|
17
|
+
}
|
18
|
+
|
19
|
+
export type Socket<socket extends {}> = socket & {
|
20
|
+
close(): void
|
21
|
+
request(params: {
|
22
|
+
body: RpcRequest
|
23
|
+
}): void
|
24
|
+
}
|
25
|
+
|
26
|
+
export type SocketRpcClient<socket extends {}> = {
|
27
|
+
close(): void
|
28
|
+
socket: Socket<socket>
|
29
|
+
request(params: {
|
30
|
+
body: RpcRequest
|
31
|
+
onError?: (error: Error) => void
|
32
|
+
onResponse: (message: RpcResponse) => void
|
33
|
+
}): void
|
34
|
+
requestAsync(params: {
|
35
|
+
body: RpcRequest
|
36
|
+
timeout?: number
|
37
|
+
}): Promise<RpcResponse>
|
38
|
+
requests: CallbackMap
|
39
|
+
subscriptions: CallbackMap
|
40
|
+
url: string
|
41
|
+
}
|
42
|
+
|
43
|
+
export type GetSocketRpcClientParameters<socket extends {}> = {
|
44
|
+
url: string
|
45
|
+
getSocket(params: GetSocketParameters): Promise<Socket<socket>>
|
46
|
+
}
|
47
|
+
|
48
|
+
export type GetSocketRpcClientErrorType =
|
49
|
+
| CreateBatchSchedulerErrorType
|
50
|
+
| ErrorType
|
51
|
+
|
52
|
+
export const socketClientCache = /*#__PURE__*/ new Map<
|
53
|
+
string,
|
54
|
+
SocketRpcClient<Socket<{}>>
|
55
|
+
>()
|
56
|
+
|
57
|
+
export async function getSocketRpcClient<socket extends {}>(
|
58
|
+
params: GetSocketRpcClientParameters<socket>,
|
59
|
+
): Promise<SocketRpcClient<socket>> {
|
60
|
+
const { getSocket, url } = params
|
61
|
+
|
62
|
+
let socketClient = socketClientCache.get(url)
|
63
|
+
|
64
|
+
// If the socket already exists, return it.
|
65
|
+
if (socketClient) return socketClient as {} as SocketRpcClient<socket>
|
66
|
+
|
67
|
+
const { schedule } = createBatchScheduler<
|
68
|
+
undefined,
|
69
|
+
[SocketRpcClient<socket>]
|
70
|
+
>({
|
71
|
+
id: url,
|
72
|
+
fn: async () => {
|
73
|
+
// Set up a cache for incoming "synchronous" requests.
|
74
|
+
const requests = new Map<Id, CallbackFn>()
|
75
|
+
|
76
|
+
// Set up a cache for subscriptions (eth_subscribe).
|
77
|
+
const subscriptions = new Map<Id, CallbackFn>()
|
78
|
+
|
79
|
+
// Set up socket implementation.
|
80
|
+
const socket = await getSocket({
|
81
|
+
onResponse(data) {
|
82
|
+
const isSubscription = data.method === 'eth_subscription'
|
83
|
+
const id = isSubscription ? data.params.subscription : data.id
|
84
|
+
const cache = isSubscription ? subscriptions : requests
|
85
|
+
const callback = cache.get(id)
|
86
|
+
if (callback) callback(data)
|
87
|
+
if (!isSubscription) cache.delete(id)
|
88
|
+
},
|
89
|
+
})
|
90
|
+
|
91
|
+
// Create a new socket instance.
|
92
|
+
socketClient = {
|
93
|
+
close() {
|
94
|
+
socket.close()
|
95
|
+
socketClientCache.delete(url)
|
96
|
+
},
|
97
|
+
socket,
|
98
|
+
request({ body, onError, onResponse }) {
|
99
|
+
const id = body.id ?? idCache.take()
|
100
|
+
|
101
|
+
const callback = (response: RpcResponse) => {
|
102
|
+
if (typeof response.id === 'number' && id !== response.id) return
|
103
|
+
|
104
|
+
// If we are subscribing to a topic, we want to set up a listener for incoming
|
105
|
+
// messages.
|
106
|
+
if (
|
107
|
+
body.method === 'eth_subscribe' &&
|
108
|
+
typeof response.result === 'string'
|
109
|
+
)
|
110
|
+
subscriptions.set(response.result, callback)
|
111
|
+
|
112
|
+
// If we are unsubscribing from a topic, we want to remove the listener.
|
113
|
+
if (body.method === 'eth_unsubscribe')
|
114
|
+
subscriptions.delete(body.params?.[0])
|
115
|
+
|
116
|
+
onResponse(response)
|
117
|
+
|
118
|
+
// TODO: delete request?
|
119
|
+
}
|
120
|
+
|
121
|
+
requests.set(id, callback)
|
122
|
+
try {
|
123
|
+
socket.request({
|
124
|
+
body: {
|
125
|
+
jsonrpc: '2.0',
|
126
|
+
id,
|
127
|
+
...body,
|
128
|
+
},
|
129
|
+
})
|
130
|
+
} catch (error) {
|
131
|
+
onError?.(error as Error)
|
132
|
+
}
|
133
|
+
},
|
134
|
+
requestAsync({ body, timeout = 10_000 }) {
|
135
|
+
return withTimeout(
|
136
|
+
() =>
|
137
|
+
new Promise<RpcResponse>((onResponse, onError) =>
|
138
|
+
this.request({
|
139
|
+
body,
|
140
|
+
onError,
|
141
|
+
onResponse,
|
142
|
+
}),
|
143
|
+
),
|
144
|
+
{
|
145
|
+
errorInstance: new TimeoutError({ body, url }),
|
146
|
+
timeout,
|
147
|
+
},
|
148
|
+
)
|
149
|
+
},
|
150
|
+
requests,
|
151
|
+
subscriptions,
|
152
|
+
url,
|
153
|
+
}
|
154
|
+
socketClientCache.set(url, socketClient)
|
155
|
+
|
156
|
+
return [socketClient as {} as SocketRpcClient<socket>]
|
157
|
+
},
|
158
|
+
})
|
159
|
+
|
160
|
+
const [_, [socketClient_]] = await schedule()
|
161
|
+
return socketClient_
|
162
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import type { MessageEvent } from 'isows'
|
2
|
+
|
3
|
+
import { WebSocketRequestError } from '../../errors/request.js'
|
4
|
+
import {
|
5
|
+
type Socket,
|
6
|
+
type SocketRpcClient,
|
7
|
+
getSocketRpcClient,
|
8
|
+
} from './socket.js'
|
9
|
+
|
10
|
+
export async function getWebSocketRpcClient(
|
11
|
+
url: string,
|
12
|
+
): Promise<SocketRpcClient<WebSocket>> {
|
13
|
+
return getSocketRpcClient({
|
14
|
+
async getSocket({ onResponse }) {
|
15
|
+
const WebSocket = await import('isows').then((module) => module.WebSocket)
|
16
|
+
const socket = new WebSocket(url)
|
17
|
+
|
18
|
+
function onClose() {
|
19
|
+
socket.removeEventListener('close', onClose)
|
20
|
+
socket.removeEventListener('message', onMessage)
|
21
|
+
}
|
22
|
+
function onMessage({ data }: MessageEvent) {
|
23
|
+
onResponse(JSON.parse(data))
|
24
|
+
}
|
25
|
+
|
26
|
+
// Setup event listeners for RPC & subscription responses.
|
27
|
+
socket.addEventListener('close', onClose)
|
28
|
+
socket.addEventListener('message', onMessage)
|
29
|
+
|
30
|
+
// Wait for the socket to open.
|
31
|
+
if (socket.readyState === WebSocket.CONNECTING) {
|
32
|
+
await new Promise((resolve, reject) => {
|
33
|
+
if (!socket) return
|
34
|
+
socket.onopen = resolve
|
35
|
+
socket.onerror = reject
|
36
|
+
})
|
37
|
+
}
|
38
|
+
|
39
|
+
const { close: close_ } = socket
|
40
|
+
|
41
|
+
return Object.assign(socket, {
|
42
|
+
close() {
|
43
|
+
close_.bind(socket)()
|
44
|
+
onClose()
|
45
|
+
},
|
46
|
+
request({ body }) {
|
47
|
+
if (
|
48
|
+
socket.readyState === socket.CLOSED ||
|
49
|
+
socket.readyState === socket.CLOSING
|
50
|
+
)
|
51
|
+
throw new WebSocketRequestError({
|
52
|
+
body,
|
53
|
+
url: socket.url,
|
54
|
+
details: 'Socket is closed.',
|
55
|
+
})
|
56
|
+
|
57
|
+
return socket.send(JSON.stringify(body))
|
58
|
+
},
|
59
|
+
} as Socket<WebSocket>)
|
60
|
+
},
|
61
|
+
url,
|
62
|
+
})
|
63
|
+
}
|
package/_cjs/utils/rpc.js
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.rpc = exports.getSocket = exports.socketsCache = void 0;
|
4
|
-
const request_js_1 = require("../errors/request.js");
|
5
|
-
const createBatchScheduler_js_1 = require("./promise/createBatchScheduler.js");
|
6
|
-
const withTimeout_js_1 = require("./promise/withTimeout.js");
|
7
|
-
const stringify_js_1 = require("./stringify.js");
|
8
|
-
let id = 0;
|
9
|
-
async function http(url, { body, fetchOptions = {}, timeout = 10000 }) {
|
10
|
-
const { headers, method, signal: signal_ } = fetchOptions;
|
11
|
-
try {
|
12
|
-
const response = await (0, withTimeout_js_1.withTimeout)(async ({ signal }) => {
|
13
|
-
const response = await fetch(url, {
|
14
|
-
...fetchOptions,
|
15
|
-
body: Array.isArray(body)
|
16
|
-
? (0, stringify_js_1.stringify)(body.map((body) => ({
|
17
|
-
jsonrpc: '2.0',
|
18
|
-
id: body.id ?? id++,
|
19
|
-
...body,
|
20
|
-
})))
|
21
|
-
: (0, stringify_js_1.stringify)({ jsonrpc: '2.0', id: body.id ?? id++, ...body }),
|
22
|
-
headers: {
|
23
|
-
...headers,
|
24
|
-
'Content-Type': 'application/json',
|
25
|
-
},
|
26
|
-
method: method || 'POST',
|
27
|
-
signal: signal_ || (timeout > 0 ? signal : undefined),
|
28
|
-
});
|
29
|
-
return response;
|
30
|
-
}, {
|
31
|
-
errorInstance: new request_js_1.TimeoutError({ body, url }),
|
32
|
-
timeout,
|
33
|
-
signal: true,
|
34
|
-
});
|
35
|
-
let data;
|
36
|
-
if (response.headers.get('Content-Type')?.startsWith('application/json')) {
|
37
|
-
data = await response.json();
|
38
|
-
}
|
39
|
-
else {
|
40
|
-
data = await response.text();
|
41
|
-
}
|
42
|
-
if (!response.ok) {
|
43
|
-
throw new request_js_1.HttpRequestError({
|
44
|
-
body,
|
45
|
-
details: (0, stringify_js_1.stringify)(data.error) || response.statusText,
|
46
|
-
headers: response.headers,
|
47
|
-
status: response.status,
|
48
|
-
url,
|
49
|
-
});
|
50
|
-
}
|
51
|
-
return data;
|
52
|
-
}
|
53
|
-
catch (err) {
|
54
|
-
if (err instanceof request_js_1.HttpRequestError)
|
55
|
-
throw err;
|
56
|
-
if (err instanceof request_js_1.TimeoutError)
|
57
|
-
throw err;
|
58
|
-
throw new request_js_1.HttpRequestError({
|
59
|
-
body,
|
60
|
-
details: err.message,
|
61
|
-
url,
|
62
|
-
});
|
63
|
-
}
|
64
|
-
}
|
65
|
-
exports.socketsCache = new Map();
|
66
|
-
async function getSocket(url) {
|
67
|
-
let socket = exports.socketsCache.get(url);
|
68
|
-
if (socket)
|
69
|
-
return socket;
|
70
|
-
const { schedule } = (0, createBatchScheduler_js_1.createBatchScheduler)({
|
71
|
-
id: url,
|
72
|
-
fn: async () => {
|
73
|
-
const WebSocket = await Promise.resolve().then(() => require('isows')).then((module) => module.WebSocket);
|
74
|
-
const webSocket = new WebSocket(url);
|
75
|
-
const requests = new Map();
|
76
|
-
const subscriptions = new Map();
|
77
|
-
const onMessage = ({ data }) => {
|
78
|
-
const message = JSON.parse(data);
|
79
|
-
const isSubscription = message.method === 'eth_subscription';
|
80
|
-
const id = isSubscription ? message.params.subscription : message.id;
|
81
|
-
const cache = isSubscription ? subscriptions : requests;
|
82
|
-
const callback = cache.get(id);
|
83
|
-
if (callback)
|
84
|
-
callback({ data });
|
85
|
-
if (!isSubscription)
|
86
|
-
cache.delete(id);
|
87
|
-
};
|
88
|
-
const onClose = () => {
|
89
|
-
exports.socketsCache.delete(url);
|
90
|
-
webSocket.removeEventListener('close', onClose);
|
91
|
-
webSocket.removeEventListener('message', onMessage);
|
92
|
-
};
|
93
|
-
webSocket.addEventListener('close', onClose);
|
94
|
-
webSocket.addEventListener('message', onMessage);
|
95
|
-
if (webSocket.readyState === WebSocket.CONNECTING) {
|
96
|
-
await new Promise((resolve, reject) => {
|
97
|
-
if (!webSocket)
|
98
|
-
return;
|
99
|
-
webSocket.onopen = resolve;
|
100
|
-
webSocket.onerror = reject;
|
101
|
-
});
|
102
|
-
}
|
103
|
-
socket = Object.assign(webSocket, {
|
104
|
-
requests,
|
105
|
-
subscriptions,
|
106
|
-
});
|
107
|
-
exports.socketsCache.set(url, socket);
|
108
|
-
return [socket];
|
109
|
-
},
|
110
|
-
});
|
111
|
-
const [_, [socket_]] = await schedule();
|
112
|
-
return socket_;
|
113
|
-
}
|
114
|
-
exports.getSocket = getSocket;
|
115
|
-
function webSocket(socket, { body, onResponse }) {
|
116
|
-
if (socket.readyState === socket.CLOSED ||
|
117
|
-
socket.readyState === socket.CLOSING)
|
118
|
-
throw new request_js_1.WebSocketRequestError({
|
119
|
-
body,
|
120
|
-
url: socket.url,
|
121
|
-
details: 'Socket is closed.',
|
122
|
-
});
|
123
|
-
const id_ = id++;
|
124
|
-
const callback = ({ data }) => {
|
125
|
-
const message = JSON.parse(data);
|
126
|
-
if (typeof message.id === 'number' && id_ !== message.id)
|
127
|
-
return;
|
128
|
-
onResponse?.(message);
|
129
|
-
if (body.method === 'eth_subscribe' && typeof message.result === 'string') {
|
130
|
-
socket.subscriptions.set(message.result, callback);
|
131
|
-
}
|
132
|
-
if (body.method === 'eth_unsubscribe') {
|
133
|
-
socket.subscriptions.delete(body.params?.[0]);
|
134
|
-
}
|
135
|
-
};
|
136
|
-
socket.requests.set(id_, callback);
|
137
|
-
socket.send(JSON.stringify({ jsonrpc: '2.0', ...body, id: id_ }));
|
138
|
-
return socket;
|
139
|
-
}
|
140
|
-
async function webSocketAsync(socket, { body, timeout = 10000 }) {
|
141
|
-
return (0, withTimeout_js_1.withTimeout)(() => new Promise((onResponse) => exports.rpc.webSocket(socket, {
|
142
|
-
body,
|
143
|
-
onResponse,
|
144
|
-
})), {
|
145
|
-
errorInstance: new request_js_1.TimeoutError({ body, url: socket.url }),
|
146
|
-
timeout,
|
147
|
-
});
|
148
|
-
}
|
149
|
-
exports.rpc = {
|
150
|
-
http,
|
151
|
-
webSocket,
|
152
|
-
webSocketAsync,
|
153
|
-
};
|
154
|
-
//# sourceMappingURL=rpc.js.map
|
package/_cjs/utils/rpc.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../utils/rpc.ts"],"names":[],"mappings":"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"}
|
package/_esm/utils/rpc.js
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
import { HttpRequestError, TimeoutError, WebSocketRequestError, } from '../errors/request.js';
|
2
|
-
import { createBatchScheduler, } from './promise/createBatchScheduler.js';
|
3
|
-
import { withTimeout, } from './promise/withTimeout.js';
|
4
|
-
import { stringify } from './stringify.js';
|
5
|
-
let id = 0;
|
6
|
-
async function http(url, { body, fetchOptions = {}, timeout = 10000 }) {
|
7
|
-
const { headers, method, signal: signal_ } = fetchOptions;
|
8
|
-
try {
|
9
|
-
const response = await withTimeout(async ({ signal }) => {
|
10
|
-
const response = await fetch(url, {
|
11
|
-
...fetchOptions,
|
12
|
-
body: Array.isArray(body)
|
13
|
-
? stringify(body.map((body) => ({
|
14
|
-
jsonrpc: '2.0',
|
15
|
-
id: body.id ?? id++,
|
16
|
-
...body,
|
17
|
-
})))
|
18
|
-
: stringify({ jsonrpc: '2.0', id: body.id ?? id++, ...body }),
|
19
|
-
headers: {
|
20
|
-
...headers,
|
21
|
-
'Content-Type': 'application/json',
|
22
|
-
},
|
23
|
-
method: method || 'POST',
|
24
|
-
signal: signal_ || (timeout > 0 ? signal : undefined),
|
25
|
-
});
|
26
|
-
return response;
|
27
|
-
}, {
|
28
|
-
errorInstance: new TimeoutError({ body, url }),
|
29
|
-
timeout,
|
30
|
-
signal: true,
|
31
|
-
});
|
32
|
-
let data;
|
33
|
-
if (response.headers.get('Content-Type')?.startsWith('application/json')) {
|
34
|
-
data = await response.json();
|
35
|
-
}
|
36
|
-
else {
|
37
|
-
data = await response.text();
|
38
|
-
}
|
39
|
-
if (!response.ok) {
|
40
|
-
throw new HttpRequestError({
|
41
|
-
body,
|
42
|
-
details: stringify(data.error) || response.statusText,
|
43
|
-
headers: response.headers,
|
44
|
-
status: response.status,
|
45
|
-
url,
|
46
|
-
});
|
47
|
-
}
|
48
|
-
return data;
|
49
|
-
}
|
50
|
-
catch (err) {
|
51
|
-
if (err instanceof HttpRequestError)
|
52
|
-
throw err;
|
53
|
-
if (err instanceof TimeoutError)
|
54
|
-
throw err;
|
55
|
-
throw new HttpRequestError({
|
56
|
-
body,
|
57
|
-
details: err.message,
|
58
|
-
url,
|
59
|
-
});
|
60
|
-
}
|
61
|
-
}
|
62
|
-
export const socketsCache = /*#__PURE__*/ new Map();
|
63
|
-
export async function getSocket(url) {
|
64
|
-
let socket = socketsCache.get(url);
|
65
|
-
// If the socket already exists, return it.
|
66
|
-
if (socket)
|
67
|
-
return socket;
|
68
|
-
const { schedule } = createBatchScheduler({
|
69
|
-
id: url,
|
70
|
-
fn: async () => {
|
71
|
-
const WebSocket = await import('isows').then((module) => module.WebSocket);
|
72
|
-
const webSocket = new WebSocket(url);
|
73
|
-
// Set up a cache for incoming "synchronous" requests.
|
74
|
-
const requests = new Map();
|
75
|
-
// Set up a cache for subscriptions (eth_subscribe).
|
76
|
-
const subscriptions = new Map();
|
77
|
-
const onMessage = ({ data }) => {
|
78
|
-
const message = JSON.parse(data);
|
79
|
-
const isSubscription = message.method === 'eth_subscription';
|
80
|
-
const id = isSubscription ? message.params.subscription : message.id;
|
81
|
-
const cache = isSubscription ? subscriptions : requests;
|
82
|
-
const callback = cache.get(id);
|
83
|
-
if (callback)
|
84
|
-
callback({ data });
|
85
|
-
if (!isSubscription)
|
86
|
-
cache.delete(id);
|
87
|
-
};
|
88
|
-
const onClose = () => {
|
89
|
-
socketsCache.delete(url);
|
90
|
-
webSocket.removeEventListener('close', onClose);
|
91
|
-
webSocket.removeEventListener('message', onMessage);
|
92
|
-
};
|
93
|
-
// Setup event listeners for RPC & subscription responses.
|
94
|
-
webSocket.addEventListener('close', onClose);
|
95
|
-
webSocket.addEventListener('message', onMessage);
|
96
|
-
// Wait for the socket to open.
|
97
|
-
if (webSocket.readyState === WebSocket.CONNECTING) {
|
98
|
-
await new Promise((resolve, reject) => {
|
99
|
-
if (!webSocket)
|
100
|
-
return;
|
101
|
-
webSocket.onopen = resolve;
|
102
|
-
webSocket.onerror = reject;
|
103
|
-
});
|
104
|
-
}
|
105
|
-
// Create a new socket instance.
|
106
|
-
socket = Object.assign(webSocket, {
|
107
|
-
requests,
|
108
|
-
subscriptions,
|
109
|
-
});
|
110
|
-
socketsCache.set(url, socket);
|
111
|
-
return [socket];
|
112
|
-
},
|
113
|
-
});
|
114
|
-
const [_, [socket_]] = await schedule();
|
115
|
-
return socket_;
|
116
|
-
}
|
117
|
-
function webSocket(socket, { body, onResponse }) {
|
118
|
-
if (socket.readyState === socket.CLOSED ||
|
119
|
-
socket.readyState === socket.CLOSING)
|
120
|
-
throw new WebSocketRequestError({
|
121
|
-
body,
|
122
|
-
url: socket.url,
|
123
|
-
details: 'Socket is closed.',
|
124
|
-
});
|
125
|
-
const id_ = id++;
|
126
|
-
const callback = ({ data }) => {
|
127
|
-
const message = JSON.parse(data);
|
128
|
-
if (typeof message.id === 'number' && id_ !== message.id)
|
129
|
-
return;
|
130
|
-
onResponse?.(message);
|
131
|
-
// If we are subscribing to a topic, we want to set up a listener for incoming
|
132
|
-
// messages.
|
133
|
-
if (body.method === 'eth_subscribe' && typeof message.result === 'string') {
|
134
|
-
socket.subscriptions.set(message.result, callback);
|
135
|
-
}
|
136
|
-
// If we are unsubscribing from a topic, we want to remove the listener.
|
137
|
-
if (body.method === 'eth_unsubscribe') {
|
138
|
-
socket.subscriptions.delete(body.params?.[0]);
|
139
|
-
}
|
140
|
-
};
|
141
|
-
socket.requests.set(id_, callback);
|
142
|
-
socket.send(JSON.stringify({ jsonrpc: '2.0', ...body, id: id_ }));
|
143
|
-
return socket;
|
144
|
-
}
|
145
|
-
async function webSocketAsync(socket, { body, timeout = 10000 }) {
|
146
|
-
return withTimeout(() => new Promise((onResponse) => rpc.webSocket(socket, {
|
147
|
-
body,
|
148
|
-
onResponse,
|
149
|
-
})), {
|
150
|
-
errorInstance: new TimeoutError({ body, url: socket.url }),
|
151
|
-
timeout,
|
152
|
-
});
|
153
|
-
}
|
154
|
-
///////////////////////////////////////////////////
|
155
|
-
export const rpc = {
|
156
|
-
http,
|
157
|
-
webSocket,
|
158
|
-
webSocketAsync,
|
159
|
-
};
|
160
|
-
//# sourceMappingURL=rpc.js.map
|
package/_esm/utils/rpc.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../utils/rpc.ts"],"names":[],"mappings":"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"}
|