@polkadot-api/json-rpc-provider-proxy 0.1.0 → 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.
@@ -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,2 @@
1
+ export { getSyncProvider } from './get-sync-provider.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -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,7 @@
1
+ const jsonRpcMsg = (msg) => JSON.stringify({
2
+ jsonrpc: "2.0",
3
+ ...msg
4
+ });
5
+
6
+ export { jsonRpcMsg };
7
+ //# sourceMappingURL=json-rpc-message.mjs.map
@@ -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,31 +1,18 @@
1
- "use strict";
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
- // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- getSyncProvider: () => getSyncProvider
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 || {});
9
+
10
+ const jsonRpcMsg = (msg) => JSON.stringify({
11
+ jsonrpc: "2.0",
12
+ ...msg
24
13
  });
25
- module.exports = __toCommonJS(src_exports);
26
14
 
27
- // src/subscription-manager/chainHeadFollow.ts
28
- var [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
15
+ const [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
29
16
  "follow",
30
17
  "unfollow",
31
18
  "followEvent"
@@ -34,38 +21,35 @@ var [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
34
21
  ["v1", "unstable"].map((version) => `chainHead_${version}_${name}`)
35
22
  )
36
23
  );
37
- var STOP_EVENT = "stop";
38
- var chainHeadFollow = (onMessage) => {
24
+ const STOP_EVENT = "stop";
25
+ const chainHeadFollow = (onMessage) => {
39
26
  let notificationMethod = "";
40
27
  return {
41
28
  onSent(parsed) {
42
29
  if (START_METHODS.has(parsed.method)) {
43
30
  notificationMethod = parsed.method + "Event";
44
31
  return {
45
- type: "subscribe",
32
+ type: MessageType.subscribe,
46
33
  id: parsed.id,
47
34
  onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
48
35
  };
49
36
  }
50
37
  if (STOP_METHODS.has(parsed.method))
51
38
  return {
52
- type: "unsubscribe",
39
+ type: MessageType.unsubscribe,
53
40
  id: Object.values(parsed.params)[0]
54
41
  };
55
42
  return null;
56
43
  },
57
44
  onNotification(parsed) {
58
- if (!NOTIFICATION_METHODS.has(parsed.method))
59
- return null;
60
- return parsed.params.result.event === STOP_EVENT ? {
61
- type: "end",
45
+ return NOTIFICATION_METHODS.has(parsed.method) && parsed.params.result.event === STOP_EVENT ? {
46
+ type: MessageType.end,
62
47
  id: parsed.params.subscription
63
48
  } : null;
64
49
  },
65
50
  onAbort: (id) => {
66
51
  onMessage(
67
- JSON.stringify({
68
- jsonrpc: "2.0",
52
+ jsonRpcMsg({
69
53
  method: notificationMethod,
70
54
  params: {
71
55
  subscription: id,
@@ -79,68 +63,7 @@ var chainHeadFollow = (onMessage) => {
79
63
  };
80
64
  };
81
65
 
82
- // src/subscription-manager/transaction-submit-watch.ts
83
- var versions = ["v1", "unstable"];
84
- var groupNames = ["transactionWatch", "transaction"];
85
- var groupNameVersionPermutations = versions.map((v) => groupNames.map((g) => [v, g])).flat();
86
- var [START_METHODS2, STOP_METHODS2] = ["submitAndWatch", "unwatch"].map(
87
- (name) => new Set(
88
- groupNameVersionPermutations.map(
89
- ([version, groupName]) => `${groupName}_${version}_${name}`
90
- )
91
- )
92
- );
93
- var ABORT_EVENT = "dropped";
94
- var terminalEvents = /* @__PURE__ */ new Set([ABORT_EVENT, "finalized", "error", "invalid"]);
95
- var txSubmitAndWatch = (onMessage) => {
96
- let notificationMethod = "";
97
- return {
98
- onSent(parsed) {
99
- if (START_METHODS2.has(parsed.method)) {
100
- if (!notificationMethod) {
101
- const [groupName, version] = parsed.method.split("_");
102
- notificationMethod = [groupName, version, "watchEvent"].join("_");
103
- }
104
- return {
105
- type: "subscribe",
106
- id: parsed.id,
107
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
108
- };
109
- }
110
- if (STOP_METHODS2.has(parsed.method))
111
- return {
112
- type: "unsubscribe",
113
- id: Object.values(parsed.params)[0]
114
- };
115
- return null;
116
- },
117
- onNotification(parsed) {
118
- if (notificationMethod !== parsed.method)
119
- return null;
120
- return terminalEvents.has(parsed.params.result.event) ? {
121
- type: "end",
122
- id: parsed.params.subscription
123
- } : null;
124
- },
125
- onAbort: (id) => {
126
- onMessage(
127
- JSON.stringify({
128
- jsonrpc: "2.0",
129
- method: notificationMethod,
130
- params: {
131
- subscription: id,
132
- result: {
133
- event: ABORT_EVENT
134
- }
135
- }
136
- })
137
- );
138
- }
139
- };
140
- };
141
-
142
- // src/subscription-manager/subscription-manager.ts
143
- var addSubscription = ({
66
+ const addSubscription = ({
144
67
  onSent,
145
68
  onNotification,
146
69
  onAbort
@@ -154,26 +77,22 @@ var addSubscription = ({
154
77
  return {
155
78
  onSent(parsed) {
156
79
  const result = onSent(parsed);
157
- if (!result)
158
- return;
159
- if (result.type === "subscribe") {
160
- preActive.set(result.id, result.onRes);
161
- } else {
162
- 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);
163
84
  }
164
85
  },
165
86
  onResponse(parsed) {
166
87
  const match = preActive.get(parsed.id)?.(parsed);
167
- if (!match)
168
- return;
169
- preActive.delete(parsed.id);
170
- active.add(match.id);
88
+ if (match) {
89
+ preActive.delete(parsed.id);
90
+ active.add(match.id);
91
+ }
171
92
  },
172
93
  onNotifiaction(parsed) {
173
94
  const result = onNotification(parsed);
174
- if (!result)
175
- return;
176
- active.delete(result.id);
95
+ if (result) active.delete(result.id);
177
96
  },
178
97
  onDisconnect,
179
98
  onAbort() {
@@ -183,37 +102,9 @@ var addSubscription = ({
183
102
  }
184
103
  };
185
104
  };
186
- var getSubscriptionManager = (onMessage) => {
187
- const subscriptions = [chainHeadFollow, txSubmitAndWatch].map(
188
- (logic) => addSubscription(logic(onMessage))
189
- );
190
- return {
191
- onSent(parsed) {
192
- subscriptions.forEach((s) => {
193
- s.onSent(parsed);
194
- });
195
- },
196
- onResponse(parsed) {
197
- subscriptions.forEach((s) => {
198
- s.onResponse(parsed);
199
- });
200
- },
201
- onNotifiaction(parsed) {
202
- subscriptions.forEach((s) => {
203
- s.onNotifiaction(parsed);
204
- });
205
- },
206
- onDisconnect() {
207
- subscriptions.forEach((s) => s.onDisconnect());
208
- },
209
- onAbort() {
210
- subscriptions.forEach((s) => s.onAbort());
211
- }
212
- };
213
- };
105
+ const getSubscriptionManager = (onMessage) => addSubscription(chainHeadFollow(onMessage));
214
106
 
215
- // src/get-sync-provider.ts
216
- var getSyncProvider = (input) => (onMessage) => {
107
+ const getSyncProvider = (input) => (onMessage) => {
217
108
  let provider;
218
109
  let bufferedMessages = [];
219
110
  const pendingResponses = /* @__PURE__ */ new Set();
@@ -235,29 +126,24 @@ var getSyncProvider = (input) => (onMessage) => {
235
126
  onMessage(message);
236
127
  };
237
128
  const send = (message) => {
238
- if (!provider)
239
- return;
129
+ if (!provider) return;
240
130
  const parsed = JSON.parse(message);
241
131
  subscriptionManager.onSent(parsed);
242
- if (parsed.id)
243
- pendingResponses.add(parsed.id);
132
+ if (parsed.id) pendingResponses.add(parsed.id);
244
133
  if (provider instanceof Promise) {
245
134
  bufferedMessages.push(message);
246
- } else
247
- provider.send(message);
135
+ } else provider.send(message);
248
136
  };
249
137
  const onHalt = () => {
250
138
  bufferedMessages = [];
251
139
  const pendingResponsesCopy = [...pendingResponses];
252
140
  pendingResponses.clear();
253
- if (!provider)
254
- throw null;
141
+ if (!provider) throw null;
255
142
  const result = start();
256
143
  subscriptionManager.onAbort();
257
144
  pendingResponsesCopy.forEach((id) => {
258
145
  onMessage(
259
- JSON.stringify({
260
- jsonrpc: "2.0",
146
+ jsonRpcMsg({
261
147
  error: { code: -32603, message: "Internal error" },
262
148
  id
263
149
  })
@@ -267,17 +153,15 @@ var getSyncProvider = (input) => (onMessage) => {
267
153
  };
268
154
  const start = () => {
269
155
  const onResolve = (getProvider) => {
270
- let halted = false;
156
+ let alive = true;
271
157
  const _onHalt = () => {
272
- if (halted)
273
- return;
274
- halted = true;
275
- onHalt();
158
+ if (alive) {
159
+ alive = false;
160
+ onHalt();
161
+ }
276
162
  };
277
163
  const _onMessageProxy = (msg) => {
278
- if (halted)
279
- return;
280
- onMessageProxy(msg);
164
+ if (alive) onMessageProxy(msg);
281
165
  };
282
166
  const result = getProvider(_onMessageProxy, _onHalt);
283
167
  bufferedMessages.forEach((m) => {
@@ -290,8 +174,7 @@ var getSyncProvider = (input) => (onMessage) => {
290
174
  return provider;
291
175
  };
292
176
  const disconnect = () => {
293
- if (!provider)
294
- return;
177
+ if (!provider) return;
295
178
  const finishIt = (input2) => {
296
179
  subscriptionManager.onDisconnect();
297
180
  pendingResponses.clear();
@@ -301,8 +184,7 @@ var getSyncProvider = (input) => (onMessage) => {
301
184
  if (provider instanceof Promise) {
302
185
  provider.then(finishIt, finishIt);
303
186
  provider = null;
304
- } else
305
- finishIt(provider);
187
+ } else finishIt(provider);
306
188
  };
307
189
  start();
308
190
  return {
@@ -310,5 +192,7 @@ var getSyncProvider = (input) => (onMessage) => {
310
192
  disconnect
311
193
  };
312
194
  };
313
- var withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
314
- //# sourceMappingURL=index.js.map
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_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: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (!NOTIFICATION_METHODS.has(parsed.method)) return null\n\n return parsed.params.result.event === STOP_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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: STOP_EVENT,\n },\n },\n }),\n )\n },\n }\n}\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst versions = [\"v1\", \"unstable\"] as const\nconst groupNames = [\"transactionWatch\", \"transaction\"] as const\nconst groupNameVersionPermutations = versions\n .map((v) => groupNames.map((g) => [v, g] as const))\n .flat()\n\nconst [START_METHODS, STOP_METHODS] = [\"submitAndWatch\", \"unwatch\"].map(\n (name) =>\n new Set(\n groupNameVersionPermutations.map(\n ([version, groupName]) => `${groupName}_${version}_${name}`,\n ),\n ),\n)\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 let notificationMethod = \"\"\n return {\n onSent(parsed) {\n if (START_METHODS.has(parsed.method)) {\n if (!notificationMethod) {\n const [groupName, version] = (parsed.method as string).split(\"_\")\n notificationMethod = [groupName, version, \"watchEvent\"].join(\"_\")\n }\n return {\n type: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (notificationMethod !== parsed.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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\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_METHODS","STOP_METHODS","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.1.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.1"
38
+ "@polkadot-api/json-rpc-provider": "0.0.2"
44
39
  },
45
40
  "scripts": {
46
- "build": "tsc --noEmit && tsup-node src/index.ts --clean --sourcemap --platform neutral --target=es2020 --format esm,cjs --dts && tsup-node src/index.ts --clean --sourcemap --platform neutral --target=es2020 --format cjs --dts --minify --out-dir dist/min",
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,291 +0,0 @@
1
- // src/subscription-manager/chainHeadFollow.ts
2
- var [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
3
- "follow",
4
- "unfollow",
5
- "followEvent"
6
- ].map(
7
- (name) => new Set(
8
- ["v1", "unstable"].map((version) => `chainHead_${version}_${name}`)
9
- )
10
- );
11
- var STOP_EVENT = "stop";
12
- var chainHeadFollow = (onMessage) => {
13
- let notificationMethod = "";
14
- return {
15
- onSent(parsed) {
16
- if (START_METHODS.has(parsed.method)) {
17
- notificationMethod = parsed.method + "Event";
18
- return {
19
- type: "subscribe",
20
- id: parsed.id,
21
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
22
- };
23
- }
24
- if (STOP_METHODS.has(parsed.method))
25
- return {
26
- type: "unsubscribe",
27
- id: Object.values(parsed.params)[0]
28
- };
29
- return null;
30
- },
31
- onNotification(parsed) {
32
- if (!NOTIFICATION_METHODS.has(parsed.method))
33
- return null;
34
- return parsed.params.result.event === STOP_EVENT ? {
35
- type: "end",
36
- id: parsed.params.subscription
37
- } : null;
38
- },
39
- onAbort: (id) => {
40
- onMessage(
41
- JSON.stringify({
42
- jsonrpc: "2.0",
43
- method: notificationMethod,
44
- params: {
45
- subscription: id,
46
- result: {
47
- event: STOP_EVENT
48
- }
49
- }
50
- })
51
- );
52
- }
53
- };
54
- };
55
-
56
- // src/subscription-manager/transaction-submit-watch.ts
57
- var versions = ["v1", "unstable"];
58
- var groupNames = ["transactionWatch", "transaction"];
59
- var groupNameVersionPermutations = versions.map((v) => groupNames.map((g) => [v, g])).flat();
60
- var [START_METHODS2, STOP_METHODS2] = ["submitAndWatch", "unwatch"].map(
61
- (name) => new Set(
62
- groupNameVersionPermutations.map(
63
- ([version, groupName]) => `${groupName}_${version}_${name}`
64
- )
65
- )
66
- );
67
- var ABORT_EVENT = "dropped";
68
- var terminalEvents = /* @__PURE__ */ new Set([ABORT_EVENT, "finalized", "error", "invalid"]);
69
- var txSubmitAndWatch = (onMessage) => {
70
- let notificationMethod = "";
71
- return {
72
- onSent(parsed) {
73
- if (START_METHODS2.has(parsed.method)) {
74
- if (!notificationMethod) {
75
- const [groupName, version] = parsed.method.split("_");
76
- notificationMethod = [groupName, version, "watchEvent"].join("_");
77
- }
78
- return {
79
- type: "subscribe",
80
- id: parsed.id,
81
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
82
- };
83
- }
84
- if (STOP_METHODS2.has(parsed.method))
85
- return {
86
- type: "unsubscribe",
87
- id: Object.values(parsed.params)[0]
88
- };
89
- return null;
90
- },
91
- onNotification(parsed) {
92
- if (notificationMethod !== parsed.method)
93
- return null;
94
- return terminalEvents.has(parsed.params.result.event) ? {
95
- type: "end",
96
- id: parsed.params.subscription
97
- } : null;
98
- },
99
- onAbort: (id) => {
100
- onMessage(
101
- JSON.stringify({
102
- jsonrpc: "2.0",
103
- method: notificationMethod,
104
- params: {
105
- subscription: id,
106
- result: {
107
- event: ABORT_EVENT
108
- }
109
- }
110
- })
111
- );
112
- }
113
- };
114
- };
115
-
116
- // src/subscription-manager/subscription-manager.ts
117
- var addSubscription = ({
118
- onSent,
119
- onNotification,
120
- onAbort
121
- }) => {
122
- const preActive = /* @__PURE__ */ new Map();
123
- const active = /* @__PURE__ */ new Set();
124
- const onDisconnect = () => {
125
- preActive.clear();
126
- active.clear();
127
- };
128
- return {
129
- onSent(parsed) {
130
- const result = onSent(parsed);
131
- if (!result)
132
- return;
133
- if (result.type === "subscribe") {
134
- preActive.set(result.id, result.onRes);
135
- } else {
136
- active.delete(result.id);
137
- }
138
- },
139
- onResponse(parsed) {
140
- const match = preActive.get(parsed.id)?.(parsed);
141
- if (!match)
142
- return;
143
- preActive.delete(parsed.id);
144
- active.add(match.id);
145
- },
146
- onNotifiaction(parsed) {
147
- const result = onNotification(parsed);
148
- if (!result)
149
- return;
150
- active.delete(result.id);
151
- },
152
- onDisconnect,
153
- onAbort() {
154
- const activeCopy = [...active];
155
- onDisconnect();
156
- activeCopy.forEach(onAbort);
157
- }
158
- };
159
- };
160
- var getSubscriptionManager = (onMessage) => {
161
- const subscriptions = [chainHeadFollow, txSubmitAndWatch].map(
162
- (logic) => addSubscription(logic(onMessage))
163
- );
164
- return {
165
- onSent(parsed) {
166
- subscriptions.forEach((s) => {
167
- s.onSent(parsed);
168
- });
169
- },
170
- onResponse(parsed) {
171
- subscriptions.forEach((s) => {
172
- s.onResponse(parsed);
173
- });
174
- },
175
- onNotifiaction(parsed) {
176
- subscriptions.forEach((s) => {
177
- s.onNotifiaction(parsed);
178
- });
179
- },
180
- onDisconnect() {
181
- subscriptions.forEach((s) => s.onDisconnect());
182
- },
183
- onAbort() {
184
- subscriptions.forEach((s) => s.onAbort());
185
- }
186
- };
187
- };
188
-
189
- // src/get-sync-provider.ts
190
- var getSyncProvider = (input) => (onMessage) => {
191
- let provider;
192
- let bufferedMessages = [];
193
- const pendingResponses = /* @__PURE__ */ new Set();
194
- const subscriptionManager = getSubscriptionManager(onMessage);
195
- const onMessageProxy = (message) => {
196
- let parsed;
197
- try {
198
- parsed = JSON.parse(message);
199
- } catch (_) {
200
- console.error(`Unable to parse incoming message: ${message}`);
201
- return;
202
- }
203
- if (parsed.id !== void 0) {
204
- pendingResponses.delete(parsed.id);
205
- subscriptionManager.onResponse(parsed);
206
- } else {
207
- subscriptionManager.onNotifiaction(parsed);
208
- }
209
- onMessage(message);
210
- };
211
- const send = (message) => {
212
- if (!provider)
213
- return;
214
- const parsed = JSON.parse(message);
215
- subscriptionManager.onSent(parsed);
216
- if (parsed.id)
217
- pendingResponses.add(parsed.id);
218
- if (provider instanceof Promise) {
219
- bufferedMessages.push(message);
220
- } else
221
- provider.send(message);
222
- };
223
- const onHalt = () => {
224
- bufferedMessages = [];
225
- const pendingResponsesCopy = [...pendingResponses];
226
- pendingResponses.clear();
227
- if (!provider)
228
- throw null;
229
- const result = start();
230
- subscriptionManager.onAbort();
231
- pendingResponsesCopy.forEach((id) => {
232
- onMessage(
233
- JSON.stringify({
234
- jsonrpc: "2.0",
235
- error: { code: -32603, message: "Internal error" },
236
- id
237
- })
238
- );
239
- });
240
- return result;
241
- };
242
- const start = () => {
243
- const onResolve = (getProvider) => {
244
- let halted = false;
245
- const _onHalt = () => {
246
- if (halted)
247
- return;
248
- halted = true;
249
- onHalt();
250
- };
251
- const _onMessageProxy = (msg) => {
252
- if (halted)
253
- return;
254
- onMessageProxy(msg);
255
- };
256
- const result = getProvider(_onMessageProxy, _onHalt);
257
- bufferedMessages.forEach((m) => {
258
- result.send(m);
259
- });
260
- bufferedMessages = [];
261
- return provider = result;
262
- };
263
- provider = input().then(onResolve, withMacroTask(onHalt));
264
- return provider;
265
- };
266
- const disconnect = () => {
267
- if (!provider)
268
- return;
269
- const finishIt = (input2) => {
270
- subscriptionManager.onDisconnect();
271
- pendingResponses.clear();
272
- provider = null;
273
- input2?.disconnect();
274
- };
275
- if (provider instanceof Promise) {
276
- provider.then(finishIt, finishIt);
277
- provider = null;
278
- } else
279
- finishIt(provider);
280
- };
281
- start();
282
- return {
283
- send,
284
- disconnect
285
- };
286
- };
287
- var withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
288
- export {
289
- getSyncProvider
290
- };
291
- //# sourceMappingURL=index.mjs.map
@@ -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_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: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (!NOTIFICATION_METHODS.has(parsed.method)) return null\n\n return parsed.params.result.event === STOP_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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: STOP_EVENT,\n },\n },\n }),\n )\n },\n }\n}\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst versions = [\"v1\", \"unstable\"] as const\nconst groupNames = [\"transactionWatch\", \"transaction\"] as const\nconst groupNameVersionPermutations = versions\n .map((v) => groupNames.map((g) => [v, g] as const))\n .flat()\n\nconst [START_METHODS, STOP_METHODS] = [\"submitAndWatch\", \"unwatch\"].map(\n (name) =>\n new Set(\n groupNameVersionPermutations.map(\n ([version, groupName]) => `${groupName}_${version}_${name}`,\n ),\n ),\n)\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 let notificationMethod = \"\"\n return {\n onSent(parsed) {\n if (START_METHODS.has(parsed.method)) {\n if (!notificationMethod) {\n const [groupName, version] = (parsed.method as string).split(\"_\")\n notificationMethod = [groupName, version, \"watchEvent\"].join(\"_\")\n }\n return {\n type: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (notificationMethod !== parsed.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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\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":";AAEA,IAAM,CAAC,eAAe,cAAc,oBAAoB,IAAI;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,EAAE;AAAA,EACA,CAAC,SACC,IAAI;AAAA,IACF,CAAC,MAAM,UAAU,EAAE,IAAI,CAAC,YAAY,aAAa,OAAO,IAAI,IAAI,EAAE;AAAA,EACpE;AACJ;AACA,IAAM,aAAa;AAEZ,IAAM,kBAAkB,CAC7B,cACsB;AACtB,MAAI,qBAAqB;AACzB,SAAO;AAAA,IACL,OAAO,QAAQ;AACb,UAAI,cAAc,IAAI,OAAO,MAAM,GAAG;AACpC,6BAAqB,OAAO,SAAS;AACrC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,OAAO,CAAC,gBACN,YAAY,OAAO,OAAO,KAAK,EAAE,IAAI,YAAY,OAAO,IAAI;AAAA,QAChE;AAAA,MACF;AAEA,UAAI,aAAa,IAAI,OAAO,MAAM;AAChC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,QACpC;AAEF,aAAO;AAAA,IACT;AAAA,IACA,eAAe,QAAQ;AACrB,UAAI,CAAC,qBAAqB,IAAI,OAAO,MAAM;AAAG,eAAO;AAErD,aAAO,OAAO,OAAO,OAAO,UAAU,aAClC;AAAA,QACE,MAAM;AAAA,QACN,IAAI,OAAO,OAAO;AAAA,MACpB,IACA;AAAA,IACN;AAAA,IACA,SAAS,CAAC,OAAO;AACf;AAAA,QACE,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,cAAc;AAAA,YACd,QAAQ;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC7DA,IAAM,WAAW,CAAC,MAAM,UAAU;AAClC,IAAM,aAAa,CAAC,oBAAoB,aAAa;AACrD,IAAM,+BAA+B,SAClC,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAU,CAAC,EACjD,KAAK;AAER,IAAM,CAACA,gBAAeC,aAAY,IAAI,CAAC,kBAAkB,SAAS,EAAE;AAAA,EAClE,CAAC,SACC,IAAI;AAAA,IACF,6BAA6B;AAAA,MAC3B,CAAC,CAAC,SAAS,SAAS,MAAM,GAAG,SAAS,IAAI,OAAO,IAAI,IAAI;AAAA,IAC3D;AAAA,EACF;AACJ;AACA,IAAM,cAAc;AAEpB,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,aAAa,SAAS,SAAS,CAAC;AAEtE,IAAM,mBAAmB,CAC9B,cACsB;AACtB,MAAI,qBAAqB;AACzB,SAAO;AAAA,IACL,OAAO,QAAQ;AACb,UAAID,eAAc,IAAI,OAAO,MAAM,GAAG;AACpC,YAAI,CAAC,oBAAoB;AACvB,gBAAM,CAAC,WAAW,OAAO,IAAK,OAAO,OAAkB,MAAM,GAAG;AAChE,+BAAqB,CAAC,WAAW,SAAS,YAAY,EAAE,KAAK,GAAG;AAAA,QAClE;AACA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,OAAO,CAAC,gBACN,YAAY,OAAO,OAAO,KAAK,EAAE,IAAI,YAAY,OAAO,IAAI;AAAA,QAChE;AAAA,MACF;AAEA,UAAIC,cAAa,IAAI,OAAO,MAAM;AAChC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,QACpC;AAEF,aAAO;AAAA,IACT;AAAA,IACA,eAAe,QAAQ;AACrB,UAAI,uBAAuB,OAAO;AAAQ,eAAO;AAEjD,aAAO,eAAe,IAAI,OAAO,OAAO,OAAO,KAAK,IAChD;AAAA,QACE,MAAM;AAAA,QACN,IAAI,OAAO,OAAO;AAAA,MACpB,IACA;AAAA,IACN;AAAA,IACA,SAAS,CAAC,OAAO;AACf;AAAA,QACE,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,cAAc;AAAA,YACd,QAAQ;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AChEO,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,QAAM,YAAY,oBAAI,IAGpB;AACF,QAAM,SAAS,oBAAI,IAAoB;AAEvC,QAAM,eAAe,MAAM;AACzB,cAAU,MAAM;AAChB,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AAAA,IACL,OAAO,QAAa;AAClB,YAAM,SAAS,OAAO,MAAM;AAC5B,UAAI,CAAC;AAAQ;AACb,UAAI,OAAO,SAAS,aAAa;AAC/B,kBAAU,IAAI,OAAO,IAAI,OAAO,KAAK;AAAA,MACvC,OAAO;AACL,eAAO,OAAO,OAAO,EAAE;AAAA,MACzB;AAAA,IACF;AAAA,IACA,WAAW,QAAa;AACtB,YAAM,QAAQ,UAAU,IAAI,OAAO,EAAE,IAAI,MAAM;AAC/C,UAAI,CAAC;AAAO;AACZ,gBAAU,OAAO,OAAO,EAAE;AAC1B,aAAO,IAAI,MAAM,EAAE;AAAA,IACrB;AAAA,IACA,eAAe,QAAa;AAC1B,YAAM,SAAS,eAAe,MAAM;AACpC,UAAI,CAAC;AAAQ;AACb,aAAO,OAAO,OAAO,EAAE;AAAA,IACzB;AAAA,IACA;AAAA,IACA,UAAU;AACR,YAAM,aAAa,CAAC,GAAG,MAAM;AAC7B,mBAAa;AACb,iBAAW,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,IAAM,yBAAyB,CAAC,cAAqC;AAC1E,QAAM,gBAAgB,CAAC,iBAAiB,gBAAgB,EAAE;AAAA,IAAI,CAAC,UAC7D,gBAAgB,MAAM,SAAS,CAAC;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,OAAO,QAAa;AAClB,oBAAc,QAAQ,CAAC,MAAM;AAC3B,UAAE,OAAO,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IACA,WAAW,QAAa;AACtB,oBAAc,QAAQ,CAAC,MAAM;AAC3B,UAAE,WAAW,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IACA,eAAe,QAAa;AAC1B,oBAAc,QAAQ,CAAC,MAAM;AAC3B,UAAE,eAAe,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,eAAe;AACb,oBAAc,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;AAAA,IAC/C;AAAA,IACA,UAAU;AACR,oBAAc,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AACF;;;ACtEO,IAAM,kBACX,CAAC,UACD,CAAC,cAAc;AAGb,MAAI;AAEJ,MAAI,mBAAkC,CAAC;AACvC,QAAM,mBAAmB,oBAAI,IAAe;AAC5C,QAAM,sBAAsB,uBAAuB,SAAS;AAE5D,QAAM,iBAAiB,CAAC,YAAoB;AAC1C,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,GAAG;AACV,cAAQ,MAAM,qCAAqC,OAAO,EAAE;AAC5D;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,QAAW;AAC3B,uBAAiB,OAAO,OAAO,EAAE;AACjC,0BAAoB,WAAW,MAAM;AAAA,IACvC,OAAO;AACL,0BAAoB,eAAe,MAAM;AAAA,IAC3C;AAEA,cAAU,OAAO;AAAA,EACnB;AAEA,QAAM,OAAO,CAAC,YAAoB;AAChC,QAAI,CAAC;AAAU;AAEf,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,wBAAoB,OAAO,MAAM;AACjC,QAAI,OAAO;AAAI,uBAAiB,IAAI,OAAO,EAAE;AAE7C,QAAI,oBAAoB,SAAS;AAC/B,uBAAiB,KAAK,OAAO;AAAA,IAC/B;AAAO,eAAS,KAAK,OAAO;AAAA,EAC9B;AAEA,QAAM,SAAS,MAAkC;AAC/C,uBAAmB,CAAC;AACpB,UAAM,uBAAuB,CAAC,GAAG,gBAAgB;AACjD,qBAAiB,MAAM;AAMvB,QAAI,CAAC;AAAU,YAAM;AAKrB,UAAM,SAAS,MAAM;AAErB,wBAAoB,QAAQ;AAC5B,yBAAqB,QAAQ,CAAC,OAAO;AACnC;AAAA,QACE,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,OAAO,EAAE,MAAM,QAAQ,SAAS,iBAAiB;AAAA,UACjD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAkC;AAC9C,UAAM,YAAY,CAAC,gBAAsC;AACvD,UAAI,SAAS;AACb,YAAM,UAAU,MAAM;AACpB,YAAI;AAAQ;AACZ,iBAAS;AACT,eAAO;AAAA,MACT;AACA,YAAM,kBAAkB,CAAC,QAAgB;AACvC,YAAI;AAAQ;AACZ,uBAAe,GAAG;AAAA,MACpB;AAEA,YAAM,SAAS,YAAY,iBAAiB,OAAO;AACnD,uBAAiB,QAAQ,CAAC,MAAM;AAC9B,eAAO,KAAK,CAAC;AAAA,MACf,CAAC;AACD,yBAAmB,CAAC;AACpB,aAAQ,WAAW;AAAA,IACrB;AAEA,eAAW,MAAM,EAAE,KAAK,WAAW,cAAc,MAAM,CAAC;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC;AAAU;AAEf,UAAM,WAAW,CAACC,WAAoC;AACpD,0BAAoB,aAAa;AACjC,uBAAiB,MAAM;AACvB,iBAAW;AACX,MAAAA,QAAO,WAAW;AAAA,IACpB;AAEA,QAAI,oBAAoB,SAAS;AAC/B,eAAS,KAAK,UAAU,QAAQ;AAChC,iBAAW;AAAA,IACb;AAAO,eAAS,QAAQ;AAAA,EAC1B;AAEA,QAAM;AACN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEF,IAAM,gBACJ,CACE,YAEF,IAAI,SACF,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;","names":["START_METHODS","STOP_METHODS","input"]}
@@ -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 T=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var P=(e,t)=>{for(var n in t)d(e,n,{get:t[n],enumerable:!0})},N=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of T(t))!E.call(e,s)&&s!==n&&d(e,s,{get:()=>t[s],enumerable:!(o=A(t,s))||o.enumerable});return e};var O=e=>N(d({},"__esModule",{value:!0}),e);var q={};P(q,{getSyncProvider:()=>L});module.exports=O(q);var[_,J,w]=["follow","unfollow","followEvent"].map(e=>new Set(["v1","unstable"].map(t=>`chainHead_${t}_${e}`))),h="stop",S=e=>{let t="";return{onSent(n){return _.has(n.method)?(t=n.method+"Event",{type:"subscribe",id:n.id,onRes:o=>o.id===n.id?{id:o.result}:null}):J.has(n.method)?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return w.has(n.method)&&n.params.result.event===h?{type:"end",id:n.params.subscription}:null},onAbort:n=>{e(JSON.stringify({jsonrpc:"2.0",method:t,params:{subscription:n,result:{event:h}}}))}}};var I=["v1","unstable"],M=["transactionWatch","transaction"],x=I.map(e=>M.map(t=>[e,t])).flat(),[H,C]=["submitAndWatch","unwatch"].map(e=>new Set(x.map(([t,n])=>`${n}_${t}_${e}`))),g="dropped",D=new Set([g,"finalized","error","invalid"]),y=e=>{let t="";return{onSent(n){if(H.has(n.method)){if(!t){let[o,s]=n.method.split("_");t=[o,s,"watchEvent"].join("_")}return{type:"subscribe",id:n.id,onRes:o=>o.id===n.id?{id:o.result}:null}}return C.has(n.method)?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return t!==n.method?null:D.has(n.params.result.event)?{type:"end",id:n.params.subscription}:null},onAbort:n=>{e(JSON.stringify({jsonrpc:"2.0",method:t,params:{subscription:n,result:{event:g}}}))}}};var j=({onSent:e,onNotification:t,onAbort:n})=>{let o=new Map,s=new Set,u=()=>{o.clear(),s.clear()};return{onSent(a){let c=e(a);c&&(c.type==="subscribe"?o.set(c.id,c.onRes):s.delete(c.id))},onResponse(a){let c=o.get(a.id)?.(a);c&&(o.delete(a.id),s.add(c.id))},onNotifiaction(a){let c=t(a);c&&s.delete(c.id)},onDisconnect:u,onAbort(){let a=[...s];u(),a.forEach(n)}}},v=e=>{let t=[S,y].map(n=>j(n(e)));return{onSent(n){t.forEach(o=>{o.onSent(n)})},onResponse(n){t.forEach(o=>{o.onResponse(n)})},onNotifiaction(n){t.forEach(o=>{o.onNotifiaction(n)})},onDisconnect(){t.forEach(n=>n.onDisconnect())},onAbort(){t.forEach(n=>n.onAbort())}}};var L=e=>t=>{let n,o=[],s=new Set,u=v(t),a=i=>{let r;try{r=JSON.parse(i)}catch{console.error(`Unable to parse incoming message: ${i}`);return}r.id!==void 0?(s.delete(r.id),u.onResponse(r)):u.onNotifiaction(r),t(i)},c=i=>{if(!n)return;let r=JSON.parse(i);u.onSent(r),r.id&&s.add(r.id),n instanceof Promise?o.push(i):n.send(i)},m=()=>{o=[];let i=[...s];if(s.clear(),!n)throw null;let r=f();return u.onAbort(),i.forEach(p=>{t(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:p}))}),r},f=()=>{let i=r=>{let p=!1,b=r(l=>{p||a(l)},()=>{p||(p=!0,m())});return o.forEach(l=>{b.send(l)}),o=[],n=b};return n=e().then(i,$(m)),n},R=()=>{if(!n)return;let i=r=>{u.onDisconnect(),s.clear(),n=null,r?.disconnect()};n instanceof Promise?(n.then(i,i),n=null):i(n)};return f(),{send:c,disconnect:R}},$=e=>(...t)=>new Promise(n=>setTimeout(n,0)).then(()=>e(...t));
2
- //# sourceMappingURL=index.js.map
@@ -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_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: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (!NOTIFICATION_METHODS.has(parsed.method)) return null\n\n return parsed.params.result.event === STOP_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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: STOP_EVENT,\n },\n },\n }),\n )\n },\n }\n}\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst versions = [\"v1\", \"unstable\"] as const\nconst groupNames = [\"transactionWatch\", \"transaction\"] as const\nconst groupNameVersionPermutations = versions\n .map((v) => groupNames.map((g) => [v, g] as const))\n .flat()\n\nconst [START_METHODS, STOP_METHODS] = [\"submitAndWatch\", \"unwatch\"].map(\n (name) =>\n new Set(\n groupNameVersionPermutations.map(\n ([version, groupName]) => `${groupName}_${version}_${name}`,\n ),\n ),\n)\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 let notificationMethod = \"\"\n return {\n onSent(parsed) {\n if (START_METHODS.has(parsed.method)) {\n if (!notificationMethod) {\n const [groupName, version] = (parsed.method as string).split(\"_\")\n notificationMethod = [groupName, version, \"watchEvent\"].join(\"_\")\n }\n return {\n type: \"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: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (notificationMethod !== parsed.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: notificationMethod,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\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_METHODS","STOP_METHODS","NOTIFICATION_METHODS","name","version","STOP_EVENT","chainHeadFollow","onMessage","notificationMethod","parsed","innerParsed","id","versions","groupNames","groupNameVersionPermutations","v","g","START_METHODS","STOP_METHODS","name","version","groupName","ABORT_EVENT","terminalEvents","txSubmitAndWatch","onMessage","notificationMethod","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"]}