@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.
- 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 +48 -164
- package/dist/index.js.map +1 -1
- package/package.json +9 -14
- package/dist/index.d.mts +0 -6
- package/dist/index.mjs +0 -291
- 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
|
@@ -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":";;;AAaO,MAAM,eACX,GAAA,CAAC,KACD,KAAA,CAAC,SAAc,KAAA;AAGb,EAAI,IAAA,QAAA,CAAA;AAEJ,EAAA,IAAI,mBAAkC,EAAC,CAAA;AACvC,EAAM,MAAA,gBAAA,uBAAuB,GAAe,EAAA,CAAA;AAC5C,EAAM,MAAA,mBAAA,GAAsB,uBAAuB,SAAS,CAAA,CAAA;AAE5D,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAoB,KAAA;AAC1C,IAAI,IAAA,MAAA,CAAA;AACJ,IAAI,IAAA;AACF,MAAS,MAAA,GAAA,IAAA,CAAK,MAAM,OAAO,CAAA,CAAA;AAAA,aACpB,CAAG,EAAA;AACV,MAAQ,OAAA,CAAA,KAAA,CAAM,CAAqC,kCAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAC5D,MAAA,OAAA;AAAA,KACF;AAEA,IAAI,IAAA,MAAA,CAAO,OAAO,KAAW,CAAA,EAAA;AAC3B,MAAiB,gBAAA,CAAA,MAAA,CAAO,OAAO,EAAE,CAAA,CAAA;AACjC,MAAA,mBAAA,CAAoB,WAAW,MAAM,CAAA,CAAA;AAAA,KAChC,MAAA;AACL,MAAA,mBAAA,CAAoB,eAAe,MAAM,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,GACnB,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,CAAC,OAAoB,KAAA;AAChC,IAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAEf,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACjC,IAAA,mBAAA,CAAoB,OAAO,MAAM,CAAA,CAAA;AACjC,IAAA,IAAI,MAAO,CAAA,EAAA,EAAqB,gBAAA,CAAA,GAAA,CAAI,OAAO,EAAE,CAAA,CAAA;AAE7C,IAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,MAAA,gBAAA,CAAiB,KAAK,OAAO,CAAA,CAAA;AAAA,KAC/B,MAAgB,QAAA,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GAC9B,CAAA;AAEA,EAAA,MAAM,SAAS,MAAkC;AAC/C,IAAA,gBAAA,GAAmB,EAAC,CAAA;AACpB,IAAM,MAAA,oBAAA,GAAuB,CAAC,GAAG,gBAAgB,CAAA,CAAA;AACjD,IAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AAMvB,IAAI,IAAA,CAAC,UAAgB,MAAA,IAAA,CAAA;AAKrB,IAAA,MAAM,SAAS,KAAM,EAAA,CAAA;AAErB,IAAA,mBAAA,CAAoB,OAAQ,EAAA,CAAA;AAC5B,IAAqB,oBAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACnC,MAAA,SAAA;AAAA,QACE,UAAW,CAAA;AAAA,UACT,KAAO,EAAA,EAAE,IAAM,EAAA,CAAA,KAAA,EAAQ,SAAS,gBAAiB,EAAA;AAAA,UACjD,EAAA;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAkC;AAC9C,IAAM,MAAA,SAAA,GAAY,CAAC,WAAsC,KAAA;AACvD,MAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AACZ,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI,KAAO,EAAA;AACT,UAAQ,KAAA,GAAA,KAAA,CAAA;AACR,UAAO,MAAA,EAAA,CAAA;AAAA,SACT;AAAA,OACF,CAAA;AAEA,MAAM,MAAA,eAAA,GAAkB,CAAC,GAAgB,KAAA;AACvC,QAAI,IAAA,KAAA,iBAAsB,GAAG,CAAA,CAAA;AAAA,OAC/B,CAAA;AAEA,MAAM,MAAA,MAAA,GAAS,WAAY,CAAA,eAAA,EAAiB,OAAO,CAAA,CAAA;AACnD,MAAiB,gBAAA,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC9B,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,OACd,CAAA,CAAA;AACD,MAAA,gBAAA,GAAmB,EAAC,CAAA;AACpB,MAAA,OAAQ,QAAW,GAAA,MAAA,CAAA;AAAA,KACrB,CAAA;AAEA,IAAA,QAAA,GAAW,OAAQ,CAAA,IAAA,CAAK,SAAW,EAAA,aAAA,CAAc,MAAM,CAAC,CAAA,CAAA;AACxD,IAAO,OAAA,QAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAEf,IAAM,MAAA,QAAA,GAAW,CAACA,MAAoC,KAAA;AACpD,MAAA,mBAAA,CAAoB,YAAa,EAAA,CAAA;AACjC,MAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AACvB,MAAW,QAAA,GAAA,IAAA,CAAA;AACX,MAAAA,QAAO,UAAW,EAAA,CAAA;AAAA,KACpB,CAAA;AAEA,IAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,MAAS,QAAA,CAAA,IAAA,CAAK,UAAU,QAAQ,CAAA,CAAA;AAChC,MAAW,QAAA,GAAA,IAAA,CAAA;AAAA,KACb,eAAgB,QAAQ,CAAA,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAM,KAAA,EAAA,CAAA;AACN,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,GACF,CAAA;AACF,EAAA;AAEF,MAAM,gBACJ,CACE,OAAA,KAEF,IAAI,IACF,KAAA,IAAI,QAAQ,CAAC,GAAA,KAAQ,WAAW,GAAK,EAAA,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,GAAG,IAAI,CAAC,CAAA;;;;"}
|
|
@@ -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,31 +1,18 @@
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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 (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
156
|
+
let alive = true;
|
|
271
157
|
const _onHalt = () => {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
158
|
+
if (alive) {
|
|
159
|
+
alive = false;
|
|
160
|
+
onHalt();
|
|
161
|
+
}
|
|
276
162
|
};
|
|
277
163
|
const _onMessageProxy = (msg) => {
|
|
278
|
-
if (
|
|
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
|
-
|
|
314
|
-
|
|
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":";;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,CAAA;;ACRX,MAAM,UAAa,GAAA,CAAe,GACvC,KAAA,IAAA,CAAK,SAAU,CAAA;AAAA,EACb,OAAS,EAAA,KAAA;AAAA,EACT,GAAG,GAAA;AACL,CAAC,CAAA;;ACGH,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,CAAA;;AC1DO,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,CAAA,CAAA;AAEO,MAAM,yBAAyB,CAAC,SAAA,KACrC,eAAgB,CAAA,eAAA,CAAgB,SAAS,CAAC,CAAA;;ACzCrC,MAAM,eACX,GAAA,CAAC,KACD,KAAA,CAAC,SAAc,KAAA;AAGb,EAAI,IAAA,QAAA,CAAA;AAEJ,EAAA,IAAI,mBAAkC,EAAC,CAAA;AACvC,EAAM,MAAA,gBAAA,uBAAuB,GAAe,EAAA,CAAA;AAC5C,EAAM,MAAA,mBAAA,GAAsB,uBAAuB,SAAS,CAAA,CAAA;AAE5D,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAoB,KAAA;AAC1C,IAAI,IAAA,MAAA,CAAA;AACJ,IAAI,IAAA;AACF,MAAS,MAAA,GAAA,IAAA,CAAK,MAAM,OAAO,CAAA,CAAA;AAAA,aACpB,CAAG,EAAA;AACV,MAAQ,OAAA,CAAA,KAAA,CAAM,CAAqC,kCAAA,EAAA,OAAO,CAAE,CAAA,CAAA,CAAA;AAC5D,MAAA,OAAA;AAAA,KACF;AAEA,IAAI,IAAA,MAAA,CAAO,OAAO,KAAW,CAAA,EAAA;AAC3B,MAAiB,gBAAA,CAAA,MAAA,CAAO,OAAO,EAAE,CAAA,CAAA;AACjC,MAAA,mBAAA,CAAoB,WAAW,MAAM,CAAA,CAAA;AAAA,KAChC,MAAA;AACL,MAAA,mBAAA,CAAoB,eAAe,MAAM,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,GACnB,CAAA;AAEA,EAAM,MAAA,IAAA,GAAO,CAAC,OAAoB,KAAA;AAChC,IAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAEf,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACjC,IAAA,mBAAA,CAAoB,OAAO,MAAM,CAAA,CAAA;AACjC,IAAA,IAAI,MAAO,CAAA,EAAA,EAAqB,gBAAA,CAAA,GAAA,CAAI,OAAO,EAAE,CAAA,CAAA;AAE7C,IAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,MAAA,gBAAA,CAAiB,KAAK,OAAO,CAAA,CAAA;AAAA,KAC/B,MAAgB,QAAA,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GAC9B,CAAA;AAEA,EAAA,MAAM,SAAS,MAAkC;AAC/C,IAAA,gBAAA,GAAmB,EAAC,CAAA;AACpB,IAAM,MAAA,oBAAA,GAAuB,CAAC,GAAG,gBAAgB,CAAA,CAAA;AACjD,IAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AAMvB,IAAI,IAAA,CAAC,UAAgB,MAAA,IAAA,CAAA;AAKrB,IAAA,MAAM,SAAS,KAAM,EAAA,CAAA;AAErB,IAAA,mBAAA,CAAoB,OAAQ,EAAA,CAAA;AAC5B,IAAqB,oBAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACnC,MAAA,SAAA;AAAA,QACE,UAAW,CAAA;AAAA,UACT,KAAO,EAAA,EAAE,IAAM,EAAA,CAAA,KAAA,EAAQ,SAAS,gBAAiB,EAAA;AAAA,UACjD,EAAA;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAkC;AAC9C,IAAM,MAAA,SAAA,GAAY,CAAC,WAAsC,KAAA;AACvD,MAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AACZ,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI,KAAO,EAAA;AACT,UAAQ,KAAA,GAAA,KAAA,CAAA;AACR,UAAO,MAAA,EAAA,CAAA;AAAA,SACT;AAAA,OACF,CAAA;AAEA,MAAM,MAAA,eAAA,GAAkB,CAAC,GAAgB,KAAA;AACvC,QAAI,IAAA,KAAA,iBAAsB,GAAG,CAAA,CAAA;AAAA,OAC/B,CAAA;AAEA,MAAM,MAAA,MAAA,GAAS,WAAY,CAAA,eAAA,EAAiB,OAAO,CAAA,CAAA;AACnD,MAAiB,gBAAA,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC9B,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,OACd,CAAA,CAAA;AACD,MAAA,gBAAA,GAAmB,EAAC,CAAA;AACpB,MAAA,OAAQ,QAAW,GAAA,MAAA,CAAA;AAAA,KACrB,CAAA;AAEA,IAAA,QAAA,GAAW,OAAQ,CAAA,IAAA,CAAK,SAAW,EAAA,aAAA,CAAc,MAAM,CAAC,CAAA,CAAA;AACxD,IAAO,OAAA,QAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAEf,IAAM,MAAA,QAAA,GAAW,CAACC,MAAoC,KAAA;AACpD,MAAA,mBAAA,CAAoB,YAAa,EAAA,CAAA;AACjC,MAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AACvB,MAAW,QAAA,GAAA,IAAA,CAAA;AACX,MAAAA,QAAO,UAAW,EAAA,CAAA;AAAA,KACpB,CAAA;AAEA,IAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,MAAS,QAAA,CAAA,IAAA,CAAK,UAAU,QAAQ,CAAA,CAAA;AAChC,MAAW,QAAA,GAAA,IAAA,CAAA;AAAA,KACb,eAAgB,QAAQ,CAAA,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAM,KAAA,EAAA,CAAA;AACN,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,GACF,CAAA;AACF,EAAA;AAEF,MAAM,gBACJ,CACE,OAAA,KAEF,IAAI,IACF,KAAA,IAAI,QAAQ,CAAC,GAAA,KAAQ,WAAW,GAAK,EAAA,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,GAAG,IAAI,CAAC,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/json-rpc-provider-proxy",
|
|
3
|
-
"version": "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,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
|
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_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"]}
|
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 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
|
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_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"]}
|