@polkadot-api/json-rpc-provider-proxy 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/esm/get-sync-provider.mjs +95 -0
- package/dist/esm/get-sync-provider.mjs.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/internal-types.mjs +9 -0
- package/dist/esm/internal-types.mjs.map +1 -0
- package/dist/esm/json-rpc-message.mjs +7 -0
- package/dist/esm/json-rpc-message.mjs.map +1 -0
- package/dist/esm/subscription-manager/chainHeadFollow.mjs +56 -0
- package/dist/esm/subscription-manager/chainHeadFollow.mjs.map +1 -0
- package/dist/esm/subscription-manager/subscription-manager.mjs +46 -0
- package/dist/esm/subscription-manager/subscription-manager.mjs.map +1 -0
- package/dist/index.js +87 -182
- package/dist/index.js.map +1 -1
- package/package.json +9 -14
- package/dist/index.d.mts +0 -6
- package/dist/index.mjs +0 -270
- package/dist/index.mjs.map +0 -1
- package/dist/min/index.d.ts +0 -6
- package/dist/min/index.js +0 -2
- package/dist/min/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1,16 @@
|
|
|
1
1
|
# @polkadot-api/json-rpc-provider-proxy
|
|
2
|
+
|
|
3
|
+
This package exports `getSyncProvider`, a function to create `JsonRpcProvider`s that will act as if the connection happen synchronously.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
export type AsyncJsonRpcProvider = (
|
|
7
|
+
onMessage: (message: string) => void,
|
|
8
|
+
onHalt: () => void,
|
|
9
|
+
) => JsonRpcConnection
|
|
10
|
+
|
|
11
|
+
function getSyncProvider(
|
|
12
|
+
input: () => Promise<AsyncJsonRpcProvider>,
|
|
13
|
+
): JsonRpcProvider
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The returned provider will buffer up every message until it can get the `JsonRpcConnection`, at which point it will send every message buffered.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getSubscriptionManager } from './subscription-manager/subscription-manager.mjs';
|
|
2
|
+
import { jsonRpcMsg } from './json-rpc-message.mjs';
|
|
3
|
+
|
|
4
|
+
const getSyncProvider = (input) => (onMessage) => {
|
|
5
|
+
let provider;
|
|
6
|
+
let bufferedMessages = [];
|
|
7
|
+
const pendingResponses = /* @__PURE__ */ new Set();
|
|
8
|
+
const subscriptionManager = getSubscriptionManager(onMessage);
|
|
9
|
+
const onMessageProxy = (message) => {
|
|
10
|
+
let parsed;
|
|
11
|
+
try {
|
|
12
|
+
parsed = JSON.parse(message);
|
|
13
|
+
} catch (_) {
|
|
14
|
+
console.error(`Unable to parse incoming message: ${message}`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (parsed.id !== void 0) {
|
|
18
|
+
pendingResponses.delete(parsed.id);
|
|
19
|
+
subscriptionManager.onResponse(parsed);
|
|
20
|
+
} else {
|
|
21
|
+
subscriptionManager.onNotifiaction(parsed);
|
|
22
|
+
}
|
|
23
|
+
onMessage(message);
|
|
24
|
+
};
|
|
25
|
+
const send = (message) => {
|
|
26
|
+
if (!provider) return;
|
|
27
|
+
const parsed = JSON.parse(message);
|
|
28
|
+
subscriptionManager.onSent(parsed);
|
|
29
|
+
if (parsed.id) pendingResponses.add(parsed.id);
|
|
30
|
+
if (provider instanceof Promise) {
|
|
31
|
+
bufferedMessages.push(message);
|
|
32
|
+
} else provider.send(message);
|
|
33
|
+
};
|
|
34
|
+
const onHalt = () => {
|
|
35
|
+
bufferedMessages = [];
|
|
36
|
+
const pendingResponsesCopy = [...pendingResponses];
|
|
37
|
+
pendingResponses.clear();
|
|
38
|
+
if (!provider) throw null;
|
|
39
|
+
const result = start();
|
|
40
|
+
subscriptionManager.onAbort();
|
|
41
|
+
pendingResponsesCopy.forEach((id) => {
|
|
42
|
+
onMessage(
|
|
43
|
+
jsonRpcMsg({
|
|
44
|
+
error: { code: -32603, message: "Internal error" },
|
|
45
|
+
id
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
const start = () => {
|
|
52
|
+
const onResolve = (getProvider) => {
|
|
53
|
+
let alive = true;
|
|
54
|
+
const _onHalt = () => {
|
|
55
|
+
if (alive) {
|
|
56
|
+
alive = false;
|
|
57
|
+
onHalt();
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const _onMessageProxy = (msg) => {
|
|
61
|
+
if (alive) onMessageProxy(msg);
|
|
62
|
+
};
|
|
63
|
+
const result = getProvider(_onMessageProxy, _onHalt);
|
|
64
|
+
bufferedMessages.forEach((m) => {
|
|
65
|
+
result.send(m);
|
|
66
|
+
});
|
|
67
|
+
bufferedMessages = [];
|
|
68
|
+
return provider = result;
|
|
69
|
+
};
|
|
70
|
+
provider = input().then(onResolve, withMacroTask(onHalt));
|
|
71
|
+
return provider;
|
|
72
|
+
};
|
|
73
|
+
const disconnect = () => {
|
|
74
|
+
if (!provider) return;
|
|
75
|
+
const finishIt = (input2) => {
|
|
76
|
+
subscriptionManager.onDisconnect();
|
|
77
|
+
pendingResponses.clear();
|
|
78
|
+
provider = null;
|
|
79
|
+
input2?.disconnect();
|
|
80
|
+
};
|
|
81
|
+
if (provider instanceof Promise) {
|
|
82
|
+
provider.then(finishIt, finishIt);
|
|
83
|
+
provider = null;
|
|
84
|
+
} else finishIt(provider);
|
|
85
|
+
};
|
|
86
|
+
start();
|
|
87
|
+
return {
|
|
88
|
+
send,
|
|
89
|
+
disconnect
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
|
|
93
|
+
|
|
94
|
+
export { getSyncProvider };
|
|
95
|
+
//# sourceMappingURL=get-sync-provider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-sync-provider.mjs","sources":["../../src/get-sync-provider.ts"],"sourcesContent":["import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\nimport { jsonRpcMsg } from \"./json-rpc-message\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n jsonRpcMsg({\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let alive = true\n const _onHalt = () => {\n if (alive) {\n alive = false\n onHalt()\n }\n }\n\n const _onMessageProxy = (msg: string) => {\n if (alive) onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"names":["input"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
2
|
+
MessageType2[MessageType2["subscribe"] = 0] = "subscribe";
|
|
3
|
+
MessageType2[MessageType2["unsubscribe"] = 1] = "unsubscribe";
|
|
4
|
+
MessageType2[MessageType2["end"] = 2] = "end";
|
|
5
|
+
return MessageType2;
|
|
6
|
+
})(MessageType || {});
|
|
7
|
+
|
|
8
|
+
export { MessageType };
|
|
9
|
+
//# sourceMappingURL=internal-types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-types.mjs","sources":["../../src/internal-types.ts"],"sourcesContent":["export type RequestId = string | number | null\nexport type SubscriptionId = string | number\nexport type JsonMessage = {\n jsonrpc: \"2.0\"\n method: string\n params: {}\n}\n\nexport const enum MessageType {\n subscribe,\n unsubscribe,\n end,\n}\n\nexport interface SubscriptionLogic {\n onSent: (parsed: any) =>\n | {\n type: MessageType.subscribe\n id: RequestId\n onRes: (parsed: any) => { id: SubscriptionId } | null\n }\n | { type: MessageType.unsubscribe; id: SubscriptionId }\n | null\n onNotification: (\n parsed: any,\n ) => { type: MessageType.end; id: SubscriptionId } | null\n onAbort: (id: SubscriptionId) => void\n}\n"],"names":["MessageType"],"mappings":"AAQkB,IAAA,WAAA,qBAAAA,YAAX,KAAA;AACL,EAAAA,YAAA,CAAA,YAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,YAAA,CAAA,YAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,YAAA,CAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA,CAAA;AAHgB,EAAAA,OAAAA,YAAAA,CAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-message.mjs","sources":["../../src/json-rpc-message.ts"],"sourcesContent":["export const jsonRpcMsg = <T extends {}>(msg: T) =>\n JSON.stringify({\n jsonrpc: \"2.0\",\n ...msg,\n })\n"],"names":[],"mappings":"AAAO,MAAM,UAAa,GAAA,CAAe,GACvC,KAAA,IAAA,CAAK,SAAU,CAAA;AAAA,EACb,OAAS,EAAA,KAAA;AAAA,EACT,GAAG,GAAA;AACL,CAAC;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { MessageType } from '../internal-types.mjs';
|
|
2
|
+
import { jsonRpcMsg } from '../json-rpc-message.mjs';
|
|
3
|
+
|
|
4
|
+
const [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
|
|
5
|
+
"follow",
|
|
6
|
+
"unfollow",
|
|
7
|
+
"followEvent"
|
|
8
|
+
].map(
|
|
9
|
+
(name) => new Set(
|
|
10
|
+
["v1", "unstable"].map((version) => `chainHead_${version}_${name}`)
|
|
11
|
+
)
|
|
12
|
+
);
|
|
13
|
+
const STOP_EVENT = "stop";
|
|
14
|
+
const chainHeadFollow = (onMessage) => {
|
|
15
|
+
let notificationMethod = "";
|
|
16
|
+
return {
|
|
17
|
+
onSent(parsed) {
|
|
18
|
+
if (START_METHODS.has(parsed.method)) {
|
|
19
|
+
notificationMethod = parsed.method + "Event";
|
|
20
|
+
return {
|
|
21
|
+
type: MessageType.subscribe,
|
|
22
|
+
id: parsed.id,
|
|
23
|
+
onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (STOP_METHODS.has(parsed.method))
|
|
27
|
+
return {
|
|
28
|
+
type: MessageType.unsubscribe,
|
|
29
|
+
id: Object.values(parsed.params)[0]
|
|
30
|
+
};
|
|
31
|
+
return null;
|
|
32
|
+
},
|
|
33
|
+
onNotification(parsed) {
|
|
34
|
+
return NOTIFICATION_METHODS.has(parsed.method) && parsed.params.result.event === STOP_EVENT ? {
|
|
35
|
+
type: MessageType.end,
|
|
36
|
+
id: parsed.params.subscription
|
|
37
|
+
} : null;
|
|
38
|
+
},
|
|
39
|
+
onAbort: (id) => {
|
|
40
|
+
onMessage(
|
|
41
|
+
jsonRpcMsg({
|
|
42
|
+
method: notificationMethod,
|
|
43
|
+
params: {
|
|
44
|
+
subscription: id,
|
|
45
|
+
result: {
|
|
46
|
+
event: STOP_EVENT
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { chainHeadFollow };
|
|
56
|
+
//# sourceMappingURL=chainHeadFollow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainHeadFollow.mjs","sources":["../../../src/subscription-manager/chainHeadFollow.ts"],"sourcesContent":["import {\n MessageType,\n SubscriptionId,\n SubscriptionLogic,\n} from \"@/internal-types\"\nimport { jsonRpcMsg } from \"@/json-rpc-message\"\n\nconst [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [\n \"follow\",\n \"unfollow\",\n \"followEvent\",\n].map(\n (name) =>\n new Set(\n [\"v1\", \"unstable\"].map((version) => `chainHead_${version}_${name}`),\n ),\n)\nconst STOP_EVENT = \"stop\"\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => {\n let notificationMethod = \"\"\n return {\n onSent(parsed) {\n if (START_METHODS.has(parsed.method)) {\n notificationMethod = parsed.method + \"Event\"\n return {\n type: MessageType.subscribe,\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n }\n\n if (STOP_METHODS.has(parsed.method))\n return {\n type: MessageType.unsubscribe,\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n return NOTIFICATION_METHODS.has(parsed.method) &&\n parsed.params.result.event === STOP_EVENT\n ? {\n type: MessageType.end,\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n jsonRpcMsg({\n method: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: STOP_EVENT,\n },\n },\n }),\n )\n },\n }\n}\n"],"names":[],"mappings":";;;AAOA,MAAM,CAAC,aAAA,EAAe,YAAc,EAAA,oBAAoB,CAAI,GAAA;AAAA,EAC1D,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AACF,CAAE,CAAA,GAAA;AAAA,EACA,CAAC,SACC,IAAI,GAAA;AAAA,IACF,CAAC,IAAM,EAAA,UAAU,CAAE,CAAA,GAAA,CAAI,CAAC,OAAA,KAAY,CAAa,UAAA,EAAA,OAAO,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA,GACpE;AACJ,CAAA,CAAA;AACA,MAAM,UAAa,GAAA,MAAA,CAAA;AAEN,MAAA,eAAA,GAAkB,CAC7B,SACsB,KAAA;AACtB,EAAA,IAAI,kBAAqB,GAAA,EAAA,CAAA;AACzB,EAAO,OAAA;AAAA,IACL,OAAO,MAAQ,EAAA;AACb,MAAA,IAAI,aAAc,CAAA,GAAA,CAAI,MAAO,CAAA,MAAM,CAAG,EAAA;AACpC,QAAA,kBAAA,GAAqB,OAAO,MAAS,GAAA,OAAA,CAAA;AACrC,QAAO,OAAA;AAAA,UACL,MAAM,WAAY,CAAA,SAAA;AAAA,UAClB,IAAI,MAAO,CAAA,EAAA;AAAA,UACX,KAAA,EAAO,CAAC,WAAA,KACN,WAAY,CAAA,EAAA,KAAO,MAAO,CAAA,EAAA,GAAK,EAAE,EAAA,EAAI,WAAY,CAAA,MAAA,EAAW,GAAA,IAAA;AAAA,SAChE,CAAA;AAAA,OACF;AAEA,MAAI,IAAA,YAAA,CAAa,GAAI,CAAA,MAAA,CAAO,MAAM,CAAA;AAChC,QAAO,OAAA;AAAA,UACL,MAAM,WAAY,CAAA,WAAA;AAAA,UAClB,IAAI,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,MAAM,EAAE,CAAC,CAAA;AAAA,SACpC,CAAA;AAEF,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,IACA,eAAe,MAAQ,EAAA;AACrB,MAAO,OAAA,oBAAA,CAAqB,IAAI,MAAO,CAAA,MAAM,KAC3C,MAAO,CAAA,MAAA,CAAO,MAAO,CAAA,KAAA,KAAU,UAC7B,GAAA;AAAA,QACE,MAAM,WAAY,CAAA,GAAA;AAAA,QAClB,EAAA,EAAI,OAAO,MAAO,CAAA,YAAA;AAAA,OAEpB,GAAA,IAAA,CAAA;AAAA,KACN;AAAA,IACA,OAAA,EAAS,CAAC,EAAO,KAAA;AACf,MAAA,SAAA;AAAA,QACE,UAAW,CAAA;AAAA,UACT,MAAQ,EAAA,kBAAA;AAAA,UACR,MAAQ,EAAA;AAAA,YACN,YAAc,EAAA,EAAA;AAAA,YACd,MAAQ,EAAA;AAAA,cACN,KAAO,EAAA,UAAA;AAAA,aACT;AAAA,WACF;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MessageType } from '../internal-types.mjs';
|
|
2
|
+
import { chainHeadFollow } from './chainHeadFollow.mjs';
|
|
3
|
+
|
|
4
|
+
const addSubscription = ({
|
|
5
|
+
onSent,
|
|
6
|
+
onNotification,
|
|
7
|
+
onAbort
|
|
8
|
+
}) => {
|
|
9
|
+
const preActive = /* @__PURE__ */ new Map();
|
|
10
|
+
const active = /* @__PURE__ */ new Set();
|
|
11
|
+
const onDisconnect = () => {
|
|
12
|
+
preActive.clear();
|
|
13
|
+
active.clear();
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
onSent(parsed) {
|
|
17
|
+
const result = onSent(parsed);
|
|
18
|
+
if (result) {
|
|
19
|
+
if (result.type === MessageType.subscribe)
|
|
20
|
+
preActive.set(result.id, result.onRes);
|
|
21
|
+
else active.delete(result.id);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
onResponse(parsed) {
|
|
25
|
+
const match = preActive.get(parsed.id)?.(parsed);
|
|
26
|
+
if (match) {
|
|
27
|
+
preActive.delete(parsed.id);
|
|
28
|
+
active.add(match.id);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
onNotifiaction(parsed) {
|
|
32
|
+
const result = onNotification(parsed);
|
|
33
|
+
if (result) active.delete(result.id);
|
|
34
|
+
},
|
|
35
|
+
onDisconnect,
|
|
36
|
+
onAbort() {
|
|
37
|
+
const activeCopy = [...active];
|
|
38
|
+
onDisconnect();
|
|
39
|
+
activeCopy.forEach(onAbort);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const getSubscriptionManager = (onMessage) => addSubscription(chainHeadFollow(onMessage));
|
|
44
|
+
|
|
45
|
+
export { addSubscription, getSubscriptionManager };
|
|
46
|
+
//# sourceMappingURL=subscription-manager.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-manager.mjs","sources":["../../../src/subscription-manager/subscription-manager.ts"],"sourcesContent":["import {\n MessageType,\n type RequestId,\n type SubscriptionId,\n type SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (result) {\n if (result.type === MessageType.subscribe)\n preActive.set(result.id, result.onRes)\n else active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (match) {\n preActive.delete(parsed.id)\n active.add(match.id)\n }\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (result) active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) =>\n addSubscription(chainHeadFollow(onMessage))\n"],"names":[],"mappings":";;;AAQO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,MAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AACF,CAAyB,KAAA;AACvB,EAAM,MAAA,SAAA,uBAAgB,GAGpB,EAAA,CAAA;AACF,EAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA,CAAA;AAEvC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,SAAA,CAAU,KAAM,EAAA,CAAA;AAChB,IAAA,MAAA,CAAO,KAAM,EAAA,CAAA;AAAA,GACf,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,OAAO,MAAa,EAAA;AAClB,MAAM,MAAA,MAAA,GAAS,OAAO,MAAM,CAAA,CAAA;AAC5B,MAAA,IAAI,MAAQ,EAAA;AACV,QAAI,IAAA,MAAA,CAAO,SAAS,WAAY,CAAA,SAAA;AAC9B,UAAA,SAAA,CAAU,GAAI,CAAA,MAAA,CAAO,EAAI,EAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,aAClC,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,OAC9B;AAAA,KACF;AAAA,IACA,WAAW,MAAa,EAAA;AACtB,MAAA,MAAM,QAAQ,SAAU,CAAA,GAAA,CAAI,MAAO,CAAA,EAAE,IAAI,MAAM,CAAA,CAAA;AAC/C,MAAA,IAAI,KAAO,EAAA;AACT,QAAU,SAAA,CAAA,MAAA,CAAO,OAAO,EAAE,CAAA,CAAA;AAC1B,QAAO,MAAA,CAAA,GAAA,CAAI,MAAM,EAAE,CAAA,CAAA;AAAA,OACrB;AAAA,KACF;AAAA,IACA,eAAe,MAAa,EAAA;AAC1B,MAAM,MAAA,MAAA,GAAS,eAAe,MAAM,CAAA,CAAA;AACpC,MAAA,IAAI,MAAQ,EAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,KACrC;AAAA,IACA,YAAA;AAAA,IACA,OAAU,GAAA;AACR,MAAM,MAAA,UAAA,GAAa,CAAC,GAAG,MAAM,CAAA,CAAA;AAC7B,MAAa,YAAA,EAAA,CAAA;AACb,MAAA,UAAA,CAAW,QAAQ,OAAO,CAAA,CAAA;AAAA,KAC5B;AAAA,GACF,CAAA;AACF,EAAA;AAEO,MAAM,yBAAyB,CAAC,SAAA,KACrC,eAAgB,CAAA,eAAA,CAAgB,SAAS,CAAC;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -1,125 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
'use strict';
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
4
|
+
MessageType2[MessageType2["subscribe"] = 0] = "subscribe";
|
|
5
|
+
MessageType2[MessageType2["unsubscribe"] = 1] = "unsubscribe";
|
|
6
|
+
MessageType2[MessageType2["end"] = 2] = "end";
|
|
7
|
+
return MessageType2;
|
|
8
|
+
})(MessageType || {});
|
|
26
9
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
var NOTIFICATION_METHOD = "chainHead_unstable_followEvent";
|
|
31
|
-
var ABORT_EVENT = "stop";
|
|
32
|
-
var terminalEvents = /* @__PURE__ */ new Set([
|
|
33
|
-
ABORT_EVENT,
|
|
34
|
-
"operationInaccessible",
|
|
35
|
-
"operationError"
|
|
36
|
-
]);
|
|
37
|
-
var chainHeadFollow = (onMessage) => ({
|
|
38
|
-
onSent(parsed) {
|
|
39
|
-
if (parsed.method === START_METHOD)
|
|
40
|
-
return {
|
|
41
|
-
type: "subscribe",
|
|
42
|
-
id: parsed.id,
|
|
43
|
-
onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
|
|
44
|
-
};
|
|
45
|
-
if (parsed.method === STOP_METHOD)
|
|
46
|
-
return {
|
|
47
|
-
type: "unsubscribe",
|
|
48
|
-
id: Object.values(parsed.params)[0]
|
|
49
|
-
};
|
|
50
|
-
return null;
|
|
51
|
-
},
|
|
52
|
-
onNotification(parsed) {
|
|
53
|
-
if (parsed.method !== NOTIFICATION_METHOD)
|
|
54
|
-
return null;
|
|
55
|
-
return terminalEvents.has(parsed.params.result.event) ? {
|
|
56
|
-
type: "end",
|
|
57
|
-
id: parsed.params.subscription
|
|
58
|
-
} : null;
|
|
59
|
-
},
|
|
60
|
-
onAbort: (id) => {
|
|
61
|
-
onMessage(
|
|
62
|
-
JSON.stringify({
|
|
63
|
-
jsonrpc: "2.0",
|
|
64
|
-
method: NOTIFICATION_METHOD,
|
|
65
|
-
params: {
|
|
66
|
-
subscription: id,
|
|
67
|
-
result: {
|
|
68
|
-
event: ABORT_EVENT
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
);
|
|
73
|
-
}
|
|
10
|
+
const jsonRpcMsg = (msg) => JSON.stringify({
|
|
11
|
+
jsonrpc: "2.0",
|
|
12
|
+
...msg
|
|
74
13
|
});
|
|
75
14
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
15
|
+
const [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
|
|
16
|
+
"follow",
|
|
17
|
+
"unfollow",
|
|
18
|
+
"followEvent"
|
|
19
|
+
].map(
|
|
20
|
+
(name) => new Set(
|
|
21
|
+
["v1", "unstable"].map((version) => `chainHead_${version}_${name}`)
|
|
22
|
+
)
|
|
23
|
+
);
|
|
24
|
+
const STOP_EVENT = "stop";
|
|
25
|
+
const chainHeadFollow = (onMessage) => {
|
|
26
|
+
let notificationMethod = "";
|
|
27
|
+
return {
|
|
28
|
+
onSent(parsed) {
|
|
29
|
+
if (START_METHODS.has(parsed.method)) {
|
|
30
|
+
notificationMethod = parsed.method + "Event";
|
|
31
|
+
return {
|
|
32
|
+
type: MessageType.subscribe,
|
|
33
|
+
id: parsed.id,
|
|
34
|
+
onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (STOP_METHODS.has(parsed.method))
|
|
38
|
+
return {
|
|
39
|
+
type: MessageType.unsubscribe,
|
|
40
|
+
id: Object.values(parsed.params)[0]
|
|
41
|
+
};
|
|
99
42
|
return null;
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
43
|
+
},
|
|
44
|
+
onNotification(parsed) {
|
|
45
|
+
return NOTIFICATION_METHODS.has(parsed.method) && parsed.params.result.event === STOP_EVENT ? {
|
|
46
|
+
type: MessageType.end,
|
|
47
|
+
id: parsed.params.subscription
|
|
48
|
+
} : null;
|
|
49
|
+
},
|
|
50
|
+
onAbort: (id) => {
|
|
51
|
+
onMessage(
|
|
52
|
+
jsonRpcMsg({
|
|
53
|
+
method: notificationMethod,
|
|
54
|
+
params: {
|
|
55
|
+
subscription: id,
|
|
56
|
+
result: {
|
|
57
|
+
event: STOP_EVENT
|
|
58
|
+
}
|
|
114
59
|
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
}
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
};
|
|
120
65
|
|
|
121
|
-
|
|
122
|
-
var addSubscription = ({
|
|
66
|
+
const addSubscription = ({
|
|
123
67
|
onSent,
|
|
124
68
|
onNotification,
|
|
125
69
|
onAbort
|
|
@@ -133,26 +77,22 @@ var addSubscription = ({
|
|
|
133
77
|
return {
|
|
134
78
|
onSent(parsed) {
|
|
135
79
|
const result = onSent(parsed);
|
|
136
|
-
if (
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
} else {
|
|
141
|
-
active.delete(result.id);
|
|
80
|
+
if (result) {
|
|
81
|
+
if (result.type === MessageType.subscribe)
|
|
82
|
+
preActive.set(result.id, result.onRes);
|
|
83
|
+
else active.delete(result.id);
|
|
142
84
|
}
|
|
143
85
|
},
|
|
144
86
|
onResponse(parsed) {
|
|
145
87
|
const match = preActive.get(parsed.id)?.(parsed);
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
88
|
+
if (match) {
|
|
89
|
+
preActive.delete(parsed.id);
|
|
90
|
+
active.add(match.id);
|
|
91
|
+
}
|
|
150
92
|
},
|
|
151
93
|
onNotifiaction(parsed) {
|
|
152
94
|
const result = onNotification(parsed);
|
|
153
|
-
if (
|
|
154
|
-
return;
|
|
155
|
-
active.delete(result.id);
|
|
95
|
+
if (result) active.delete(result.id);
|
|
156
96
|
},
|
|
157
97
|
onDisconnect,
|
|
158
98
|
onAbort() {
|
|
@@ -162,37 +102,9 @@ var addSubscription = ({
|
|
|
162
102
|
}
|
|
163
103
|
};
|
|
164
104
|
};
|
|
165
|
-
|
|
166
|
-
const subscriptions = [chainHeadFollow, txSubmitAndWatch].map(
|
|
167
|
-
(logic) => addSubscription(logic(onMessage))
|
|
168
|
-
);
|
|
169
|
-
return {
|
|
170
|
-
onSent(parsed) {
|
|
171
|
-
subscriptions.forEach((s) => {
|
|
172
|
-
s.onSent(parsed);
|
|
173
|
-
});
|
|
174
|
-
},
|
|
175
|
-
onResponse(parsed) {
|
|
176
|
-
subscriptions.forEach((s) => {
|
|
177
|
-
s.onResponse(parsed);
|
|
178
|
-
});
|
|
179
|
-
},
|
|
180
|
-
onNotifiaction(parsed) {
|
|
181
|
-
subscriptions.forEach((s) => {
|
|
182
|
-
s.onNotifiaction(parsed);
|
|
183
|
-
});
|
|
184
|
-
},
|
|
185
|
-
onDisconnect() {
|
|
186
|
-
subscriptions.forEach((s) => s.onDisconnect());
|
|
187
|
-
},
|
|
188
|
-
onAbort() {
|
|
189
|
-
subscriptions.forEach((s) => s.onAbort());
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
};
|
|
105
|
+
const getSubscriptionManager = (onMessage) => addSubscription(chainHeadFollow(onMessage));
|
|
193
106
|
|
|
194
|
-
|
|
195
|
-
var getSyncProvider = (input) => (onMessage) => {
|
|
107
|
+
const getSyncProvider = (input) => (onMessage) => {
|
|
196
108
|
let provider;
|
|
197
109
|
let bufferedMessages = [];
|
|
198
110
|
const pendingResponses = /* @__PURE__ */ new Set();
|
|
@@ -214,29 +126,24 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
214
126
|
onMessage(message);
|
|
215
127
|
};
|
|
216
128
|
const send = (message) => {
|
|
217
|
-
if (!provider)
|
|
218
|
-
return;
|
|
129
|
+
if (!provider) return;
|
|
219
130
|
const parsed = JSON.parse(message);
|
|
220
131
|
subscriptionManager.onSent(parsed);
|
|
221
|
-
if (parsed.id)
|
|
222
|
-
pendingResponses.add(parsed.id);
|
|
132
|
+
if (parsed.id) pendingResponses.add(parsed.id);
|
|
223
133
|
if (provider instanceof Promise) {
|
|
224
134
|
bufferedMessages.push(message);
|
|
225
|
-
} else
|
|
226
|
-
provider.send(message);
|
|
135
|
+
} else provider.send(message);
|
|
227
136
|
};
|
|
228
137
|
const onHalt = () => {
|
|
229
138
|
bufferedMessages = [];
|
|
230
139
|
const pendingResponsesCopy = [...pendingResponses];
|
|
231
140
|
pendingResponses.clear();
|
|
232
|
-
if (!provider)
|
|
233
|
-
throw null;
|
|
141
|
+
if (!provider) throw null;
|
|
234
142
|
const result = start();
|
|
235
143
|
subscriptionManager.onAbort();
|
|
236
144
|
pendingResponsesCopy.forEach((id) => {
|
|
237
145
|
onMessage(
|
|
238
|
-
|
|
239
|
-
jsonrpc: "2.0",
|
|
146
|
+
jsonRpcMsg({
|
|
240
147
|
error: { code: -32603, message: "Internal error" },
|
|
241
148
|
id
|
|
242
149
|
})
|
|
@@ -246,17 +153,15 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
246
153
|
};
|
|
247
154
|
const start = () => {
|
|
248
155
|
const onResolve = (getProvider) => {
|
|
249
|
-
let
|
|
156
|
+
let alive = true;
|
|
250
157
|
const _onHalt = () => {
|
|
251
|
-
if (
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
158
|
+
if (alive) {
|
|
159
|
+
alive = false;
|
|
160
|
+
onHalt();
|
|
161
|
+
}
|
|
255
162
|
};
|
|
256
163
|
const _onMessageProxy = (msg) => {
|
|
257
|
-
if (
|
|
258
|
-
return;
|
|
259
|
-
onMessageProxy(msg);
|
|
164
|
+
if (alive) onMessageProxy(msg);
|
|
260
165
|
};
|
|
261
166
|
const result = getProvider(_onMessageProxy, _onHalt);
|
|
262
167
|
bufferedMessages.forEach((m) => {
|
|
@@ -269,8 +174,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
269
174
|
return provider;
|
|
270
175
|
};
|
|
271
176
|
const disconnect = () => {
|
|
272
|
-
if (!provider)
|
|
273
|
-
return;
|
|
177
|
+
if (!provider) return;
|
|
274
178
|
const finishIt = (input2) => {
|
|
275
179
|
subscriptionManager.onDisconnect();
|
|
276
180
|
pendingResponses.clear();
|
|
@@ -280,8 +184,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
280
184
|
if (provider instanceof Promise) {
|
|
281
185
|
provider.then(finishIt, finishIt);
|
|
282
186
|
provider = null;
|
|
283
|
-
} else
|
|
284
|
-
finishIt(provider);
|
|
187
|
+
} else finishIt(provider);
|
|
285
188
|
};
|
|
286
189
|
start();
|
|
287
190
|
return {
|
|
@@ -289,5 +192,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
289
192
|
disconnect
|
|
290
193
|
};
|
|
291
194
|
};
|
|
292
|
-
|
|
293
|
-
|
|
195
|
+
const withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
|
|
196
|
+
|
|
197
|
+
exports.getSyncProvider = getSyncProvider;
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/subscription-manager/chainHeadFollow.ts","../src/subscription-manager/transaction-submit-watch.ts","../src/subscription-manager/subscription-manager.ts","../src/get-sync-provider.ts"],"sourcesContent":["export * from \"./get-sync-provider\"\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","input"]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/internal-types.ts","../src/json-rpc-message.ts","../src/subscription-manager/chainHeadFollow.ts","../src/subscription-manager/subscription-manager.ts","../src/get-sync-provider.ts"],"sourcesContent":["export type RequestId = string | number | null\nexport type SubscriptionId = string | number\nexport type JsonMessage = {\n jsonrpc: \"2.0\"\n method: string\n params: {}\n}\n\nexport const enum MessageType {\n subscribe,\n unsubscribe,\n end,\n}\n\nexport interface SubscriptionLogic {\n onSent: (parsed: any) =>\n | {\n type: MessageType.subscribe\n id: RequestId\n onRes: (parsed: any) => { id: SubscriptionId } | null\n }\n | { type: MessageType.unsubscribe; id: SubscriptionId }\n | null\n onNotification: (\n parsed: any,\n ) => { type: MessageType.end; id: SubscriptionId } | null\n onAbort: (id: SubscriptionId) => void\n}\n","export const jsonRpcMsg = <T extends {}>(msg: T) =>\n JSON.stringify({\n jsonrpc: \"2.0\",\n ...msg,\n })\n","import {\n MessageType,\n SubscriptionId,\n SubscriptionLogic,\n} from \"@/internal-types\"\nimport { jsonRpcMsg } from \"@/json-rpc-message\"\n\nconst [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [\n \"follow\",\n \"unfollow\",\n \"followEvent\",\n].map(\n (name) =>\n new Set(\n [\"v1\", \"unstable\"].map((version) => `chainHead_${version}_${name}`),\n ),\n)\nconst STOP_EVENT = \"stop\"\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => {\n let notificationMethod = \"\"\n return {\n onSent(parsed) {\n if (START_METHODS.has(parsed.method)) {\n notificationMethod = parsed.method + \"Event\"\n return {\n type: MessageType.subscribe,\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n }\n\n if (STOP_METHODS.has(parsed.method))\n return {\n type: MessageType.unsubscribe,\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n return NOTIFICATION_METHODS.has(parsed.method) &&\n parsed.params.result.event === STOP_EVENT\n ? {\n type: MessageType.end,\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n jsonRpcMsg({\n method: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: STOP_EVENT,\n },\n },\n }),\n )\n },\n }\n}\n","import {\n MessageType,\n type RequestId,\n type SubscriptionId,\n type SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (result) {\n if (result.type === MessageType.subscribe)\n preActive.set(result.id, result.onRes)\n else active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (match) {\n preActive.delete(parsed.id)\n active.add(match.id)\n }\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (result) active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) =>\n addSubscription(chainHeadFollow(onMessage))\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\nimport { jsonRpcMsg } from \"./json-rpc-message\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n jsonRpcMsg({\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let alive = true\n const _onHalt = () => {\n if (alive) {\n alive = false\n onHalt()\n }\n }\n\n const _onMessageProxy = (msg: string) => {\n if (alive) onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"names":["MessageType","input"],"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": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,38 +12,33 @@
|
|
|
12
12
|
".": {
|
|
13
13
|
"node": {
|
|
14
14
|
"production": {
|
|
15
|
-
"import": "./dist/index.mjs",
|
|
15
|
+
"import": "./dist/esm/index.mjs",
|
|
16
16
|
"require": "./dist/min/index.js",
|
|
17
17
|
"default": "./dist/index.js"
|
|
18
18
|
},
|
|
19
|
-
"import": "./dist/index.mjs",
|
|
19
|
+
"import": "./dist/esm/index.mjs",
|
|
20
20
|
"require": "./dist/index.js",
|
|
21
21
|
"default": "./dist/index.js"
|
|
22
22
|
},
|
|
23
|
-
"module": "./dist/index.mjs",
|
|
24
|
-
"import": "./dist/index.mjs",
|
|
23
|
+
"module": "./dist/esm/index.mjs",
|
|
24
|
+
"import": "./dist/esm/index.mjs",
|
|
25
25
|
"require": "./dist/index.js",
|
|
26
26
|
"default": "./dist/index.js"
|
|
27
27
|
},
|
|
28
28
|
"./package.json": "./package.json"
|
|
29
29
|
},
|
|
30
30
|
"main": "./dist/index.js",
|
|
31
|
-
"module": "./dist/index.mjs",
|
|
32
|
-
"browser": "./dist/index.mjs",
|
|
31
|
+
"module": "./dist/esm/index.mjs",
|
|
32
|
+
"browser": "./dist/esm/index.mjs",
|
|
33
33
|
"types": "./dist/index.d.ts",
|
|
34
34
|
"files": [
|
|
35
35
|
"dist"
|
|
36
36
|
],
|
|
37
|
-
"prettier": {
|
|
38
|
-
"printWidth": 80,
|
|
39
|
-
"semi": false,
|
|
40
|
-
"trailingComma": "all"
|
|
41
|
-
},
|
|
42
37
|
"devDependencies": {
|
|
43
|
-
"@polkadot-api/json-rpc-provider": "0.0.
|
|
38
|
+
"@polkadot-api/json-rpc-provider": "0.0.2"
|
|
44
39
|
},
|
|
45
40
|
"scripts": {
|
|
46
|
-
"build": "tsc --noEmit &&
|
|
41
|
+
"build": "tsc --noEmit && rollup -c ../../../rollup.config.js",
|
|
47
42
|
"test": "echo 'no tests'",
|
|
48
43
|
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
49
44
|
"format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
|
package/dist/index.d.mts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { JsonRpcConnection, JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
|
|
2
|
-
|
|
3
|
-
type AsyncJsonRpcProvider = (onMessage: (message: string) => void, onHalt: () => void) => JsonRpcConnection;
|
|
4
|
-
declare const getSyncProvider: (input: () => Promise<AsyncJsonRpcProvider>) => JsonRpcProvider;
|
|
5
|
-
|
|
6
|
-
export { type AsyncJsonRpcProvider, getSyncProvider };
|
package/dist/index.mjs
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
// src/subscription-manager/chainHeadFollow.ts
|
|
2
|
-
var START_METHOD = "chainHead_unstable_follow";
|
|
3
|
-
var STOP_METHOD = "chainHead_unstable_unfollow";
|
|
4
|
-
var NOTIFICATION_METHOD = "chainHead_unstable_followEvent";
|
|
5
|
-
var ABORT_EVENT = "stop";
|
|
6
|
-
var terminalEvents = /* @__PURE__ */ new Set([
|
|
7
|
-
ABORT_EVENT,
|
|
8
|
-
"operationInaccessible",
|
|
9
|
-
"operationError"
|
|
10
|
-
]);
|
|
11
|
-
var chainHeadFollow = (onMessage) => ({
|
|
12
|
-
onSent(parsed) {
|
|
13
|
-
if (parsed.method === START_METHOD)
|
|
14
|
-
return {
|
|
15
|
-
type: "subscribe",
|
|
16
|
-
id: parsed.id,
|
|
17
|
-
onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
|
|
18
|
-
};
|
|
19
|
-
if (parsed.method === STOP_METHOD)
|
|
20
|
-
return {
|
|
21
|
-
type: "unsubscribe",
|
|
22
|
-
id: Object.values(parsed.params)[0]
|
|
23
|
-
};
|
|
24
|
-
return null;
|
|
25
|
-
},
|
|
26
|
-
onNotification(parsed) {
|
|
27
|
-
if (parsed.method !== NOTIFICATION_METHOD)
|
|
28
|
-
return null;
|
|
29
|
-
return terminalEvents.has(parsed.params.result.event) ? {
|
|
30
|
-
type: "end",
|
|
31
|
-
id: parsed.params.subscription
|
|
32
|
-
} : null;
|
|
33
|
-
},
|
|
34
|
-
onAbort: (id) => {
|
|
35
|
-
onMessage(
|
|
36
|
-
JSON.stringify({
|
|
37
|
-
jsonrpc: "2.0",
|
|
38
|
-
method: NOTIFICATION_METHOD,
|
|
39
|
-
params: {
|
|
40
|
-
subscription: id,
|
|
41
|
-
result: {
|
|
42
|
-
event: ABORT_EVENT
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// src/subscription-manager/transaction-submit-watch.ts
|
|
51
|
-
var START_METHOD2 = "transaction_unstable_submitAndWatch";
|
|
52
|
-
var STOP_METHOD2 = "transaction_unstable_unwatch";
|
|
53
|
-
var NOTIFICATION_METHOD2 = "transaction_unstable_watchEvent";
|
|
54
|
-
var ABORT_EVENT2 = "dropped";
|
|
55
|
-
var terminalEvents2 = /* @__PURE__ */ new Set([ABORT_EVENT2, "finalized", "error", "invalid"]);
|
|
56
|
-
var txSubmitAndWatch = (onMessage) => ({
|
|
57
|
-
onSent(parsed) {
|
|
58
|
-
if (parsed.method === START_METHOD2)
|
|
59
|
-
return {
|
|
60
|
-
type: "subscribe",
|
|
61
|
-
id: parsed.id,
|
|
62
|
-
onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
|
|
63
|
-
};
|
|
64
|
-
if (parsed.method === STOP_METHOD2)
|
|
65
|
-
return {
|
|
66
|
-
type: "unsubscribe",
|
|
67
|
-
id: Object.values(parsed.params)[0]
|
|
68
|
-
};
|
|
69
|
-
return null;
|
|
70
|
-
},
|
|
71
|
-
onNotification(parsed) {
|
|
72
|
-
if (parsed.method !== NOTIFICATION_METHOD2)
|
|
73
|
-
return null;
|
|
74
|
-
return terminalEvents2.has(parsed.params.result.event) ? {
|
|
75
|
-
type: "end",
|
|
76
|
-
id: parsed.params.subscription
|
|
77
|
-
} : null;
|
|
78
|
-
},
|
|
79
|
-
onAbort: (id) => {
|
|
80
|
-
onMessage(
|
|
81
|
-
JSON.stringify({
|
|
82
|
-
jsonrpc: "2.0",
|
|
83
|
-
method: NOTIFICATION_METHOD2,
|
|
84
|
-
params: {
|
|
85
|
-
subscription: id,
|
|
86
|
-
result: {
|
|
87
|
-
event: ABORT_EVENT2
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
})
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// src/subscription-manager/subscription-manager.ts
|
|
96
|
-
var addSubscription = ({
|
|
97
|
-
onSent,
|
|
98
|
-
onNotification,
|
|
99
|
-
onAbort
|
|
100
|
-
}) => {
|
|
101
|
-
const preActive = /* @__PURE__ */ new Map();
|
|
102
|
-
const active = /* @__PURE__ */ new Set();
|
|
103
|
-
const onDisconnect = () => {
|
|
104
|
-
preActive.clear();
|
|
105
|
-
active.clear();
|
|
106
|
-
};
|
|
107
|
-
return {
|
|
108
|
-
onSent(parsed) {
|
|
109
|
-
const result = onSent(parsed);
|
|
110
|
-
if (!result)
|
|
111
|
-
return;
|
|
112
|
-
if (result.type === "subscribe") {
|
|
113
|
-
preActive.set(result.id, result.onRes);
|
|
114
|
-
} else {
|
|
115
|
-
active.delete(result.id);
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
onResponse(parsed) {
|
|
119
|
-
const match = preActive.get(parsed.id)?.(parsed);
|
|
120
|
-
if (!match)
|
|
121
|
-
return;
|
|
122
|
-
preActive.delete(parsed.id);
|
|
123
|
-
active.add(match.id);
|
|
124
|
-
},
|
|
125
|
-
onNotifiaction(parsed) {
|
|
126
|
-
const result = onNotification(parsed);
|
|
127
|
-
if (!result)
|
|
128
|
-
return;
|
|
129
|
-
active.delete(result.id);
|
|
130
|
-
},
|
|
131
|
-
onDisconnect,
|
|
132
|
-
onAbort() {
|
|
133
|
-
const activeCopy = [...active];
|
|
134
|
-
onDisconnect();
|
|
135
|
-
activeCopy.forEach(onAbort);
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
};
|
|
139
|
-
var getSubscriptionManager = (onMessage) => {
|
|
140
|
-
const subscriptions = [chainHeadFollow, txSubmitAndWatch].map(
|
|
141
|
-
(logic) => addSubscription(logic(onMessage))
|
|
142
|
-
);
|
|
143
|
-
return {
|
|
144
|
-
onSent(parsed) {
|
|
145
|
-
subscriptions.forEach((s) => {
|
|
146
|
-
s.onSent(parsed);
|
|
147
|
-
});
|
|
148
|
-
},
|
|
149
|
-
onResponse(parsed) {
|
|
150
|
-
subscriptions.forEach((s) => {
|
|
151
|
-
s.onResponse(parsed);
|
|
152
|
-
});
|
|
153
|
-
},
|
|
154
|
-
onNotifiaction(parsed) {
|
|
155
|
-
subscriptions.forEach((s) => {
|
|
156
|
-
s.onNotifiaction(parsed);
|
|
157
|
-
});
|
|
158
|
-
},
|
|
159
|
-
onDisconnect() {
|
|
160
|
-
subscriptions.forEach((s) => s.onDisconnect());
|
|
161
|
-
},
|
|
162
|
-
onAbort() {
|
|
163
|
-
subscriptions.forEach((s) => s.onAbort());
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
// src/get-sync-provider.ts
|
|
169
|
-
var getSyncProvider = (input) => (onMessage) => {
|
|
170
|
-
let provider;
|
|
171
|
-
let bufferedMessages = [];
|
|
172
|
-
const pendingResponses = /* @__PURE__ */ new Set();
|
|
173
|
-
const subscriptionManager = getSubscriptionManager(onMessage);
|
|
174
|
-
const onMessageProxy = (message) => {
|
|
175
|
-
let parsed;
|
|
176
|
-
try {
|
|
177
|
-
parsed = JSON.parse(message);
|
|
178
|
-
} catch (_) {
|
|
179
|
-
console.error(`Unable to parse incoming message: ${message}`);
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (parsed.id !== void 0) {
|
|
183
|
-
pendingResponses.delete(parsed.id);
|
|
184
|
-
subscriptionManager.onResponse(parsed);
|
|
185
|
-
} else {
|
|
186
|
-
subscriptionManager.onNotifiaction(parsed);
|
|
187
|
-
}
|
|
188
|
-
onMessage(message);
|
|
189
|
-
};
|
|
190
|
-
const send = (message) => {
|
|
191
|
-
if (!provider)
|
|
192
|
-
return;
|
|
193
|
-
const parsed = JSON.parse(message);
|
|
194
|
-
subscriptionManager.onSent(parsed);
|
|
195
|
-
if (parsed.id)
|
|
196
|
-
pendingResponses.add(parsed.id);
|
|
197
|
-
if (provider instanceof Promise) {
|
|
198
|
-
bufferedMessages.push(message);
|
|
199
|
-
} else
|
|
200
|
-
provider.send(message);
|
|
201
|
-
};
|
|
202
|
-
const onHalt = () => {
|
|
203
|
-
bufferedMessages = [];
|
|
204
|
-
const pendingResponsesCopy = [...pendingResponses];
|
|
205
|
-
pendingResponses.clear();
|
|
206
|
-
if (!provider)
|
|
207
|
-
throw null;
|
|
208
|
-
const result = start();
|
|
209
|
-
subscriptionManager.onAbort();
|
|
210
|
-
pendingResponsesCopy.forEach((id) => {
|
|
211
|
-
onMessage(
|
|
212
|
-
JSON.stringify({
|
|
213
|
-
jsonrpc: "2.0",
|
|
214
|
-
error: { code: -32603, message: "Internal error" },
|
|
215
|
-
id
|
|
216
|
-
})
|
|
217
|
-
);
|
|
218
|
-
});
|
|
219
|
-
return result;
|
|
220
|
-
};
|
|
221
|
-
const start = () => {
|
|
222
|
-
const onResolve = (getProvider) => {
|
|
223
|
-
let halted = false;
|
|
224
|
-
const _onHalt = () => {
|
|
225
|
-
if (halted)
|
|
226
|
-
return;
|
|
227
|
-
halted = true;
|
|
228
|
-
onHalt();
|
|
229
|
-
};
|
|
230
|
-
const _onMessageProxy = (msg) => {
|
|
231
|
-
if (halted)
|
|
232
|
-
return;
|
|
233
|
-
onMessageProxy(msg);
|
|
234
|
-
};
|
|
235
|
-
const result = getProvider(_onMessageProxy, _onHalt);
|
|
236
|
-
bufferedMessages.forEach((m) => {
|
|
237
|
-
result.send(m);
|
|
238
|
-
});
|
|
239
|
-
bufferedMessages = [];
|
|
240
|
-
return provider = result;
|
|
241
|
-
};
|
|
242
|
-
provider = input().then(onResolve, withMacroTask(onHalt));
|
|
243
|
-
return provider;
|
|
244
|
-
};
|
|
245
|
-
const disconnect = () => {
|
|
246
|
-
if (!provider)
|
|
247
|
-
return;
|
|
248
|
-
const finishIt = (input2) => {
|
|
249
|
-
subscriptionManager.onDisconnect();
|
|
250
|
-
pendingResponses.clear();
|
|
251
|
-
provider = null;
|
|
252
|
-
input2?.disconnect();
|
|
253
|
-
};
|
|
254
|
-
if (provider instanceof Promise) {
|
|
255
|
-
provider.then(finishIt, finishIt);
|
|
256
|
-
provider = null;
|
|
257
|
-
} else
|
|
258
|
-
finishIt(provider);
|
|
259
|
-
};
|
|
260
|
-
start();
|
|
261
|
-
return {
|
|
262
|
-
send,
|
|
263
|
-
disconnect
|
|
264
|
-
};
|
|
265
|
-
};
|
|
266
|
-
var withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
|
|
267
|
-
export {
|
|
268
|
-
getSyncProvider
|
|
269
|
-
};
|
|
270
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/subscription-manager/chainHeadFollow.ts","../src/subscription-manager/transaction-submit-watch.ts","../src/subscription-manager/subscription-manager.ts","../src/get-sync-provider.ts"],"sourcesContent":["import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","input"]}
|
package/dist/min/index.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { JsonRpcConnection, JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
|
|
2
|
-
|
|
3
|
-
type AsyncJsonRpcProvider = (onMessage: (message: string) => void, onHalt: () => void) => JsonRpcConnection;
|
|
4
|
-
declare const getSyncProvider: (input: () => Promise<AsyncJsonRpcProvider>) => JsonRpcProvider;
|
|
5
|
-
|
|
6
|
-
export { type AsyncJsonRpcProvider, getSyncProvider };
|
package/dist/min/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var I=(o,n)=>{for(var t in n)d(o,t,{get:n[t],enumerable:!0})},P=(o,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of E(n))!O.call(o,r)&&r!==t&&d(o,r,{get:()=>n[r],enumerable:!(e=A(n,r))||e.enumerable});return o};var J=o=>P(d({},"__esModule",{value:!0}),o);var q={};I(q,{getSyncProvider:()=>j});module.exports=J(q);var N="chainHead_unstable_follow",w="chainHead_unstable_unfollow",g="chainHead_unstable_followEvent",h="stop",H=new Set([h,"operationInaccessible","operationError"]),S=o=>({onSent(n){return n.method===N?{type:"subscribe",id:n.id,onRes:t=>t.id===n.id?{id:t.result}:null}:n.method===w?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return n.method!==g?null:H.has(n.params.result.event)?{type:"end",id:n.params.subscription}:null},onAbort:n=>{o(JSON.stringify({jsonrpc:"2.0",method:g,params:{subscription:n,result:{event:h}}}))}});var M="transaction_unstable_submitAndWatch",x="transaction_unstable_unwatch",y="transaction_unstable_watchEvent",R="dropped",C=new Set([R,"finalized","error","invalid"]),v=o=>({onSent(n){return n.method===M?{type:"subscribe",id:n.id,onRes:t=>t.id===n.id?{id:t.result}:null}:n.method===x?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return n.method!==y?null:C.has(n.params.result.event)?{type:"end",id:n.params.subscription}:null},onAbort:n=>{o(JSON.stringify({jsonrpc:"2.0",method:y,params:{subscription:n,result:{event:R}}}))}});var D=({onSent:o,onNotification:n,onAbort:t})=>{let e=new Map,r=new Set,u=()=>{e.clear(),r.clear()};return{onSent(a){let c=o(a);c&&(c.type==="subscribe"?e.set(c.id,c.onRes):r.delete(c.id))},onResponse(a){let c=e.get(a.id)?.(a);c&&(e.delete(a.id),r.add(c.id))},onNotifiaction(a){let c=n(a);c&&r.delete(c.id)},onDisconnect:u,onAbort(){let a=[...r];u(),a.forEach(t)}}},T=o=>{let n=[S,v].map(t=>D(t(o)));return{onSent(t){n.forEach(e=>{e.onSent(t)})},onResponse(t){n.forEach(e=>{e.onResponse(t)})},onNotifiaction(t){n.forEach(e=>{e.onNotifiaction(t)})},onDisconnect(){n.forEach(t=>t.onDisconnect())},onAbort(){n.forEach(t=>t.onAbort())}}};var j=o=>n=>{let t,e=[],r=new Set,u=T(n),a=i=>{let s;try{s=JSON.parse(i)}catch{console.error(`Unable to parse incoming message: ${i}`);return}s.id!==void 0?(r.delete(s.id),u.onResponse(s)):u.onNotifiaction(s),n(i)},c=i=>{if(!t)return;let s=JSON.parse(i);u.onSent(s),s.id&&r.add(s.id),t instanceof Promise?e.push(i):t.send(i)},f=()=>{e=[];let i=[...r];if(r.clear(),!t)throw null;let s=m();return u.onAbort(),i.forEach(l=>{n(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:l}))}),s},m=()=>{let i=s=>{let l=!1,b=s(p=>{l||a(p)},()=>{l||(l=!0,f())});return e.forEach(p=>{b.send(p)}),e=[],t=b};return t=o().then(i,L(f)),t},_=()=>{if(!t)return;let i=s=>{u.onDisconnect(),r.clear(),t=null,s?.disconnect()};t instanceof Promise?(t.then(i,i),t=null):i(t)};return m(),{send:c,disconnect:_}},L=o=>(...n)=>new Promise(t=>setTimeout(t,0)).then(()=>o(...n));
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
package/dist/min/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/subscription-manager/chainHeadFollow.ts","../../src/subscription-manager/transaction-submit-watch.ts","../../src/subscription-manager/subscription-manager.ts","../../src/get-sync-provider.ts"],"sourcesContent":["export * from \"./get-sync-provider\"\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["src_exports","__export","getSyncProvider","__toCommonJS","START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","chainHeadFollow","onMessage","parsed","innerParsed","id","START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","txSubmitAndWatch","onMessage","parsed","innerParsed","id","addSubscription","onSent","onNotification","onAbort","preActive","active","onDisconnect","parsed","result","match","activeCopy","getSubscriptionManager","onMessage","subscriptions","chainHeadFollow","txSubmitAndWatch","logic","s","getSyncProvider","input","onMessage","provider","bufferedMessages","pendingResponses","subscriptionManager","getSubscriptionManager","onMessageProxy","message","parsed","send","onHalt","pendingResponsesCopy","result","start","id","onResolve","getProvider","halted","msg","m","withMacroTask","disconnect","finishIt","inputFn","args","res"]}
|