@polkadot-api/json-rpc-provider-proxy 1.0.0-canary → 1.0.0-canary.22b2fd2
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/dist/esm/get-proxy.mjs +27 -27
- package/dist/esm/get-proxy.mjs.map +1 -1
- package/dist/esm/get-sync-provider.mjs +41 -27
- package/dist/esm/get-sync-provider.mjs.map +1 -1
- package/dist/esm/json-rpc-message.mjs +6 -2
- package/dist/esm/json-rpc-message.mjs.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +76 -57
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/esm/get-proxy.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isResponse } from '@polkadot-api/json-rpc-provider';
|
|
2
2
|
import { getOpaqueToken } from './get-opaque-token.mjs';
|
|
3
|
+
import { jsonRpcReq, jsonRpcRsp } from './json-rpc-message.mjs';
|
|
3
4
|
|
|
4
5
|
const getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`;
|
|
5
6
|
const getProxy = (toConsumer) => {
|
|
@@ -8,22 +9,21 @@ const getProxy = (toConsumer) => {
|
|
|
8
9
|
activeBroadcasts: /* @__PURE__ */ new Map(),
|
|
9
10
|
pending: []
|
|
10
11
|
};
|
|
11
|
-
const onMsgFromProvider = (
|
|
12
|
+
const onMsgFromProvider = (parsed) => {
|
|
12
13
|
let isActive = true;
|
|
13
14
|
if (state.type === 0 /* Connected */) {
|
|
14
|
-
|
|
15
|
-
if ("id" in parsed) {
|
|
15
|
+
if (isResponse(parsed)) {
|
|
16
16
|
const { id } = parsed;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const upToken = parsed.result;
|
|
17
|
+
const synToken = state.pendingBroadcasts.get(id);
|
|
18
|
+
if (synToken) {
|
|
20
19
|
state.pendingBroadcasts.delete(id);
|
|
20
|
+
if (!("result" in parsed)) return;
|
|
21
|
+
const upToken = parsed.result;
|
|
21
22
|
const activeBroadcast = state.activeBroadcasts.get(synToken);
|
|
22
|
-
if (activeBroadcast)
|
|
23
|
-
state.activeBroadcasts.get(synToken).upToken = upToken;
|
|
23
|
+
if (activeBroadcast) activeBroadcast.upToken = upToken;
|
|
24
24
|
else
|
|
25
25
|
state.connection.send(
|
|
26
|
-
|
|
26
|
+
jsonRpcReq({
|
|
27
27
|
id: getInternalId(),
|
|
28
28
|
method: "transaction_v1_stop",
|
|
29
29
|
params: [upToken]
|
|
@@ -41,13 +41,12 @@ const getProxy = (toConsumer) => {
|
|
|
41
41
|
state.activeChainHeads.delete(subscription);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
-
if (isActive && state.type !== 2 /* Done */) toConsumer(
|
|
44
|
+
if (isActive && state.type !== 2 /* Done */) toConsumer(parsed);
|
|
45
45
|
};
|
|
46
46
|
const send = (msg) => {
|
|
47
47
|
if (state.type === 2 /* Done */) return;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const { method, id, params } = parsed;
|
|
48
|
+
if ("id" in msg) {
|
|
49
|
+
const { method, id, params } = msg;
|
|
51
50
|
const [group, , methodName] = method.split("_");
|
|
52
51
|
if (group === "transaction") {
|
|
53
52
|
if (methodName === "stop") {
|
|
@@ -55,14 +54,14 @@ const getProxy = (toConsumer) => {
|
|
|
55
54
|
const active = state.activeBroadcasts.get(synToken);
|
|
56
55
|
state.activeBroadcasts.delete(synToken);
|
|
57
56
|
toConsumer(
|
|
58
|
-
|
|
57
|
+
jsonRpcRsp({
|
|
59
58
|
id,
|
|
60
59
|
result: null
|
|
61
60
|
})
|
|
62
61
|
);
|
|
63
62
|
if (state.type === 0 /* Connected */ && active && active.upToken) {
|
|
64
63
|
state.connection.send(
|
|
65
|
-
|
|
64
|
+
jsonRpcReq({
|
|
66
65
|
id,
|
|
67
66
|
method,
|
|
68
67
|
params: [active.upToken]
|
|
@@ -82,7 +81,7 @@ const getProxy = (toConsumer) => {
|
|
|
82
81
|
state.connection.send(msg);
|
|
83
82
|
}
|
|
84
83
|
toConsumer(
|
|
85
|
-
|
|
84
|
+
jsonRpcRsp({
|
|
86
85
|
id,
|
|
87
86
|
result: synToken
|
|
88
87
|
})
|
|
@@ -95,10 +94,10 @@ const getProxy = (toConsumer) => {
|
|
|
95
94
|
state.pending.push(msg);
|
|
96
95
|
return;
|
|
97
96
|
}
|
|
98
|
-
if (
|
|
99
|
-
state.activeChainHeads.delete(
|
|
100
|
-
if ("id" in
|
|
101
|
-
const { method, id } =
|
|
97
|
+
if (msg.method === "chainHead_v1_unfollow")
|
|
98
|
+
state.activeChainHeads.delete(msg.params[0]);
|
|
99
|
+
if ("id" in msg) {
|
|
100
|
+
const { method, id } = msg;
|
|
102
101
|
const [group, , methodName] = method.split("_");
|
|
103
102
|
const ongoingMsg = group === "chainHead" ? methodName === "follow" ? {
|
|
104
103
|
type: 0 /* ChainHeadFollow */,
|
|
@@ -130,7 +129,8 @@ const getProxy = (toConsumer) => {
|
|
|
130
129
|
};
|
|
131
130
|
activeChainHeads.forEach((subscription) => {
|
|
132
131
|
onMsgFromProvider(
|
|
133
|
-
|
|
132
|
+
jsonRpcReq({
|
|
133
|
+
method: "chainHead_v1_follow",
|
|
134
134
|
params: {
|
|
135
135
|
subscription,
|
|
136
136
|
result: {
|
|
@@ -145,10 +145,9 @@ const getProxy = (toConsumer) => {
|
|
|
145
145
|
for (const x of onGoingRequests.values()) {
|
|
146
146
|
if (x.type === 1 /* ChainHeadOperation */)
|
|
147
147
|
onMsgFromProvider(
|
|
148
|
-
|
|
148
|
+
jsonRpcRsp({
|
|
149
149
|
id: x.id,
|
|
150
|
-
error: { code: -32603, message: "Internal error" }
|
|
151
|
-
internal: true
|
|
150
|
+
error: { code: -32603, message: "Internal error" }
|
|
152
151
|
})
|
|
153
152
|
);
|
|
154
153
|
else send(x.msg);
|
|
@@ -157,18 +156,19 @@ const getProxy = (toConsumer) => {
|
|
|
157
156
|
};
|
|
158
157
|
state = {
|
|
159
158
|
type: 0 /* Connected */,
|
|
160
|
-
connection:
|
|
159
|
+
connection: null,
|
|
161
160
|
activeBroadcasts,
|
|
162
161
|
pendingBroadcasts: /* @__PURE__ */ new Map(),
|
|
163
162
|
onGoingRequests,
|
|
164
163
|
activeChainHeads
|
|
165
164
|
};
|
|
165
|
+
state.connection = cb(onMsgFromProvider, onHalt);
|
|
166
166
|
activeBroadcasts.forEach((broadcast) => {
|
|
167
167
|
if (state.type === 0 /* Connected */) {
|
|
168
168
|
const id = getInternalId();
|
|
169
169
|
state.pendingBroadcasts.set(id, broadcast.synToken);
|
|
170
170
|
send(
|
|
171
|
-
|
|
171
|
+
jsonRpcReq({
|
|
172
172
|
id,
|
|
173
173
|
method: "transaction_v1_broadcast",
|
|
174
174
|
params: [broadcast.tx]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-proxy.mjs","sources":["../../src/get-proxy.ts"],"sourcesContent":["import { JsonRpcConnection } from \"@polkadot-api/json-rpc-provider\"\nimport { ReconnectableJsonRpcConnection } from \"./internal-types\"\nimport { jsonRpcMsg } from \"./json-rpc-message\"\nimport { getOpaqueToken } from \"./get-opaque-token\"\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: string\n }\n | { type: OngoingMsgType.ChainHeadOperation; id: string }\n | { type: OngoingMsgType.Other; msg: string }\n\nconst getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`\n\nexport const getProxy: ReconnectableJsonRpcConnection = (\n toConsumer: (msg: string) => 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<string, 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<string, OngoingMsg>\n }\n | {\n type: State.Connecting\n pending: Array<string>\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 = (msg: string) => {\n let isActive = true\n if (state.type === State.Connected) {\n const parsed = JSON.parse(msg)\n if (\"id\" in parsed) {\n const { id } = parsed\n if (state.pendingBroadcasts.has(id)) {\n const synToken = state.pendingBroadcasts.get(id)!\n const upToken = parsed.result\n state.pendingBroadcasts.delete(id)\n const activeBroadcast = state.activeBroadcasts.get(synToken)\n\n if (activeBroadcast)\n state.activeBroadcasts.get(synToken)!.upToken = upToken\n else\n // The consumer stopped before we got the response\n state.connection.send(\n jsonRpcMsg({\n id: getInternalId(),\n method: \"transaction_v1_stop\",\n params: [upToken],\n }),\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(msg)\n }\n\n const send = (msg: string) => {\n if (state.type === State.Done) return\n const parsed = JSON.parse(msg)\n\n // Transaction methods are purely synthetic, so they must be handled separately\n if (\"id\" in parsed) {\n const { method, id, params } = parsed 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 jsonRpcMsg({\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 jsonRpcMsg({\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 jsonRpcMsg({\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 (parsed.method === \"chainHead_v1_unfollow\")\n state.activeChainHeads.delete(parsed.params[0])\n\n if (\"id\" in parsed) {\n const { method, id } = parsed 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 jsonRpcMsg({\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 jsonRpcMsg({\n id: x.id,\n error: { code: -32603, message: \"Internal error\" },\n internal: true,\n }),\n )\n else send(x.msg)\n }\n onGoingRequests.clear()\n }\n state = {\n type: State.Connected,\n connection: cb(onMsgFromProvider, onHalt),\n activeBroadcasts,\n pendingBroadcasts: new Map(),\n onGoingRequests,\n activeChainHeads,\n }\n activeBroadcasts.forEach((broadcast) => {\n if (state.type === State.Connected) {\n const id = getInternalId()\n state.pendingBroadcasts.set(id, broadcast.synToken)\n send(\n jsonRpcMsg({\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
|
+
{"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 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,39 +1,53 @@
|
|
|
1
1
|
import { getProxy } from './get-proxy.mjs';
|
|
2
2
|
|
|
3
|
+
const noop = () => {
|
|
4
|
+
};
|
|
5
|
+
const WAIT_BASE = 250;
|
|
3
6
|
const getSyncProvider = (input) => (onMessage) => {
|
|
4
7
|
let proxy = getProxy(onMessage);
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
let lastHalt = Date.now();
|
|
9
|
+
let consecutiveHalts = 0;
|
|
10
|
+
let token;
|
|
11
|
+
const getWaitTime = () => consecutiveHalts && 2 ** Math.min(5, consecutiveHalts) * WAIT_BASE;
|
|
12
|
+
let stop = noop;
|
|
13
|
+
let startNow = () => {
|
|
14
|
+
const token2 = setTimeout(() => {
|
|
15
|
+
let isWaiting = true;
|
|
16
|
+
const result = input((cb) => {
|
|
17
|
+
isWaiting = false;
|
|
18
|
+
stop = noop;
|
|
19
|
+
if (!cb) start();
|
|
20
|
+
else if (proxy)
|
|
21
|
+
proxy.connect((onMsg, onHalt) => {
|
|
22
|
+
let isOn = true;
|
|
23
|
+
return cb(onMsg, (e) => {
|
|
24
|
+
if (isOn) {
|
|
25
|
+
isOn = false;
|
|
26
|
+
const diff = lastHalt - Date.now();
|
|
27
|
+
consecutiveHalts += diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1;
|
|
28
|
+
lastHalt += diff;
|
|
29
|
+
onHalt(e);
|
|
30
|
+
start();
|
|
14
31
|
}
|
|
15
|
-
)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
);
|
|
25
|
-
},
|
|
26
|
-
() => {
|
|
27
|
-
proxy && setTimeout(start, 0);
|
|
28
|
-
}
|
|
29
|
-
);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
if (isWaiting) stop = result;
|
|
36
|
+
}, 0);
|
|
37
|
+
stop = () => clearTimeout(token2);
|
|
38
|
+
};
|
|
39
|
+
const start = () => {
|
|
40
|
+
token = setTimeout(startNow, getWaitTime());
|
|
30
41
|
};
|
|
31
|
-
|
|
42
|
+
startNow();
|
|
32
43
|
return {
|
|
33
|
-
send
|
|
44
|
+
send(msg) {
|
|
34
45
|
proxy?.send(msg);
|
|
35
46
|
},
|
|
36
|
-
disconnect
|
|
47
|
+
disconnect() {
|
|
48
|
+
clearTimeout(token);
|
|
49
|
+
stop();
|
|
50
|
+
stop = noop;
|
|
37
51
|
proxy?.disconnect();
|
|
38
52
|
proxy = null;
|
|
39
53
|
}
|
|
@@ -1 +1 @@
|
|
|
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 {
|
|
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 = lastHalt - Date.now()\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,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI;AACjC,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,7 +1,11 @@
|
|
|
1
|
-
const
|
|
1
|
+
const jsonRpcReq = (msg) => ({
|
|
2
|
+
jsonrpc: "2.0",
|
|
3
|
+
...msg
|
|
4
|
+
});
|
|
5
|
+
const jsonRpcRsp = (msg) => ({
|
|
2
6
|
jsonrpc: "2.0",
|
|
3
7
|
...msg
|
|
4
8
|
});
|
|
5
9
|
|
|
6
|
-
export {
|
|
10
|
+
export { jsonRpcReq, jsonRpcRsp };
|
|
7
11
|
//# sourceMappingURL=json-rpc-message.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-rpc-message.mjs","sources":["../../src/json-rpc-message.ts"],"sourcesContent":["
|
|
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;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { JsonRpcConnection, JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
|
|
1
|
+
import { JsonRpcMessage, JsonRpcConnection, JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
|
|
2
2
|
|
|
3
|
-
type
|
|
3
|
+
type InnerJsonRpcProvider<T = any> = (onMessage: (message: JsonRpcMessage<T>) => void, onHalt: (e?: any) => void) => JsonRpcConnection<T>;
|
|
4
4
|
|
|
5
|
-
declare const getSyncProvider: (input: () =>
|
|
5
|
+
declare const getSyncProvider: (input: (onResult: (x: InnerJsonRpcProvider | null) => void) => () => void) => JsonRpcProvider;
|
|
6
6
|
|
|
7
7
|
export { getSyncProvider };
|
|
8
|
-
export type {
|
|
8
|
+
export type { InnerJsonRpcProvider };
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
jsonrpc: "2.0",
|
|
5
|
-
...msg
|
|
6
|
-
});
|
|
3
|
+
var jsonRpcProvider = require('@polkadot-api/json-rpc-provider');
|
|
7
4
|
|
|
8
5
|
let count = 0;
|
|
9
6
|
const getOpaqueToken = () => `proxyOpaque${count++}`;
|
|
10
7
|
|
|
8
|
+
const jsonRpcReq = (msg) => ({
|
|
9
|
+
jsonrpc: "2.0",
|
|
10
|
+
...msg
|
|
11
|
+
});
|
|
12
|
+
const jsonRpcRsp = (msg) => ({
|
|
13
|
+
jsonrpc: "2.0",
|
|
14
|
+
...msg
|
|
15
|
+
});
|
|
16
|
+
|
|
11
17
|
const getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`;
|
|
12
18
|
const getProxy = (toConsumer) => {
|
|
13
19
|
let state = {
|
|
@@ -15,22 +21,21 @@ const getProxy = (toConsumer) => {
|
|
|
15
21
|
activeBroadcasts: /* @__PURE__ */ new Map(),
|
|
16
22
|
pending: []
|
|
17
23
|
};
|
|
18
|
-
const onMsgFromProvider = (
|
|
24
|
+
const onMsgFromProvider = (parsed) => {
|
|
19
25
|
let isActive = true;
|
|
20
26
|
if (state.type === 0 /* Connected */) {
|
|
21
|
-
|
|
22
|
-
if ("id" in parsed) {
|
|
27
|
+
if (jsonRpcProvider.isResponse(parsed)) {
|
|
23
28
|
const { id } = parsed;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const upToken = parsed.result;
|
|
29
|
+
const synToken = state.pendingBroadcasts.get(id);
|
|
30
|
+
if (synToken) {
|
|
27
31
|
state.pendingBroadcasts.delete(id);
|
|
32
|
+
if (!("result" in parsed)) return;
|
|
33
|
+
const upToken = parsed.result;
|
|
28
34
|
const activeBroadcast = state.activeBroadcasts.get(synToken);
|
|
29
|
-
if (activeBroadcast)
|
|
30
|
-
state.activeBroadcasts.get(synToken).upToken = upToken;
|
|
35
|
+
if (activeBroadcast) activeBroadcast.upToken = upToken;
|
|
31
36
|
else
|
|
32
37
|
state.connection.send(
|
|
33
|
-
|
|
38
|
+
jsonRpcReq({
|
|
34
39
|
id: getInternalId(),
|
|
35
40
|
method: "transaction_v1_stop",
|
|
36
41
|
params: [upToken]
|
|
@@ -48,13 +53,12 @@ const getProxy = (toConsumer) => {
|
|
|
48
53
|
state.activeChainHeads.delete(subscription);
|
|
49
54
|
}
|
|
50
55
|
}
|
|
51
|
-
if (isActive && state.type !== 2 /* Done */) toConsumer(
|
|
56
|
+
if (isActive && state.type !== 2 /* Done */) toConsumer(parsed);
|
|
52
57
|
};
|
|
53
58
|
const send = (msg) => {
|
|
54
59
|
if (state.type === 2 /* Done */) return;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const { method, id, params } = parsed;
|
|
60
|
+
if ("id" in msg) {
|
|
61
|
+
const { method, id, params } = msg;
|
|
58
62
|
const [group, , methodName] = method.split("_");
|
|
59
63
|
if (group === "transaction") {
|
|
60
64
|
if (methodName === "stop") {
|
|
@@ -62,14 +66,14 @@ const getProxy = (toConsumer) => {
|
|
|
62
66
|
const active = state.activeBroadcasts.get(synToken);
|
|
63
67
|
state.activeBroadcasts.delete(synToken);
|
|
64
68
|
toConsumer(
|
|
65
|
-
|
|
69
|
+
jsonRpcRsp({
|
|
66
70
|
id,
|
|
67
71
|
result: null
|
|
68
72
|
})
|
|
69
73
|
);
|
|
70
74
|
if (state.type === 0 /* Connected */ && active && active.upToken) {
|
|
71
75
|
state.connection.send(
|
|
72
|
-
|
|
76
|
+
jsonRpcReq({
|
|
73
77
|
id,
|
|
74
78
|
method,
|
|
75
79
|
params: [active.upToken]
|
|
@@ -89,7 +93,7 @@ const getProxy = (toConsumer) => {
|
|
|
89
93
|
state.connection.send(msg);
|
|
90
94
|
}
|
|
91
95
|
toConsumer(
|
|
92
|
-
|
|
96
|
+
jsonRpcRsp({
|
|
93
97
|
id,
|
|
94
98
|
result: synToken
|
|
95
99
|
})
|
|
@@ -102,10 +106,10 @@ const getProxy = (toConsumer) => {
|
|
|
102
106
|
state.pending.push(msg);
|
|
103
107
|
return;
|
|
104
108
|
}
|
|
105
|
-
if (
|
|
106
|
-
state.activeChainHeads.delete(
|
|
107
|
-
if ("id" in
|
|
108
|
-
const { method, id } =
|
|
109
|
+
if (msg.method === "chainHead_v1_unfollow")
|
|
110
|
+
state.activeChainHeads.delete(msg.params[0]);
|
|
111
|
+
if ("id" in msg) {
|
|
112
|
+
const { method, id } = msg;
|
|
109
113
|
const [group, , methodName] = method.split("_");
|
|
110
114
|
const ongoingMsg = group === "chainHead" ? methodName === "follow" ? {
|
|
111
115
|
type: 0 /* ChainHeadFollow */,
|
|
@@ -137,7 +141,8 @@ const getProxy = (toConsumer) => {
|
|
|
137
141
|
};
|
|
138
142
|
activeChainHeads.forEach((subscription) => {
|
|
139
143
|
onMsgFromProvider(
|
|
140
|
-
|
|
144
|
+
jsonRpcReq({
|
|
145
|
+
method: "chainHead_v1_follow",
|
|
141
146
|
params: {
|
|
142
147
|
subscription,
|
|
143
148
|
result: {
|
|
@@ -152,10 +157,9 @@ const getProxy = (toConsumer) => {
|
|
|
152
157
|
for (const x of onGoingRequests.values()) {
|
|
153
158
|
if (x.type === 1 /* ChainHeadOperation */)
|
|
154
159
|
onMsgFromProvider(
|
|
155
|
-
|
|
160
|
+
jsonRpcRsp({
|
|
156
161
|
id: x.id,
|
|
157
|
-
error: { code: -32603, message: "Internal error" }
|
|
158
|
-
internal: true
|
|
162
|
+
error: { code: -32603, message: "Internal error" }
|
|
159
163
|
})
|
|
160
164
|
);
|
|
161
165
|
else send(x.msg);
|
|
@@ -164,18 +168,19 @@ const getProxy = (toConsumer) => {
|
|
|
164
168
|
};
|
|
165
169
|
state = {
|
|
166
170
|
type: 0 /* Connected */,
|
|
167
|
-
connection:
|
|
171
|
+
connection: null,
|
|
168
172
|
activeBroadcasts,
|
|
169
173
|
pendingBroadcasts: /* @__PURE__ */ new Map(),
|
|
170
174
|
onGoingRequests,
|
|
171
175
|
activeChainHeads
|
|
172
176
|
};
|
|
177
|
+
state.connection = cb(onMsgFromProvider, onHalt);
|
|
173
178
|
activeBroadcasts.forEach((broadcast) => {
|
|
174
179
|
if (state.type === 0 /* Connected */) {
|
|
175
180
|
const id = getInternalId();
|
|
176
181
|
state.pendingBroadcasts.set(id, broadcast.synToken);
|
|
177
182
|
send(
|
|
178
|
-
|
|
183
|
+
jsonRpcReq({
|
|
179
184
|
id,
|
|
180
185
|
method: "transaction_v1_broadcast",
|
|
181
186
|
params: [broadcast.tx]
|
|
@@ -188,40 +193,54 @@ const getProxy = (toConsumer) => {
|
|
|
188
193
|
};
|
|
189
194
|
};
|
|
190
195
|
|
|
196
|
+
const noop = () => {
|
|
197
|
+
};
|
|
198
|
+
const WAIT_BASE = 250;
|
|
191
199
|
const getSyncProvider = (input) => (onMessage) => {
|
|
192
200
|
let proxy = getProxy(onMessage);
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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 = lastHalt - Date.now();
|
|
220
|
+
consecutiveHalts += diff > WAIT_BASE + getWaitTime() ? -consecutiveHalts : 1;
|
|
221
|
+
lastHalt += diff;
|
|
222
|
+
onHalt(e);
|
|
223
|
+
start();
|
|
202
224
|
}
|
|
203
|
-
)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
onHalt();
|
|
210
|
-
start();
|
|
211
|
-
})
|
|
212
|
-
);
|
|
213
|
-
},
|
|
214
|
-
() => {
|
|
215
|
-
proxy && setTimeout(start, 0);
|
|
216
|
-
}
|
|
217
|
-
);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
if (isWaiting) stop = result;
|
|
229
|
+
}, 0);
|
|
230
|
+
stop = () => clearTimeout(token2);
|
|
218
231
|
};
|
|
219
|
-
start()
|
|
232
|
+
const start = () => {
|
|
233
|
+
token = setTimeout(startNow, getWaitTime());
|
|
234
|
+
};
|
|
235
|
+
startNow();
|
|
220
236
|
return {
|
|
221
|
-
send
|
|
237
|
+
send(msg) {
|
|
222
238
|
proxy?.send(msg);
|
|
223
239
|
},
|
|
224
|
-
disconnect
|
|
240
|
+
disconnect() {
|
|
241
|
+
clearTimeout(token);
|
|
242
|
+
stop();
|
|
243
|
+
stop = noop;
|
|
225
244
|
proxy?.disconnect();
|
|
226
245
|
proxy = null;
|
|
227
246
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/json-rpc-message.ts","../src/get-opaque-token.ts","../src/get-proxy.ts","../src/get-sync-provider.ts"],"sourcesContent":["export const jsonRpcMsg = <T extends {}>(msg: T) =>\n JSON.stringify({\n jsonrpc: \"2.0\",\n ...msg,\n })\n","let count = 0\nexport const getOpaqueToken = (): string => `proxyOpaque${count++}`\n","import { JsonRpcConnection } from \"@polkadot-api/json-rpc-provider\"\nimport { ReconnectableJsonRpcConnection } from \"./internal-types\"\nimport { jsonRpcMsg } from \"./json-rpc-message\"\nimport { getOpaqueToken } from \"./get-opaque-token\"\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: string\n }\n | { type: OngoingMsgType.ChainHeadOperation; id: string }\n | { type: OngoingMsgType.Other; msg: string }\n\nconst getInternalId = () => `___proxyInternalId__${getOpaqueToken()}`\n\nexport const getProxy: ReconnectableJsonRpcConnection = (\n toConsumer: (msg: string) => 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<string, 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<string, OngoingMsg>\n }\n | {\n type: State.Connecting\n pending: Array<string>\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 = (msg: string) => {\n let isActive = true\n if (state.type === State.Connected) {\n const parsed = JSON.parse(msg)\n if (\"id\" in parsed) {\n const { id } = parsed\n if (state.pendingBroadcasts.has(id)) {\n const synToken = state.pendingBroadcasts.get(id)!\n const upToken = parsed.result\n state.pendingBroadcasts.delete(id)\n const activeBroadcast = state.activeBroadcasts.get(synToken)\n\n if (activeBroadcast)\n state.activeBroadcasts.get(synToken)!.upToken = upToken\n else\n // The consumer stopped before we got the response\n state.connection.send(\n jsonRpcMsg({\n id: getInternalId(),\n method: \"transaction_v1_stop\",\n params: [upToken],\n }),\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(msg)\n }\n\n const send = (msg: string) => {\n if (state.type === State.Done) return\n const parsed = JSON.parse(msg)\n\n // Transaction methods are purely synthetic, so they must be handled separately\n if (\"id\" in parsed) {\n const { method, id, params } = parsed 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 jsonRpcMsg({\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 jsonRpcMsg({\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 jsonRpcMsg({\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 (parsed.method === \"chainHead_v1_unfollow\")\n state.activeChainHeads.delete(parsed.params[0])\n\n if (\"id\" in parsed) {\n const { method, id } = parsed 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 jsonRpcMsg({\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 jsonRpcMsg({\n id: x.id,\n error: { code: -32603, message: \"Internal error\" },\n internal: true,\n }),\n )\n else send(x.msg)\n }\n onGoingRequests.clear()\n }\n state = {\n type: State.Connected,\n connection: cb(onMsgFromProvider, onHalt),\n activeBroadcasts,\n pendingBroadcasts: new Map(),\n onGoingRequests,\n activeChainHeads,\n }\n activeBroadcasts.forEach((broadcast) => {\n if (state.type === State.Connected) {\n const id = getInternalId()\n state.pendingBroadcasts.set(id, broadcast.synToken)\n send(\n jsonRpcMsg({\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 { AsyncJsonRpcProvider } from \"./public-types\"\nimport { ConnectableJsonRpcConnection } from \"./internal-types\"\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n let proxy: ConnectableJsonRpcConnection | null = getProxy(onMessage)\n\n const start = () => {\n input().then(\n (cb) => {\n if (!proxy) {\n try {\n cb(\n () => {},\n () => {},\n ).disconnect()\n } catch (_) {}\n } else\n proxy.connect((onMsg, onHalt) =>\n cb(onMsg, () => {\n onHalt()\n start()\n }),\n )\n },\n () => {\n proxy && setTimeout(start, 0)\n },\n )\n }\n\n start()\n return {\n send: (msg) => {\n proxy?.send(msg)\n },\n disconnect: () => {\n proxy?.disconnect()\n proxy = null\n },\n }\n }\n"],"names":["activeBroadcasts"],"mappings":"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"}
|
|
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 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 = lastHalt - Date.now()\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/json-rpc-provider-proxy",
|
|
3
|
-
"version": "1.0.0-canary
|
|
3
|
+
"version": "1.0.0-canary.22b2fd2",
|
|
4
4
|
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"dist"
|
|
36
36
|
],
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@polkadot-api/json-rpc-provider": "1.0.0-canary
|
|
38
|
+
"@polkadot-api/json-rpc-provider": "1.0.0-canary.22b2fd2"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build-core": "tsc --noEmit && rollup -c ../../../rollup.config.js",
|
|
42
42
|
"build": "pnpm build-core",
|
|
43
|
-
"test": "
|
|
43
|
+
"test": "vitest",
|
|
44
44
|
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
45
45
|
"format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
|
|
46
46
|
}
|