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.
Files changed (97) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/_cjs/clients/transports/http.js +8 -5
  3. package/_cjs/clients/transports/http.js.map +1 -1
  4. package/_cjs/clients/transports/ipc.js +77 -0
  5. package/_cjs/clients/transports/ipc.js.map +1 -0
  6. package/_cjs/clients/transports/webSocket.js +11 -7
  7. package/_cjs/clients/transports/webSocket.js.map +1 -1
  8. package/_cjs/errors/version.js +1 -1
  9. package/_cjs/node/index.js +8 -0
  10. package/_cjs/node/index.js.map +1 -0
  11. package/_cjs/utils/index.js +13 -6
  12. package/_cjs/utils/index.js.map +1 -1
  13. package/_cjs/utils/rpc/compat.js +35 -0
  14. package/_cjs/utils/rpc/compat.js.map +1 -0
  15. package/_cjs/utils/rpc/http.js +74 -0
  16. package/_cjs/utils/rpc/http.js.map +1 -0
  17. package/_cjs/utils/rpc/id.js +17 -0
  18. package/_cjs/utils/rpc/id.js.map +1 -0
  19. package/_cjs/utils/rpc/ipc.js +75 -0
  20. package/_cjs/utils/rpc/ipc.js.map +1 -0
  21. package/_cjs/utils/rpc/socket.js +85 -0
  22. package/_cjs/utils/rpc/socket.js.map +1 -0
  23. package/_cjs/utils/rpc/webSocket.js +50 -0
  24. package/_cjs/utils/rpc/webSocket.js.map +1 -0
  25. package/_esm/clients/transports/http.js +8 -5
  26. package/_esm/clients/transports/http.js.map +1 -1
  27. package/_esm/clients/transports/ipc.js +77 -0
  28. package/_esm/clients/transports/ipc.js.map +1 -0
  29. package/_esm/clients/transports/webSocket.js +10 -6
  30. package/_esm/clients/transports/webSocket.js.map +1 -1
  31. package/_esm/errors/version.js +1 -1
  32. package/_esm/node/index.js +3 -0
  33. package/_esm/node/index.js.map +1 -0
  34. package/_esm/utils/index.js +4 -1
  35. package/_esm/utils/index.js.map +1 -1
  36. package/_esm/utils/rpc/compat.js +86 -0
  37. package/_esm/utils/rpc/compat.js.map +1 -0
  38. package/_esm/utils/rpc/http.js +70 -0
  39. package/_esm/utils/rpc/http.js.map +1 -0
  40. package/_esm/utils/rpc/id.js +13 -0
  41. package/_esm/utils/rpc/id.js.map +1 -0
  42. package/_esm/utils/rpc/ipc.js +71 -0
  43. package/_esm/utils/rpc/ipc.js.map +1 -0
  44. package/_esm/utils/rpc/socket.js +90 -0
  45. package/_esm/utils/rpc/socket.js.map +1 -0
  46. package/_esm/utils/rpc/webSocket.js +48 -0
  47. package/_esm/utils/rpc/webSocket.js.map +1 -0
  48. package/_types/clients/transports/http.d.ts +2 -2
  49. package/_types/clients/transports/http.d.ts.map +1 -1
  50. package/_types/clients/transports/ipc.d.ts +46 -0
  51. package/_types/clients/transports/ipc.d.ts.map +1 -0
  52. package/_types/clients/transports/webSocket.d.ts +6 -1
  53. package/_types/clients/transports/webSocket.d.ts.map +1 -1
  54. package/_types/errors/version.d.ts +1 -1
  55. package/_types/node/index.d.ts +3 -0
  56. package/_types/node/index.d.ts.map +1 -0
  57. package/_types/types/rpc.d.ts +35 -0
  58. package/_types/types/rpc.d.ts.map +1 -1
  59. package/_types/utils/buildRequest.d.ts +2 -2
  60. package/_types/utils/buildRequest.d.ts.map +1 -1
  61. package/_types/utils/index.d.ts +4 -1
  62. package/_types/utils/index.d.ts.map +1 -1
  63. package/_types/utils/rpc/compat.d.ts +78 -0
  64. package/_types/utils/rpc/compat.d.ts.map +1 -0
  65. package/_types/utils/rpc/http.d.ts +20 -0
  66. package/_types/utils/rpc/http.d.ts.map +1 -0
  67. package/_types/utils/rpc/id.d.ts +11 -0
  68. package/_types/utils/rpc/id.d.ts.map +1 -0
  69. package/_types/utils/rpc/ipc.d.ts +8 -0
  70. package/_types/utils/rpc/ipc.d.ts.map +1 -0
  71. package/_types/utils/rpc/socket.d.ts +45 -0
  72. package/_types/utils/rpc/socket.d.ts.map +1 -0
  73. package/_types/utils/rpc/webSocket.d.ts +3 -0
  74. package/_types/utils/rpc/webSocket.d.ts.map +1 -0
  75. package/clients/transports/http.ts +15 -6
  76. package/clients/transports/ipc.ts +144 -0
  77. package/clients/transports/webSocket.ts +16 -6
  78. package/errors/version.ts +1 -1
  79. package/node/index.ts +11 -0
  80. package/node/package.json +6 -0
  81. package/package.json +9 -1
  82. package/types/rpc.ts +44 -0
  83. package/utils/buildRequest.ts +2 -2
  84. package/utils/index.ts +19 -8
  85. package/utils/rpc/compat.ts +117 -0
  86. package/utils/rpc/http.ts +132 -0
  87. package/utils/rpc/id.ts +13 -0
  88. package/utils/rpc/ipc.ts +89 -0
  89. package/utils/rpc/socket.ts +162 -0
  90. package/utils/rpc/webSocket.ts +63 -0
  91. package/_cjs/utils/rpc.js +0 -154
  92. package/_cjs/utils/rpc.js.map +0 -1
  93. package/_esm/utils/rpc.js +0 -160
  94. package/_esm/utils/rpc.js.map +0 -1
  95. package/_types/utils/rpc.d.ts +0 -80
  96. package/_types/utils/rpc.d.ts.map +0 -1
  97. package/utils/rpc.ts +0 -318
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../utils/rpc.ts"],"names":[],"mappings":";;;AAEA,qDAM6B;AAE7B,+EAG0C;AAC1C,6DAGiC;AACjC,iDAA0C;AAE1C,IAAI,EAAE,GAAG,CAAC,CAAA;AAgEV,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,EAAE,IAAI,EAAE,YAAY,GAAG,EAAE,EAAE,OAAO,GAAG,KAAM,EAAsB;IAEjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAA;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,4BAAW,EAChC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,GAAG,YAAY;gBACf,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvB,CAAC,CAAC,IAAA,wBAAS,EACP,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBAClB,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;wBACnB,GAAG,IAAI;qBACR,CAAC,CAAC,CACJ;oBACH,CAAC,CAAC,IAAA,wBAAS,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;gBAC/D,OAAO,EAAE;oBACP,GAAG,OAAO;oBACV,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,MAAM,IAAI,MAAM;gBACxB,MAAM,EAAE,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;aACtD,CAAC,CAAA;YACF,OAAO,QAAQ,CAAA;QACjB,CAAC,EACD;YACE,aAAa,EAAE,IAAI,yBAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC9C,OAAO;YACP,MAAM,EAAE,IAAI;SACb,CACF,CAAA;QAED,IAAI,IAAS,CAAA;QACb,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzE,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,6BAAgB,CAAC;gBACzB,IAAI;gBACJ,OAAO,EAAE,IAAA,wBAAS,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU;gBACrD,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG;aACJ,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAAgB;YAAE,MAAM,GAAG,CAAA;QAC9C,IAAI,GAAG,YAAY,yBAAY;YAAE,MAAM,GAAG,CAAA;QAC1C,MAAM,IAAI,6BAAgB,CAAC;YACzB,IAAI;YACJ,OAAO,EAAG,GAAa,CAAC,OAAO;YAC/B,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAgBY,QAAA,YAAY,GAAiB,IAAI,GAAG,EAAkB,CAAA;AAE5D,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAGlC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,8CAAoB,EAAsB;QAC7D,EAAE,EAAE,GAAG;QACP,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,MAAM,qCAAO,OAAO,GAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC1E,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;YAGpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;YAG1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;YAE/C,MAAM,SAAS,GAAkC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC5D,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;gBACvD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,KAAK,kBAAkB,CAAA;gBAC5D,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAA;gBACpE,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;gBACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9B,IAAI,QAAQ;oBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChC,IAAI,CAAC,cAAc;oBAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACvC,CAAC,CAAA;YACD,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,oBAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACxB,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC/C,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACrD,CAAC,CAAA;YAGD,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAGhD,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,SAAS;wBAAE,OAAM;oBACtB,SAAS,CAAC,MAAM,GAAG,OAAO,CAAA;oBAC1B,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;gBAC5B,CAAC,CAAC,CAAA;YACJ,CAAC;YAGD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;gBAChC,QAAQ;gBACR,aAAa;aACd,CAAC,CAAA;YACF,oBAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAE7B,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAA;IACvC,OAAO,OAAO,CAAA;AAChB,CAAC;AA3DD,8BA2DC;AAaD,SAAS,SAAS,CAChB,MAAc,EACd,EAAE,IAAI,EAAE,UAAU,EAAoB;IAEtC,IACE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM;QACnC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;QAEpC,MAAM,IAAI,kCAAqB,CAAC;YAC9B,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAA;IAEJ,MAAM,GAAG,GAAG,EAAE,EAAE,CAAA;IAEhB,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAiB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE7C,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,CAAC,EAAE;YAAE,OAAM;QAEhE,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;QAIrB,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACpD,CAAC;QAGD,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAElC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAEjE,OAAO,MAAM,CAAA;AACf,CAAC;AAiBD,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,EAAE,IAAI,EAAE,OAAO,GAAG,KAAM,EAAyB;IAEjD,OAAO,IAAA,4BAAW,EAChB,GAAG,EAAE,CACH,IAAI,OAAO,CAAc,CAAC,UAAU,EAAE,EAAE,CACtC,WAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,IAAI;QACJ,UAAU;KACX,CAAC,CACH,EACH;QACE,aAAa,EAAE,IAAI,yBAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO;KACR,CACF,CAAA;AACH,CAAC;AAIY,QAAA,GAAG,GAAG;IACjB,IAAI;IACJ,SAAS;IACT,cAAc;CACf,CAAA"}
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../utils/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAEhB,YAAY,EAEZ,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAEL,oBAAoB,GACrB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAEL,WAAW,GACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,IAAI,EAAE,GAAG,CAAC,CAAA;AAgEV,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,EAAE,IAAI,EAAE,YAAY,GAAG,EAAE,EAAE,OAAO,GAAG,KAAM,EAAsB;IAEjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAA;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,GAAG,YAAY;gBACf,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvB,CAAC,CAAC,SAAS,CACP,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBAClB,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;wBACnB,GAAG,IAAI;qBACR,CAAC,CAAC,CACJ;oBACH,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;gBAC/D,OAAO,EAAE;oBACP,GAAG,OAAO;oBACV,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,MAAM,IAAI,MAAM;gBACxB,MAAM,EAAE,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;aACtD,CAAC,CAAA;YACF,OAAO,QAAQ,CAAA;QACjB,CAAC,EACD;YACE,aAAa,EAAE,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC9C,OAAO;YACP,MAAM,EAAE,IAAI;SACb,CACF,CAAA;QAED,IAAI,IAAS,CAAA;QACb,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzE,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI;gBACJ,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU;gBACrD,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG;aACJ,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,gBAAgB;YAAE,MAAM,GAAG,CAAA;QAC9C,IAAI,GAAG,YAAY,YAAY;YAAE,MAAM,GAAG,CAAA;QAC1C,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI;YACJ,OAAO,EAAG,GAAa,CAAC,OAAO;YAC/B,GAAG;SACJ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAgBD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,EAAkB,CAAA;AAEnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAElC,2CAA2C;IAC3C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAsB;QAC7D,EAAE,EAAE,GAAG;QACP,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC1E,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;YAEpC,sDAAsD;YACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;YAE1C,oDAAoD;YACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;YAE/C,MAAM,SAAS,GAAkC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC5D,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;gBACvD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,KAAK,kBAAkB,CAAA;gBAC5D,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAA;gBACpE,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAA;gBACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9B,IAAI,QAAQ;oBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChC,IAAI,CAAC,cAAc;oBAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACvC,CAAC,CAAA;YACD,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACxB,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC/C,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACrD,CAAC,CAAA;YAED,0DAA0D;YAC1D,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAEhD,+BAA+B;YAC/B,IAAI,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAClD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,SAAS;wBAAE,OAAM;oBACtB,SAAS,CAAC,MAAM,GAAG,OAAO,CAAA;oBAC1B,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;gBAC5B,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,gCAAgC;YAChC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;gBAChC,QAAQ;gBACR,aAAa;aACd,CAAC,CAAA;YACF,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAE7B,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAA;IACvC,OAAO,OAAO,CAAA;AAChB,CAAC;AAaD,SAAS,SAAS,CAChB,MAAc,EACd,EAAE,IAAI,EAAE,UAAU,EAAoB;IAEtC,IACE,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM;QACnC,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;QAEpC,MAAM,IAAI,qBAAqB,CAAC;YAC9B,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAA;IAEJ,MAAM,GAAG,GAAG,EAAE,EAAE,CAAA;IAEhB,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAiB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE7C,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,CAAC,EAAE;YAAE,OAAM;QAEhE,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;QAErB,8EAA8E;QAC9E,YAAY;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1E,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACpD,CAAC;QAED,wEAAwE;QACxE,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAElC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAEjE,OAAO,MAAM,CAAA;AACf,CAAC;AAiBD,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,EAAE,IAAI,EAAE,OAAO,GAAG,KAAM,EAAyB;IAEjD,OAAO,WAAW,CAChB,GAAG,EAAE,CACH,IAAI,OAAO,CAAc,CAAC,UAAU,EAAE,EAAE,CACtC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,IAAI;QACJ,UAAU;KACX,CAAC,CACH,EACH;QACE,aAAa,EAAE,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO;KACR,CACF,CAAA;AACH,CAAC;AAED,mDAAmD;AAEnD,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI;IACJ,SAAS;IACT,cAAc;CACf,CAAA"}