@polkadot-api/json-rpc-provider-proxy 0.3.2-canary.d6be873 → 0.4.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.
@@ -2,4 +2,4 @@ let count = 0;
2
2
  const getOpaqueToken = () => `proxyOpaque${count++}`;
3
3
 
4
4
  export { getOpaqueToken };
5
- //# sourceMappingURL=get-opaque-token.mjs.map
5
+ //# sourceMappingURL=get-opaque-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-opaque-token.js","sources":["../src/get-opaque-token.ts"],"sourcesContent":["let count = 0\nexport const getOpaqueToken = (): string => `proxyOpaque${count++}`\n"],"names":[],"mappings":"AAAA,IAAI,KAAA,GAAQ,CAAA;AACL,MAAM,cAAA,GAAiB,MAAc,CAAA,WAAA,EAAc,KAAA,EAAO,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { isResponse } from '@polkadot-api/json-rpc-provider';
2
- import { getOpaqueToken } from './get-opaque-token.mjs';
3
- import { jsonRpcReq, jsonRpcRsp } from './json-rpc-message.mjs';
2
+ import { getOpaqueToken } from './get-opaque-token.js';
3
+ import { jsonRpcReq, jsonRpcRsp } from './json-rpc-message.js';
4
4
 
5
5
  const getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`;
6
6
  const getProxy = (toConsumer) => {
@@ -182,4 +182,4 @@ const getProxy = (toConsumer) => {
182
182
  };
183
183
 
184
184
  export { getProxy };
185
- //# sourceMappingURL=get-proxy.mjs.map
185
+ //# sourceMappingURL=get-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-proxy.js","sources":["../src/get-proxy.ts"],"sourcesContent":["import {\n isResponse,\n JsonRpcConnection,\n JsonRpcId,\n JsonRpcMessage,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { ReconnectableJsonRpcConnection } from \"./internal-types\"\nimport { getOpaqueToken } from \"./get-opaque-token\"\nimport { jsonRpcReq, jsonRpcRsp } from \"./json-rpc-message\"\n\nconst enum State {\n Connected,\n Connecting,\n Done,\n}\n\nconst enum OngoingMsgType {\n ChainHeadFollow,\n ChainHeadOperation,\n Other,\n}\ntype OngoingMsg =\n | {\n type: OngoingMsgType.ChainHeadFollow\n msg: JsonRpcRequest\n }\n | { type: OngoingMsgType.ChainHeadOperation; id: string }\n | { type: OngoingMsgType.Other; msg: JsonRpcRequest }\n\nconst getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`\n\nexport const getProxy: ReconnectableJsonRpcConnection = (\n toConsumer: (msg: JsonRpcMessage) => void,\n) => {\n let state:\n | {\n type: State.Connected\n connection: JsonRpcConnection\n activeChainHeads: Set<string>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n // the key is the upstream id, the value is the synthetic token\n pendingBroadcasts: Map<JsonRpcId, string>\n\n // These are requests for which their replies should be propagated downstream\n // Therefore, the `pendingBroadcasts` won't be included in here b/c they are synthetic\n onGoingRequests: Map<JsonRpcId, OngoingMsg>\n }\n | {\n type: State.Connecting\n pending: Array<JsonRpcRequest>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n }\n | { type: State.Done } = {\n type: State.Connecting,\n activeBroadcasts: new Map(),\n pending: [],\n }\n\n const onMsgFromProvider = (parsed: JsonRpcMessage) => {\n let isActive = true\n if (state.type === State.Connected) {\n if (isResponse(parsed)) {\n const { id } = parsed\n const synToken = state.pendingBroadcasts.get(id)\n if (synToken) {\n state.pendingBroadcasts.delete(id)\n\n // it's guaranteed to be there b/c we control it\n if (!(\"result\" in parsed)) return\n\n const upToken = parsed.result\n const activeBroadcast = state.activeBroadcasts.get(synToken)\n\n if (activeBroadcast) activeBroadcast.upToken = upToken\n else\n // The consumer stopped before we got the response\n state.connection.send(\n jsonRpcReq({\n id: getInternalId(),\n method: \"transaction_v1_stop\",\n params: [upToken],\n }),\n )\n return\n }\n\n isActive = state.onGoingRequests.has(id)\n if (\n \"result\" in parsed &&\n state.onGoingRequests.get(id)?.type === OngoingMsgType.ChainHeadFollow\n )\n state.activeChainHeads.add(parsed.result)\n state.onGoingRequests.delete(parsed.id)\n } else if (\"params\" in parsed) {\n const { subscription, result } = parsed.params\n if (result?.event === \"stop\")\n state.activeChainHeads.delete(subscription)\n }\n }\n // If the state is \"Connecting\", then these are messages\n // sent from the `onHalt` function. So, we mus realy them\n if (isActive && state.type !== State.Done) toConsumer(parsed)\n }\n\n const send = (msg: JsonRpcRequest) => {\n if (state.type === State.Done) return\n\n // Transaction methods are purely synthetic, so they must be handled separately\n if (\"id\" in msg) {\n const { method, id, params } = msg as {\n method: string\n id: string\n params: string[]\n }\n const [group, , methodName] = method.split(\"_\")\n\n if (group === \"transaction\") {\n if (methodName === \"stop\") {\n const [synToken] = params\n const active = state.activeBroadcasts.get(synToken)\n state.activeBroadcasts.delete(synToken)\n toConsumer(\n jsonRpcRsp({\n id,\n result: null,\n }),\n )\n\n if (state.type === State.Connected && active && active.upToken) {\n // The response from this request will be ignored later on\n // because it won't be among the ongoing requests. so, it won't get to downstream\n state.connection.send(\n jsonRpcReq({\n id,\n method,\n params: [active.upToken],\n }),\n )\n }\n\n // prevents the request from being included into the ongoingRequests\n return\n }\n\n if (methodName === \"broadcast\") {\n const synToken = getOpaqueToken()\n state.activeBroadcasts.set(synToken, {\n tx: params[0],\n synToken,\n })\n\n if (state.type === State.Connected) {\n state.pendingBroadcasts.set(id, synToken)\n state.connection.send(msg)\n }\n\n toConsumer(\n jsonRpcRsp({\n id,\n result: synToken,\n }),\n )\n\n // prevents the request to be tracked with the ongoingRequests\n return\n }\n }\n }\n\n if (state.type === State.Connecting) {\n state.pending.push(msg)\n return\n }\n if (msg.method === \"chainHead_v1_unfollow\")\n state.activeChainHeads.delete(msg.params[0])\n\n if (\"id\" in msg) {\n const { method, id } = msg as { method: string; id: string }\n const [group, , methodName] = method.split(\"_\")\n\n const ongoingMsg: OngoingMsg =\n group === \"chainHead\"\n ? methodName === \"follow\"\n ? {\n type: OngoingMsgType.ChainHeadFollow,\n msg,\n }\n : { type: OngoingMsgType.ChainHeadOperation, id }\n : { type: OngoingMsgType.Other, msg }\n state.onGoingRequests.set(id, ongoingMsg)\n }\n\n state.connection.send(msg)\n }\n\n return {\n send,\n disconnect: () => {\n if (state.type === State.Done) return\n if (state.type === State.Connected) state.connection.disconnect()\n state = { type: State.Done }\n },\n connect: (cb) => {\n if (state.type !== State.Connecting) throw new Error(\"Nonesense\")\n\n const { pending, activeBroadcasts } = state\n const onGoingRequests = new Map<string, OngoingMsg>()\n const activeChainHeads = new Set<string>()\n const onHalt = () => {\n const activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n > = state.type !== State.Done ? state.activeBroadcasts : new Map()\n activeBroadcasts.forEach((x) => (x.upToken = undefined))\n state = {\n type: State.Connecting,\n activeBroadcasts,\n pending: [],\n }\n activeChainHeads.forEach((subscription) => {\n // We don't send the messages directy to the consumer\n // b/c they could have disconnected after receiving one\n // of these messages. The `onMsgFromProvider` fn handles that\n onMsgFromProvider(\n jsonRpcReq({\n method: \"chainHead_v1_follow\",\n params: {\n subscription,\n result: {\n event: \"stop\",\n internal: true,\n },\n },\n }),\n )\n })\n activeChainHeads.clear()\n for (const x of onGoingRequests.values()) {\n if (x.type === OngoingMsgType.ChainHeadOperation)\n onMsgFromProvider(\n jsonRpcRsp({\n id: x.id,\n error: { code: -32603, message: \"Internal error\" },\n }),\n )\n else send(x.msg)\n }\n onGoingRequests.clear()\n }\n state = {\n type: State.Connected,\n connection: null as any,\n activeBroadcasts,\n pendingBroadcasts: new Map(),\n onGoingRequests,\n activeChainHeads,\n }\n state.connection = cb(onMsgFromProvider, onHalt)\n activeBroadcasts.forEach((broadcast) => {\n if (state.type === State.Connected) {\n const id = getInternalId()\n state.pendingBroadcasts.set(id, broadcast.synToken)\n state.connection.send(\n jsonRpcReq({\n id,\n method: \"transaction_v1_broadcast\",\n params: [broadcast.tx],\n }),\n )\n }\n })\n pending.forEach(send)\n },\n }\n}\n"],"names":["activeBroadcasts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getProxy } from './get-proxy.mjs';
1
+ import { getProxy } from './get-proxy.js';
2
2
 
3
3
  const noop = () => {
4
4
  };
@@ -55,4 +55,4 @@ const getSyncProvider = (input) => (onMessage) => {
55
55
  };
56
56
 
57
57
  export { getSyncProvider };
58
- //# sourceMappingURL=get-sync-provider.mjs.map
58
+ //# sourceMappingURL=get-sync-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-sync-provider.js","sources":["../src/get-sync-provider.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getProxy } from \"./get-proxy\"\nimport { InnerJsonRpcProvider } from \"./public-types\"\nimport { ConnectableJsonRpcConnection } from \"./internal-types\"\n\nconst noop = () => {}\nconst WAIT_BASE = 250\n\nexport const getSyncProvider =\n (\n input: (onResult: (x: InnerJsonRpcProvider | null) => void) => () => void,\n ): JsonRpcProvider =>\n (onMessage) => {\n let proxy: ConnectableJsonRpcConnection | null = getProxy(onMessage)\n let lastHalt = Date.now()\n let consecutiveHalts = 0\n let token: any\n const getWaitTime = () =>\n consecutiveHalts && 2 ** Math.min(5, consecutiveHalts) * WAIT_BASE\n\n let stop = noop\n let startNow = () => {\n const token = setTimeout(() => {\n let isWaiting = true\n const result = input((cb) => {\n isWaiting = false\n stop = noop\n if (!cb) start()\n else if (proxy)\n proxy.connect((onMsg, onHalt) => {\n let isOn = true\n return cb(onMsg, (e) => {\n if (isOn) {\n isOn = false\n const diff = Date.now() - lastHalt\n consecutiveHalts +=\n diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1\n lastHalt += diff\n onHalt(e)\n start()\n }\n })\n })\n })\n if (isWaiting) stop = result\n }, 0)\n stop = () => clearTimeout(token)\n }\n\n const start = () => {\n token = setTimeout(startNow, getWaitTime())\n }\n startNow()\n\n return {\n send(msg) {\n proxy?.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n stop()\n stop = noop\n proxy?.disconnect()\n proxy = null\n },\n }\n }\n"],"names":["token"],"mappings":";;AAKA,MAAM,OAAO,MAAM;AAAC,CAAA;AACpB,MAAM,SAAA,GAAY,GAAA;AAEX,MAAM,eAAA,GACX,CACE,KAAA,KAEF,CAAC,SAAA,KAAc;AACb,EAAA,IAAI,KAAA,GAA6C,SAAS,SAAS,CAAA;AACnE,EAAA,IAAI,QAAA,GAAW,KAAK,GAAA,EAAI;AACxB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,WAAA,GAAc,MAClB,gBAAA,IAAoB,CAAA,IAAK,KAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAA,GAAI,SAAA;AAE3D,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,WAAW,MAAM;AACnB,IAAA,MAAMA,MAAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAI,SAAA,GAAY,IAAA;AAChB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,EAAA,KAAO;AAC3B,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,IAAI,CAAC,IAAI,KAAA,EAAM;AAAA,aAAA,IACN,KAAA;AACP,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAA,EAAO,MAAA,KAAW;AAC/B,YAAA,IAAI,IAAA,GAAO,IAAA;AACX,YAAA,OAAO,EAAA,CAAG,KAAA,EAAO,CAAC,CAAA,KAAM;AACtB,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,IAAA,GAAO,KAAA;AACP,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAC1B,gBAAA,gBAAA,IACE,IAAA,GAAO,SAAA,GAAY,WAAA,EAAY,GAAI,CAAC,gBAAA,GAAmB,CAAA;AACzD,gBAAA,QAAA,IAAY,IAAA;AACZ,gBAAA,MAAA,CAAO,CAAC,CAAA;AACR,gBAAA,KAAA,EAAM;AAAA,cACR;AAAA,YACF,CAAC,CAAA;AAAA,UACH,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AACD,MAAA,IAAI,WAAW,IAAA,GAAO,MAAA;AAAA,IACxB,GAAG,CAAC,CAAA;AACJ,IAAA,IAAA,GAAO,MAAM,aAAaA,MAAK,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,GAAQ,UAAA,CAAW,QAAA,EAAU,WAAA,EAAa,CAAA;AAAA,EAC5C,CAAA;AACA,EAAA,QAAA,EAAS;AAET,EAAA,OAAO;AAAA,IACL,KAAK,GAAA,EAAK;AACR,MAAA,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,UAAA,GAAa;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,EAAK;AACL,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,KAAA,EAAO,UAAA,EAAW;AAClB,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,GACF;AACF;;;;"}
package/dist/index.js CHANGED
@@ -1,251 +1,2 @@
1
- 'use strict';
2
-
3
- var jsonRpcProvider = require('@polkadot-api/json-rpc-provider');
4
-
5
- let count = 0;
6
- const getOpaqueToken = () => `proxyOpaque${count++}`;
7
-
8
- const jsonRpcReq = (msg) => ({
9
- jsonrpc: "2.0",
10
- ...msg
11
- });
12
- const jsonRpcRsp = (msg) => ({
13
- jsonrpc: "2.0",
14
- ...msg
15
- });
16
-
17
- const getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`;
18
- const getProxy = (toConsumer) => {
19
- let state = {
20
- type: 1 /* Connecting */,
21
- activeBroadcasts: /* @__PURE__ */ new Map(),
22
- pending: []
23
- };
24
- const onMsgFromProvider = (parsed) => {
25
- let isActive = true;
26
- if (state.type === 0 /* Connected */) {
27
- if (jsonRpcProvider.isResponse(parsed)) {
28
- const { id } = parsed;
29
- const synToken = state.pendingBroadcasts.get(id);
30
- if (synToken) {
31
- state.pendingBroadcasts.delete(id);
32
- if (!("result" in parsed)) return;
33
- const upToken = parsed.result;
34
- const activeBroadcast = state.activeBroadcasts.get(synToken);
35
- if (activeBroadcast) activeBroadcast.upToken = upToken;
36
- else
37
- state.connection.send(
38
- jsonRpcReq({
39
- id: getInternalId(),
40
- method: "transaction_v1_stop",
41
- params: [upToken]
42
- })
43
- );
44
- return;
45
- }
46
- isActive = state.onGoingRequests.has(id);
47
- if ("result" in parsed && state.onGoingRequests.get(id)?.type === 0 /* ChainHeadFollow */)
48
- state.activeChainHeads.add(parsed.result);
49
- state.onGoingRequests.delete(parsed.id);
50
- } else if ("params" in parsed) {
51
- const { subscription, result } = parsed.params;
52
- if (result?.event === "stop")
53
- state.activeChainHeads.delete(subscription);
54
- }
55
- }
56
- if (isActive && state.type !== 2 /* Done */) toConsumer(parsed);
57
- };
58
- const send = (msg) => {
59
- if (state.type === 2 /* Done */) return;
60
- if ("id" in msg) {
61
- const { method, id, params } = msg;
62
- const [group, , methodName] = method.split("_");
63
- if (group === "transaction") {
64
- if (methodName === "stop") {
65
- const [synToken] = params;
66
- const active = state.activeBroadcasts.get(synToken);
67
- state.activeBroadcasts.delete(synToken);
68
- toConsumer(
69
- jsonRpcRsp({
70
- id,
71
- result: null
72
- })
73
- );
74
- if (state.type === 0 /* Connected */ && active && active.upToken) {
75
- state.connection.send(
76
- jsonRpcReq({
77
- id,
78
- method,
79
- params: [active.upToken]
80
- })
81
- );
82
- }
83
- return;
84
- }
85
- if (methodName === "broadcast") {
86
- const synToken = getOpaqueToken();
87
- state.activeBroadcasts.set(synToken, {
88
- tx: params[0],
89
- synToken
90
- });
91
- if (state.type === 0 /* Connected */) {
92
- state.pendingBroadcasts.set(id, synToken);
93
- state.connection.send(msg);
94
- }
95
- toConsumer(
96
- jsonRpcRsp({
97
- id,
98
- result: synToken
99
- })
100
- );
101
- return;
102
- }
103
- }
104
- }
105
- if (state.type === 1 /* Connecting */) {
106
- state.pending.push(msg);
107
- return;
108
- }
109
- if (msg.method === "chainHead_v1_unfollow")
110
- state.activeChainHeads.delete(msg.params[0]);
111
- if ("id" in msg) {
112
- const { method, id } = msg;
113
- const [group, , methodName] = method.split("_");
114
- const ongoingMsg = group === "chainHead" ? methodName === "follow" ? {
115
- type: 0 /* ChainHeadFollow */,
116
- msg
117
- } : { type: 1 /* ChainHeadOperation */, id } : { type: 2 /* Other */, msg };
118
- state.onGoingRequests.set(id, ongoingMsg);
119
- }
120
- state.connection.send(msg);
121
- };
122
- return {
123
- send,
124
- disconnect: () => {
125
- if (state.type === 2 /* Done */) return;
126
- if (state.type === 0 /* Connected */) state.connection.disconnect();
127
- state = { type: 2 /* Done */ };
128
- },
129
- connect: (cb) => {
130
- if (state.type !== 1 /* Connecting */) throw new Error("Nonesense");
131
- const { pending, activeBroadcasts } = state;
132
- const onGoingRequests = /* @__PURE__ */ new Map();
133
- const activeChainHeads = /* @__PURE__ */ new Set();
134
- const onHalt = () => {
135
- const activeBroadcasts2 = state.type !== 2 /* Done */ ? state.activeBroadcasts : /* @__PURE__ */ new Map();
136
- activeBroadcasts2.forEach((x) => x.upToken = void 0);
137
- state = {
138
- type: 1 /* Connecting */,
139
- activeBroadcasts: activeBroadcasts2,
140
- pending: []
141
- };
142
- activeChainHeads.forEach((subscription) => {
143
- onMsgFromProvider(
144
- jsonRpcReq({
145
- method: "chainHead_v1_follow",
146
- params: {
147
- subscription,
148
- result: {
149
- event: "stop",
150
- internal: true
151
- }
152
- }
153
- })
154
- );
155
- });
156
- activeChainHeads.clear();
157
- for (const x of onGoingRequests.values()) {
158
- if (x.type === 1 /* ChainHeadOperation */)
159
- onMsgFromProvider(
160
- jsonRpcRsp({
161
- id: x.id,
162
- error: { code: -32603, message: "Internal error" }
163
- })
164
- );
165
- else send(x.msg);
166
- }
167
- onGoingRequests.clear();
168
- };
169
- state = {
170
- type: 0 /* Connected */,
171
- connection: null,
172
- activeBroadcasts,
173
- pendingBroadcasts: /* @__PURE__ */ new Map(),
174
- onGoingRequests,
175
- activeChainHeads
176
- };
177
- state.connection = cb(onMsgFromProvider, onHalt);
178
- activeBroadcasts.forEach((broadcast) => {
179
- if (state.type === 0 /* Connected */) {
180
- const id = getInternalId();
181
- state.pendingBroadcasts.set(id, broadcast.synToken);
182
- state.connection.send(
183
- jsonRpcReq({
184
- id,
185
- method: "transaction_v1_broadcast",
186
- params: [broadcast.tx]
187
- })
188
- );
189
- }
190
- });
191
- pending.forEach(send);
192
- }
193
- };
194
- };
195
-
196
- const noop = () => {
197
- };
198
- const WAIT_BASE = 250;
199
- const getSyncProvider = (input) => (onMessage) => {
200
- let proxy = getProxy(onMessage);
201
- let lastHalt = Date.now();
202
- let consecutiveHalts = 0;
203
- let token;
204
- const getWaitTime = () => consecutiveHalts && 2 ** Math.min(5, consecutiveHalts) * WAIT_BASE;
205
- let stop = noop;
206
- let startNow = () => {
207
- const token2 = setTimeout(() => {
208
- let isWaiting = true;
209
- const result = input((cb) => {
210
- isWaiting = false;
211
- stop = noop;
212
- if (!cb) start();
213
- else if (proxy)
214
- proxy.connect((onMsg, onHalt) => {
215
- let isOn = true;
216
- return cb(onMsg, (e) => {
217
- if (isOn) {
218
- isOn = false;
219
- const diff = Date.now() - lastHalt;
220
- consecutiveHalts += diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1;
221
- lastHalt += diff;
222
- onHalt(e);
223
- start();
224
- }
225
- });
226
- });
227
- });
228
- if (isWaiting) stop = result;
229
- }, 0);
230
- stop = () => clearTimeout(token2);
231
- };
232
- const start = () => {
233
- token = setTimeout(startNow, getWaitTime());
234
- };
235
- startNow();
236
- return {
237
- send(msg) {
238
- proxy?.send(msg);
239
- },
240
- disconnect() {
241
- clearTimeout(token);
242
- stop();
243
- stop = noop;
244
- proxy?.disconnect();
245
- proxy = null;
246
- }
247
- };
248
- };
249
-
250
- exports.getSyncProvider = getSyncProvider;
1
+ export { getSyncProvider } from './get-sync-provider.js';
251
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/get-opaque-token.ts","../src/json-rpc-message.ts","../src/get-proxy.ts","../src/get-sync-provider.ts"],"sourcesContent":["let count = 0\nexport const getOpaqueToken = (): string => `proxyOpaque${count++}`\n","import {\n JsonRpcError,\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"@polkadot-api/json-rpc-provider\"\n\nexport const jsonRpcReq = (\n msg: Omit<JsonRpcRequest, \"jsonrpc\">,\n): JsonRpcRequest => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n\nexport const jsonRpcRsp = <T = any>(\n msg: { id: JsonRpcId } & (\n | {\n result: T\n }\n | {\n error: JsonRpcError<T>\n }\n ),\n): JsonRpcResponse => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n","import {\n isResponse,\n JsonRpcConnection,\n JsonRpcId,\n JsonRpcMessage,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { ReconnectableJsonRpcConnection } from \"./internal-types\"\nimport { getOpaqueToken } from \"./get-opaque-token\"\nimport { jsonRpcReq, jsonRpcRsp } from \"./json-rpc-message\"\n\nconst enum State {\n Connected,\n Connecting,\n Done,\n}\n\nconst enum OngoingMsgType {\n ChainHeadFollow,\n ChainHeadOperation,\n Other,\n}\ntype OngoingMsg =\n | {\n type: OngoingMsgType.ChainHeadFollow\n msg: JsonRpcRequest\n }\n | { type: OngoingMsgType.ChainHeadOperation; id: string }\n | { type: OngoingMsgType.Other; msg: JsonRpcRequest }\n\nconst getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`\n\nexport const getProxy: ReconnectableJsonRpcConnection = (\n toConsumer: (msg: JsonRpcMessage) => void,\n) => {\n let state:\n | {\n type: State.Connected\n connection: JsonRpcConnection\n activeChainHeads: Set<string>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n // the key is the upstream id, the value is the synthetic token\n pendingBroadcasts: Map<JsonRpcId, string>\n\n // These are requests for which their replies should be propagated downstream\n // Therefore, the `pendingBroadcasts` won't be included in here b/c they are synthetic\n onGoingRequests: Map<JsonRpcId, OngoingMsg>\n }\n | {\n type: State.Connecting\n pending: Array<JsonRpcRequest>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n }\n | { type: State.Done } = {\n type: State.Connecting,\n activeBroadcasts: new Map(),\n pending: [],\n }\n\n const onMsgFromProvider = (parsed: JsonRpcMessage) => {\n let isActive = true\n if (state.type === State.Connected) {\n if (isResponse(parsed)) {\n const { id } = parsed\n const synToken = state.pendingBroadcasts.get(id)\n if (synToken) {\n state.pendingBroadcasts.delete(id)\n\n // it's guaranteed to be there b/c we control it\n if (!(\"result\" in parsed)) return\n\n const upToken = parsed.result\n const activeBroadcast = state.activeBroadcasts.get(synToken)\n\n if (activeBroadcast) activeBroadcast.upToken = upToken\n else\n // The consumer stopped before we got the response\n state.connection.send(\n jsonRpcReq({\n id: getInternalId(),\n method: \"transaction_v1_stop\",\n params: [upToken],\n }),\n )\n return\n }\n\n isActive = state.onGoingRequests.has(id)\n if (\n \"result\" in parsed &&\n state.onGoingRequests.get(id)?.type === OngoingMsgType.ChainHeadFollow\n )\n state.activeChainHeads.add(parsed.result)\n state.onGoingRequests.delete(parsed.id)\n } else if (\"params\" in parsed) {\n const { subscription, result } = parsed.params\n if (result?.event === \"stop\")\n state.activeChainHeads.delete(subscription)\n }\n }\n // If the state is \"Connecting\", then these are messages\n // sent from the `onHalt` function. So, we mus realy them\n if (isActive && state.type !== State.Done) toConsumer(parsed)\n }\n\n const send = (msg: JsonRpcRequest) => {\n if (state.type === State.Done) return\n\n // Transaction methods are purely synthetic, so they must be handled separately\n if (\"id\" in msg) {\n const { method, id, params } = msg as {\n method: string\n id: string\n params: string[]\n }\n const [group, , methodName] = method.split(\"_\")\n\n if (group === \"transaction\") {\n if (methodName === \"stop\") {\n const [synToken] = params\n const active = state.activeBroadcasts.get(synToken)\n state.activeBroadcasts.delete(synToken)\n toConsumer(\n jsonRpcRsp({\n id,\n result: null,\n }),\n )\n\n if (state.type === State.Connected && active && active.upToken) {\n // The response from this request will be ignored later on\n // because it won't be among the ongoing requests. so, it won't get to downstream\n state.connection.send(\n jsonRpcReq({\n id,\n method,\n params: [active.upToken],\n }),\n )\n }\n\n // prevents the request from being included into the ongoingRequests\n return\n }\n\n if (methodName === \"broadcast\") {\n const synToken = getOpaqueToken()\n state.activeBroadcasts.set(synToken, {\n tx: params[0],\n synToken,\n })\n\n if (state.type === State.Connected) {\n state.pendingBroadcasts.set(id, synToken)\n state.connection.send(msg)\n }\n\n toConsumer(\n jsonRpcRsp({\n id,\n result: synToken,\n }),\n )\n\n // prevents the request to be tracked with the ongoingRequests\n return\n }\n }\n }\n\n if (state.type === State.Connecting) {\n state.pending.push(msg)\n return\n }\n if (msg.method === \"chainHead_v1_unfollow\")\n state.activeChainHeads.delete(msg.params[0])\n\n if (\"id\" in msg) {\n const { method, id } = msg as { method: string; id: string }\n const [group, , methodName] = method.split(\"_\")\n\n const ongoingMsg: OngoingMsg =\n group === \"chainHead\"\n ? methodName === \"follow\"\n ? {\n type: OngoingMsgType.ChainHeadFollow,\n msg,\n }\n : { type: OngoingMsgType.ChainHeadOperation, id }\n : { type: OngoingMsgType.Other, msg }\n state.onGoingRequests.set(id, ongoingMsg)\n }\n\n state.connection.send(msg)\n }\n\n return {\n send,\n disconnect: () => {\n if (state.type === State.Done) return\n if (state.type === State.Connected) state.connection.disconnect()\n state = { type: State.Done }\n },\n connect: (cb) => {\n if (state.type !== State.Connecting) throw new Error(\"Nonesense\")\n\n const { pending, activeBroadcasts } = state\n const onGoingRequests = new Map<string, OngoingMsg>()\n const activeChainHeads = new Set<string>()\n const onHalt = () => {\n const activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n > = state.type !== State.Done ? state.activeBroadcasts : new Map()\n activeBroadcasts.forEach((x) => (x.upToken = undefined))\n state = {\n type: State.Connecting,\n activeBroadcasts,\n pending: [],\n }\n activeChainHeads.forEach((subscription) => {\n // We don't send the messages directy to the consumer\n // b/c they could have disconnected after receiving one\n // of these messages. The `onMsgFromProvider` fn handles that\n onMsgFromProvider(\n jsonRpcReq({\n method: \"chainHead_v1_follow\",\n params: {\n subscription,\n result: {\n event: \"stop\",\n internal: true,\n },\n },\n }),\n )\n })\n activeChainHeads.clear()\n for (const x of onGoingRequests.values()) {\n if (x.type === OngoingMsgType.ChainHeadOperation)\n onMsgFromProvider(\n jsonRpcRsp({\n id: x.id,\n error: { code: -32603, message: \"Internal error\" },\n }),\n )\n else send(x.msg)\n }\n onGoingRequests.clear()\n }\n state = {\n type: State.Connected,\n connection: null as any,\n activeBroadcasts,\n pendingBroadcasts: new Map(),\n onGoingRequests,\n activeChainHeads,\n }\n state.connection = cb(onMsgFromProvider, onHalt)\n activeBroadcasts.forEach((broadcast) => {\n if (state.type === State.Connected) {\n const id = getInternalId()\n state.pendingBroadcasts.set(id, broadcast.synToken)\n state.connection.send(\n jsonRpcReq({\n id,\n method: \"transaction_v1_broadcast\",\n params: [broadcast.tx],\n }),\n )\n }\n })\n pending.forEach(send)\n },\n }\n}\n","import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getProxy } from \"./get-proxy\"\nimport { InnerJsonRpcProvider } from \"./public-types\"\nimport { ConnectableJsonRpcConnection } from \"./internal-types\"\n\nconst noop = () => {}\nconst WAIT_BASE = 250\n\nexport const getSyncProvider =\n (\n input: (onResult: (x: InnerJsonRpcProvider | null) => void) => () => void,\n ): JsonRpcProvider =>\n (onMessage) => {\n let proxy: ConnectableJsonRpcConnection | null = getProxy(onMessage)\n let lastHalt = Date.now()\n let consecutiveHalts = 0\n let token: any\n const getWaitTime = () =>\n consecutiveHalts && 2 ** Math.min(5, consecutiveHalts) * WAIT_BASE\n\n let stop = noop\n let startNow = () => {\n const token = setTimeout(() => {\n let isWaiting = true\n const result = input((cb) => {\n isWaiting = false\n stop = noop\n if (!cb) start()\n else if (proxy)\n proxy.connect((onMsg, onHalt) => {\n let isOn = true\n return cb(onMsg, (e) => {\n if (isOn) {\n isOn = false\n const diff = Date.now() - lastHalt\n consecutiveHalts +=\n diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1\n lastHalt += diff\n onHalt(e)\n start()\n }\n })\n })\n })\n if (isWaiting) stop = result\n }, 0)\n stop = () => clearTimeout(token)\n }\n\n const start = () => {\n token = setTimeout(startNow, getWaitTime())\n }\n startNow()\n\n return {\n send(msg) {\n proxy?.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n stop()\n stop = noop\n proxy?.disconnect()\n proxy = null\n },\n }\n }\n"],"names":["isResponse","activeBroadcasts","token"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -8,4 +8,4 @@ const jsonRpcRsp = (msg) => ({
8
8
  });
9
9
 
10
10
  export { jsonRpcReq, jsonRpcRsp };
11
- //# sourceMappingURL=json-rpc-message.mjs.map
11
+ //# sourceMappingURL=json-rpc-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc-message.js","sources":["../src/json-rpc-message.ts"],"sourcesContent":["import {\n JsonRpcError,\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"@polkadot-api/json-rpc-provider\"\n\nexport const jsonRpcReq = (\n msg: Omit<JsonRpcRequest, \"jsonrpc\">,\n): JsonRpcRequest => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n\nexport const jsonRpcRsp = <T = any>(\n msg: { id: JsonRpcId } & (\n | {\n result: T\n }\n | {\n error: JsonRpcError<T>\n }\n ),\n): JsonRpcResponse => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n"],"names":[],"mappings":"AAOO,MAAM,UAAA,GAAa,CACxB,GAAA,MACoB;AAAA,EACpB,OAAA,EAAS,KAAA;AAAA,EACT,GAAG;AACL,CAAA;AAEO,MAAM,UAAA,GAAa,CACxB,GAAA,MAQqB;AAAA,EACrB,OAAA,EAAS,KAAA;AAAA,EACT,GAAG;AACL,CAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/json-rpc-provider-proxy",
3
- "version": "0.3.2-canary.d6be873",
3
+ "version": "0.4.0",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,34 +8,24 @@
8
8
  },
9
9
  "license": "MIT",
10
10
  "sideEffects": false,
11
+ "type": "module",
11
12
  "exports": {
12
13
  ".": {
13
- "node": {
14
- "production": {
15
- "import": "./dist/esm/index.mjs",
16
- "require": "./dist/min/index.js",
17
- "default": "./dist/index.js"
18
- },
19
- "import": "./dist/esm/index.mjs",
20
- "require": "./dist/index.js",
21
- "default": "./dist/index.js"
22
- },
23
- "module": "./dist/esm/index.mjs",
24
- "import": "./dist/esm/index.mjs",
25
- "require": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "module": "./dist/index.js",
16
+ "import": "./dist/index.js",
26
17
  "default": "./dist/index.js"
27
- },
28
- "./package.json": "./package.json"
18
+ }
29
19
  },
30
20
  "main": "./dist/index.js",
31
- "module": "./dist/esm/index.mjs",
32
- "browser": "./dist/esm/index.mjs",
21
+ "module": "./dist/index.js",
22
+ "browser": "./dist/index.js",
33
23
  "types": "./dist/index.d.ts",
34
24
  "files": [
35
25
  "dist"
36
26
  ],
37
27
  "devDependencies": {
38
- "@polkadot-api/json-rpc-provider": "0.1.1-canary.d6be873"
28
+ "@polkadot-api/json-rpc-provider": "0.2.0"
39
29
  },
40
30
  "scripts": {
41
31
  "build-core": "tsc --noEmit && rollup -c ../../../rollup.config.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-opaque-token.mjs","sources":["../../src/get-opaque-token.ts"],"sourcesContent":["let count = 0\nexport const getOpaqueToken = (): string => `proxyOpaque${count++}`\n"],"names":[],"mappings":"AAAA,IAAI,KAAA,GAAQ,CAAA;AACL,MAAM,cAAA,GAAiB,MAAc,CAAA,WAAA,EAAc,KAAA,EAAO,CAAA;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-proxy.mjs","sources":["../../src/get-proxy.ts"],"sourcesContent":["import {\n isResponse,\n JsonRpcConnection,\n JsonRpcId,\n JsonRpcMessage,\n JsonRpcRequest,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { ReconnectableJsonRpcConnection } from \"./internal-types\"\nimport { getOpaqueToken } from \"./get-opaque-token\"\nimport { jsonRpcReq, jsonRpcRsp } from \"./json-rpc-message\"\n\nconst enum State {\n Connected,\n Connecting,\n Done,\n}\n\nconst enum OngoingMsgType {\n ChainHeadFollow,\n ChainHeadOperation,\n Other,\n}\ntype OngoingMsg =\n | {\n type: OngoingMsgType.ChainHeadFollow\n msg: JsonRpcRequest\n }\n | { type: OngoingMsgType.ChainHeadOperation; id: string }\n | { type: OngoingMsgType.Other; msg: JsonRpcRequest }\n\nconst getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`\n\nexport const getProxy: ReconnectableJsonRpcConnection = (\n toConsumer: (msg: JsonRpcMessage) => void,\n) => {\n let state:\n | {\n type: State.Connected\n connection: JsonRpcConnection\n activeChainHeads: Set<string>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n // the key is the upstream id, the value is the synthetic token\n pendingBroadcasts: Map<JsonRpcId, string>\n\n // These are requests for which their replies should be propagated downstream\n // Therefore, the `pendingBroadcasts` won't be included in here b/c they are synthetic\n onGoingRequests: Map<JsonRpcId, OngoingMsg>\n }\n | {\n type: State.Connecting\n pending: Array<JsonRpcRequest>\n activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n >\n }\n | { type: State.Done } = {\n type: State.Connecting,\n activeBroadcasts: new Map(),\n pending: [],\n }\n\n const onMsgFromProvider = (parsed: JsonRpcMessage) => {\n let isActive = true\n if (state.type === State.Connected) {\n if (isResponse(parsed)) {\n const { id } = parsed\n const synToken = state.pendingBroadcasts.get(id)\n if (synToken) {\n state.pendingBroadcasts.delete(id)\n\n // it's guaranteed to be there b/c we control it\n if (!(\"result\" in parsed)) return\n\n const upToken = parsed.result\n const activeBroadcast = state.activeBroadcasts.get(synToken)\n\n if (activeBroadcast) activeBroadcast.upToken = upToken\n else\n // The consumer stopped before we got the response\n state.connection.send(\n jsonRpcReq({\n id: getInternalId(),\n method: \"transaction_v1_stop\",\n params: [upToken],\n }),\n )\n return\n }\n\n isActive = state.onGoingRequests.has(id)\n if (\n \"result\" in parsed &&\n state.onGoingRequests.get(id)?.type === OngoingMsgType.ChainHeadFollow\n )\n state.activeChainHeads.add(parsed.result)\n state.onGoingRequests.delete(parsed.id)\n } else if (\"params\" in parsed) {\n const { subscription, result } = parsed.params\n if (result?.event === \"stop\")\n state.activeChainHeads.delete(subscription)\n }\n }\n // If the state is \"Connecting\", then these are messages\n // sent from the `onHalt` function. So, we mus realy them\n if (isActive && state.type !== State.Done) toConsumer(parsed)\n }\n\n const send = (msg: JsonRpcRequest) => {\n if (state.type === State.Done) return\n\n // Transaction methods are purely synthetic, so they must be handled separately\n if (\"id\" in msg) {\n const { method, id, params } = msg as {\n method: string\n id: string\n params: string[]\n }\n const [group, , methodName] = method.split(\"_\")\n\n if (group === \"transaction\") {\n if (methodName === \"stop\") {\n const [synToken] = params\n const active = state.activeBroadcasts.get(synToken)\n state.activeBroadcasts.delete(synToken)\n toConsumer(\n jsonRpcRsp({\n id,\n result: null,\n }),\n )\n\n if (state.type === State.Connected && active && active.upToken) {\n // The response from this request will be ignored later on\n // because it won't be among the ongoing requests. so, it won't get to downstream\n state.connection.send(\n jsonRpcReq({\n id,\n method,\n params: [active.upToken],\n }),\n )\n }\n\n // prevents the request from being included into the ongoingRequests\n return\n }\n\n if (methodName === \"broadcast\") {\n const synToken = getOpaqueToken()\n state.activeBroadcasts.set(synToken, {\n tx: params[0],\n synToken,\n })\n\n if (state.type === State.Connected) {\n state.pendingBroadcasts.set(id, synToken)\n state.connection.send(msg)\n }\n\n toConsumer(\n jsonRpcRsp({\n id,\n result: synToken,\n }),\n )\n\n // prevents the request to be tracked with the ongoingRequests\n return\n }\n }\n }\n\n if (state.type === State.Connecting) {\n state.pending.push(msg)\n return\n }\n if (msg.method === \"chainHead_v1_unfollow\")\n state.activeChainHeads.delete(msg.params[0])\n\n if (\"id\" in msg) {\n const { method, id } = msg as { method: string; id: string }\n const [group, , methodName] = method.split(\"_\")\n\n const ongoingMsg: OngoingMsg =\n group === \"chainHead\"\n ? methodName === \"follow\"\n ? {\n type: OngoingMsgType.ChainHeadFollow,\n msg,\n }\n : { type: OngoingMsgType.ChainHeadOperation, id }\n : { type: OngoingMsgType.Other, msg }\n state.onGoingRequests.set(id, ongoingMsg)\n }\n\n state.connection.send(msg)\n }\n\n return {\n send,\n disconnect: () => {\n if (state.type === State.Done) return\n if (state.type === State.Connected) state.connection.disconnect()\n state = { type: State.Done }\n },\n connect: (cb) => {\n if (state.type !== State.Connecting) throw new Error(\"Nonesense\")\n\n const { pending, activeBroadcasts } = state\n const onGoingRequests = new Map<string, OngoingMsg>()\n const activeChainHeads = new Set<string>()\n const onHalt = () => {\n const activeBroadcasts: Map<\n string,\n { tx: string; synToken: string; upToken?: string }\n > = state.type !== State.Done ? state.activeBroadcasts : new Map()\n activeBroadcasts.forEach((x) => (x.upToken = undefined))\n state = {\n type: State.Connecting,\n activeBroadcasts,\n pending: [],\n }\n activeChainHeads.forEach((subscription) => {\n // We don't send the messages directy to the consumer\n // b/c they could have disconnected after receiving one\n // of these messages. The `onMsgFromProvider` fn handles that\n onMsgFromProvider(\n jsonRpcReq({\n method: \"chainHead_v1_follow\",\n params: {\n subscription,\n result: {\n event: \"stop\",\n internal: true,\n },\n },\n }),\n )\n })\n activeChainHeads.clear()\n for (const x of onGoingRequests.values()) {\n if (x.type === OngoingMsgType.ChainHeadOperation)\n onMsgFromProvider(\n jsonRpcRsp({\n id: x.id,\n error: { code: -32603, message: \"Internal error\" },\n }),\n )\n else send(x.msg)\n }\n onGoingRequests.clear()\n }\n state = {\n type: State.Connected,\n connection: null as any,\n activeBroadcasts,\n pendingBroadcasts: new Map(),\n onGoingRequests,\n activeChainHeads,\n }\n state.connection = cb(onMsgFromProvider, onHalt)\n activeBroadcasts.forEach((broadcast) => {\n if (state.type === State.Connected) {\n const id = getInternalId()\n state.pendingBroadcasts.set(id, broadcast.synToken)\n state.connection.send(\n jsonRpcReq({\n id,\n method: \"transaction_v1_broadcast\",\n params: [broadcast.tx],\n }),\n )\n }\n })\n pending.forEach(send)\n },\n }\n}\n"],"names":["activeBroadcasts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-sync-provider.mjs","sources":["../../src/get-sync-provider.ts"],"sourcesContent":["import type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getProxy } from \"./get-proxy\"\nimport { InnerJsonRpcProvider } from \"./public-types\"\nimport { ConnectableJsonRpcConnection } from \"./internal-types\"\n\nconst noop = () => {}\nconst WAIT_BASE = 250\n\nexport const getSyncProvider =\n (\n input: (onResult: (x: InnerJsonRpcProvider | null) => void) => () => void,\n ): JsonRpcProvider =>\n (onMessage) => {\n let proxy: ConnectableJsonRpcConnection | null = getProxy(onMessage)\n let lastHalt = Date.now()\n let consecutiveHalts = 0\n let token: any\n const getWaitTime = () =>\n consecutiveHalts && 2 ** Math.min(5, consecutiveHalts) * WAIT_BASE\n\n let stop = noop\n let startNow = () => {\n const token = setTimeout(() => {\n let isWaiting = true\n const result = input((cb) => {\n isWaiting = false\n stop = noop\n if (!cb) start()\n else if (proxy)\n proxy.connect((onMsg, onHalt) => {\n let isOn = true\n return cb(onMsg, (e) => {\n if (isOn) {\n isOn = false\n const diff = Date.now() - lastHalt\n consecutiveHalts +=\n diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1\n lastHalt += diff\n onHalt(e)\n start()\n }\n })\n })\n })\n if (isWaiting) stop = result\n }, 0)\n stop = () => clearTimeout(token)\n }\n\n const start = () => {\n token = setTimeout(startNow, getWaitTime())\n }\n startNow()\n\n return {\n send(msg) {\n proxy?.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n stop()\n stop = noop\n proxy?.disconnect()\n proxy = null\n },\n }\n }\n"],"names":["token"],"mappings":";;AAKA,MAAM,OAAO,MAAM;AAAC,CAAA;AACpB,MAAM,SAAA,GAAY,GAAA;AAEX,MAAM,eAAA,GACX,CACE,KAAA,KAEF,CAAC,SAAA,KAAc;AACb,EAAA,IAAI,KAAA,GAA6C,SAAS,SAAS,CAAA;AACnE,EAAA,IAAI,QAAA,GAAW,KAAK,GAAA,EAAI;AACxB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,KAAA;AACJ,EAAA,MAAM,WAAA,GAAc,MAClB,gBAAA,IAAoB,CAAA,IAAK,KAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAA,GAAI,SAAA;AAE3D,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,IAAI,WAAW,MAAM;AACnB,IAAA,MAAMA,MAAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAI,SAAA,GAAY,IAAA;AAChB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,EAAA,KAAO;AAC3B,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,IAAI,CAAC,IAAI,KAAA,EAAM;AAAA,aAAA,IACN,KAAA;AACP,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAA,EAAO,MAAA,KAAW;AAC/B,YAAA,IAAI,IAAA,GAAO,IAAA;AACX,YAAA,OAAO,EAAA,CAAG,KAAA,EAAO,CAAC,CAAA,KAAM;AACtB,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,IAAA,GAAO,KAAA;AACP,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAC1B,gBAAA,gBAAA,IACE,IAAA,GAAO,SAAA,GAAY,WAAA,EAAY,GAAI,CAAC,gBAAA,GAAmB,CAAA;AACzD,gBAAA,QAAA,IAAY,IAAA;AACZ,gBAAA,MAAA,CAAO,CAAC,CAAA;AACR,gBAAA,KAAA,EAAM;AAAA,cACR;AAAA,YACF,CAAC,CAAA;AAAA,UACH,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AACD,MAAA,IAAI,WAAW,IAAA,GAAO,MAAA;AAAA,IACxB,GAAG,CAAC,CAAA;AACJ,IAAA,IAAA,GAAO,MAAM,aAAaA,MAAK,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAA,GAAQ,UAAA,CAAW,QAAA,EAAU,WAAA,EAAa,CAAA;AAAA,EAC5C,CAAA;AACA,EAAA,QAAA,EAAS;AAET,EAAA,OAAO;AAAA,IACL,KAAK,GAAA,EAAK;AACR,MAAA,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,UAAA,GAAa;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,EAAK;AACL,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,KAAA,EAAO,UAAA,EAAW;AAClB,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,GACF;AACF;;;;"}
@@ -1,2 +0,0 @@
1
- export { getSyncProvider } from './get-sync-provider.mjs';
2
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-rpc-message.mjs","sources":["../../src/json-rpc-message.ts"],"sourcesContent":["import {\n JsonRpcError,\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"@polkadot-api/json-rpc-provider\"\n\nexport const jsonRpcReq = (\n msg: Omit<JsonRpcRequest, \"jsonrpc\">,\n): JsonRpcRequest => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n\nexport const jsonRpcRsp = <T = any>(\n msg: { id: JsonRpcId } & (\n | {\n result: T\n }\n | {\n error: JsonRpcError<T>\n }\n ),\n): JsonRpcResponse => ({\n jsonrpc: \"2.0\" as \"2.0\",\n ...msg,\n})\n"],"names":[],"mappings":"AAOO,MAAM,UAAA,GAAa,CACxB,GAAA,MACoB;AAAA,EACpB,OAAA,EAAS,KAAA;AAAA,EACT,GAAG;AACL,CAAA;AAEO,MAAM,UAAA,GAAa,CACxB,GAAA,MAQqB;AAAA,EACrB,OAAA,EAAS,KAAA;AAAA,EACT,GAAG;AACL,CAAA;;;;"}