@polkadot-api/json-rpc-provider-proxy 0.1.0 → 0.2.1
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 +57 -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 +50 -165
- package/dist/index.js.map +1 -1
- package/package.json +10 -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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
2
|
+
MessageType2[MessageType2["subscribe"] = 0] = "subscribe";
|
|
3
|
+
MessageType2[MessageType2["unsubscribe"] = 1] = "unsubscribe";
|
|
4
|
+
MessageType2[MessageType2["end"] = 2] = "end";
|
|
5
|
+
return MessageType2;
|
|
6
|
+
})(MessageType || {});
|
|
7
|
+
|
|
8
|
+
export { MessageType };
|
|
9
|
+
//# sourceMappingURL=internal-types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-types.mjs","sources":["../../src/internal-types.ts"],"sourcesContent":["export type RequestId = string | number | null\nexport type SubscriptionId = string | number\nexport type JsonMessage = {\n jsonrpc: \"2.0\"\n method: string\n params: {}\n}\n\nexport const enum MessageType {\n subscribe,\n unsubscribe,\n end,\n}\n\nexport interface SubscriptionLogic {\n onSent: (parsed: any) =>\n | {\n type: MessageType.subscribe\n id: RequestId\n onRes: (parsed: any) => { id: SubscriptionId } | null\n }\n | { type: MessageType.unsubscribe; id: SubscriptionId }\n | null\n onNotification: (\n parsed: any,\n ) => { type: MessageType.end; id: SubscriptionId } | null\n onAbort: (id: SubscriptionId) => void\n}\n"],"names":["MessageType"],"mappings":"AAQkB,IAAA,WAAA,qBAAAA,YAAX,KAAA;AACL,EAAAA,YAAA,CAAA,YAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,YAAA,CAAA,YAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,YAAA,CAAA,YAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA,CAAA;AAHgB,EAAAA,OAAAA,YAAAA,CAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc-message.mjs","sources":["../../src/json-rpc-message.ts"],"sourcesContent":["export const jsonRpcMsg = <T extends {}>(msg: T) =>\n JSON.stringify({\n jsonrpc: \"2.0\",\n ...msg,\n })\n"],"names":[],"mappings":"AAAO,MAAM,UAAa,GAAA,CAAe,GACvC,KAAA,IAAA,CAAK,SAAU,CAAA;AAAA,EACb,OAAS,EAAA,KAAA;AAAA,EACT,GAAG,GAAA;AACL,CAAC;;;;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
eventType: "internal"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { chainHeadFollow };
|
|
57
|
+
//# 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 eventType: \"internal\",\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,cACP,SAAW,EAAA,UAAA;AAAA,aACb;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,103 +21,41 @@ 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:
|
|
53
|
-
id: Object.values(parsed.params)[0]
|
|
54
|
-
};
|
|
55
|
-
return null;
|
|
56
|
-
},
|
|
57
|
-
onNotification(parsed) {
|
|
58
|
-
if (!NOTIFICATION_METHODS.has(parsed.method))
|
|
59
|
-
return null;
|
|
60
|
-
return parsed.params.result.event === STOP_EVENT ? {
|
|
61
|
-
type: "end",
|
|
62
|
-
id: parsed.params.subscription
|
|
63
|
-
} : null;
|
|
64
|
-
},
|
|
65
|
-
onAbort: (id) => {
|
|
66
|
-
onMessage(
|
|
67
|
-
JSON.stringify({
|
|
68
|
-
jsonrpc: "2.0",
|
|
69
|
-
method: notificationMethod,
|
|
70
|
-
params: {
|
|
71
|
-
subscription: id,
|
|
72
|
-
result: {
|
|
73
|
-
event: STOP_EVENT
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
})
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
|
|
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",
|
|
39
|
+
type: MessageType.unsubscribe,
|
|
113
40
|
id: Object.values(parsed.params)[0]
|
|
114
41
|
};
|
|
115
42
|
return null;
|
|
116
43
|
},
|
|
117
44
|
onNotification(parsed) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return terminalEvents.has(parsed.params.result.event) ? {
|
|
121
|
-
type: "end",
|
|
45
|
+
return NOTIFICATION_METHODS.has(parsed.method) && parsed.params.result.event === STOP_EVENT ? {
|
|
46
|
+
type: MessageType.end,
|
|
122
47
|
id: parsed.params.subscription
|
|
123
48
|
} : null;
|
|
124
49
|
},
|
|
125
50
|
onAbort: (id) => {
|
|
126
51
|
onMessage(
|
|
127
|
-
|
|
128
|
-
jsonrpc: "2.0",
|
|
52
|
+
jsonRpcMsg({
|
|
129
53
|
method: notificationMethod,
|
|
130
54
|
params: {
|
|
131
55
|
subscription: id,
|
|
132
56
|
result: {
|
|
133
|
-
event:
|
|
57
|
+
event: STOP_EVENT,
|
|
58
|
+
eventType: "internal"
|
|
134
59
|
}
|
|
135
60
|
}
|
|
136
61
|
})
|
|
@@ -139,8 +64,7 @@ var txSubmitAndWatch = (onMessage) => {
|
|
|
139
64
|
};
|
|
140
65
|
};
|
|
141
66
|
|
|
142
|
-
|
|
143
|
-
var addSubscription = ({
|
|
67
|
+
const addSubscription = ({
|
|
144
68
|
onSent,
|
|
145
69
|
onNotification,
|
|
146
70
|
onAbort
|
|
@@ -154,26 +78,22 @@ var addSubscription = ({
|
|
|
154
78
|
return {
|
|
155
79
|
onSent(parsed) {
|
|
156
80
|
const result = onSent(parsed);
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
} else {
|
|
162
|
-
active.delete(result.id);
|
|
81
|
+
if (result) {
|
|
82
|
+
if (result.type === MessageType.subscribe)
|
|
83
|
+
preActive.set(result.id, result.onRes);
|
|
84
|
+
else active.delete(result.id);
|
|
163
85
|
}
|
|
164
86
|
},
|
|
165
87
|
onResponse(parsed) {
|
|
166
88
|
const match = preActive.get(parsed.id)?.(parsed);
|
|
167
|
-
if (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
89
|
+
if (match) {
|
|
90
|
+
preActive.delete(parsed.id);
|
|
91
|
+
active.add(match.id);
|
|
92
|
+
}
|
|
171
93
|
},
|
|
172
94
|
onNotifiaction(parsed) {
|
|
173
95
|
const result = onNotification(parsed);
|
|
174
|
-
if (
|
|
175
|
-
return;
|
|
176
|
-
active.delete(result.id);
|
|
96
|
+
if (result) active.delete(result.id);
|
|
177
97
|
},
|
|
178
98
|
onDisconnect,
|
|
179
99
|
onAbort() {
|
|
@@ -183,37 +103,9 @@ var addSubscription = ({
|
|
|
183
103
|
}
|
|
184
104
|
};
|
|
185
105
|
};
|
|
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
|
-
};
|
|
106
|
+
const getSubscriptionManager = (onMessage) => addSubscription(chainHeadFollow(onMessage));
|
|
214
107
|
|
|
215
|
-
|
|
216
|
-
var getSyncProvider = (input) => (onMessage) => {
|
|
108
|
+
const getSyncProvider = (input) => (onMessage) => {
|
|
217
109
|
let provider;
|
|
218
110
|
let bufferedMessages = [];
|
|
219
111
|
const pendingResponses = /* @__PURE__ */ new Set();
|
|
@@ -235,29 +127,24 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
235
127
|
onMessage(message);
|
|
236
128
|
};
|
|
237
129
|
const send = (message) => {
|
|
238
|
-
if (!provider)
|
|
239
|
-
return;
|
|
130
|
+
if (!provider) return;
|
|
240
131
|
const parsed = JSON.parse(message);
|
|
241
132
|
subscriptionManager.onSent(parsed);
|
|
242
|
-
if (parsed.id)
|
|
243
|
-
pendingResponses.add(parsed.id);
|
|
133
|
+
if (parsed.id) pendingResponses.add(parsed.id);
|
|
244
134
|
if (provider instanceof Promise) {
|
|
245
135
|
bufferedMessages.push(message);
|
|
246
|
-
} else
|
|
247
|
-
provider.send(message);
|
|
136
|
+
} else provider.send(message);
|
|
248
137
|
};
|
|
249
138
|
const onHalt = () => {
|
|
250
139
|
bufferedMessages = [];
|
|
251
140
|
const pendingResponsesCopy = [...pendingResponses];
|
|
252
141
|
pendingResponses.clear();
|
|
253
|
-
if (!provider)
|
|
254
|
-
throw null;
|
|
142
|
+
if (!provider) throw null;
|
|
255
143
|
const result = start();
|
|
256
144
|
subscriptionManager.onAbort();
|
|
257
145
|
pendingResponsesCopy.forEach((id) => {
|
|
258
146
|
onMessage(
|
|
259
|
-
|
|
260
|
-
jsonrpc: "2.0",
|
|
147
|
+
jsonRpcMsg({
|
|
261
148
|
error: { code: -32603, message: "Internal error" },
|
|
262
149
|
id
|
|
263
150
|
})
|
|
@@ -267,17 +154,15 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
267
154
|
};
|
|
268
155
|
const start = () => {
|
|
269
156
|
const onResolve = (getProvider) => {
|
|
270
|
-
let
|
|
157
|
+
let alive = true;
|
|
271
158
|
const _onHalt = () => {
|
|
272
|
-
if (
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
159
|
+
if (alive) {
|
|
160
|
+
alive = false;
|
|
161
|
+
onHalt();
|
|
162
|
+
}
|
|
276
163
|
};
|
|
277
164
|
const _onMessageProxy = (msg) => {
|
|
278
|
-
if (
|
|
279
|
-
return;
|
|
280
|
-
onMessageProxy(msg);
|
|
165
|
+
if (alive) onMessageProxy(msg);
|
|
281
166
|
};
|
|
282
167
|
const result = getProvider(_onMessageProxy, _onHalt);
|
|
283
168
|
bufferedMessages.forEach((m) => {
|
|
@@ -290,8 +175,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
290
175
|
return provider;
|
|
291
176
|
};
|
|
292
177
|
const disconnect = () => {
|
|
293
|
-
if (!provider)
|
|
294
|
-
return;
|
|
178
|
+
if (!provider) return;
|
|
295
179
|
const finishIt = (input2) => {
|
|
296
180
|
subscriptionManager.onDisconnect();
|
|
297
181
|
pendingResponses.clear();
|
|
@@ -301,8 +185,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
301
185
|
if (provider instanceof Promise) {
|
|
302
186
|
provider.then(finishIt, finishIt);
|
|
303
187
|
provider = null;
|
|
304
|
-
} else
|
|
305
|
-
finishIt(provider);
|
|
188
|
+
} else finishIt(provider);
|
|
306
189
|
};
|
|
307
190
|
start();
|
|
308
191
|
return {
|
|
@@ -310,5 +193,7 @@ var getSyncProvider = (input) => (onMessage) => {
|
|
|
310
193
|
disconnect
|
|
311
194
|
};
|
|
312
195
|
};
|
|
313
|
-
|
|
314
|
-
|
|
196
|
+
const withMacroTask = (inputFn) => (...args) => new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args));
|
|
197
|
+
|
|
198
|
+
exports.getSyncProvider = getSyncProvider;
|
|
199
|
+
//# 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 eventType: \"internal\",\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
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,38 +12,34 @@
|
|
|
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.3"
|
|
44
39
|
},
|
|
45
40
|
"scripts": {
|
|
46
|
-
"build": "tsc --noEmit &&
|
|
41
|
+
"build-core": "tsc --noEmit && rollup -c ../../../rollup.config.js",
|
|
42
|
+
"build": "pnpm build-core",
|
|
47
43
|
"test": "echo 'no tests'",
|
|
48
44
|
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
49
45
|
"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"]}
|