@polkadot-api/json-rpc-provider-proxy 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,16 @@
1
1
  # @polkadot-api/json-rpc-provider-proxy
2
+
3
+ This package exports `getSyncProvider`, a function to create `JsonRpcProvider`s that will act as if the connection happen synchronously.
4
+
5
+ ```ts
6
+ export type AsyncJsonRpcProvider = (
7
+ onMessage: (message: string) => void,
8
+ onHalt: () => void,
9
+ ) => JsonRpcConnection
10
+
11
+ function getSyncProvider(
12
+ input: () => Promise<AsyncJsonRpcProvider>,
13
+ ): JsonRpcProvider
14
+ ```
15
+
16
+ The returned provider will buffer up every message until it can get the `JsonRpcConnection`, at which point it will send every message buffered.
package/dist/index.js CHANGED
@@ -25,98 +25,119 @@ __export(src_exports, {
25
25
  module.exports = __toCommonJS(src_exports);
26
26
 
27
27
  // src/subscription-manager/chainHeadFollow.ts
28
- var START_METHOD = "chainHead_unstable_follow";
29
- var STOP_METHOD = "chainHead_unstable_unfollow";
30
- var NOTIFICATION_METHOD = "chainHead_unstable_followEvent";
31
- var ABORT_EVENT = "stop";
32
- var terminalEvents = /* @__PURE__ */ new Set([
33
- ABORT_EVENT,
34
- "operationInaccessible",
35
- "operationError"
36
- ]);
37
- var chainHeadFollow = (onMessage) => ({
38
- onSent(parsed) {
39
- if (parsed.method === START_METHOD)
40
- return {
41
- type: "subscribe",
42
- id: parsed.id,
43
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
44
- };
45
- if (parsed.method === STOP_METHOD)
46
- return {
47
- type: "unsubscribe",
48
- id: Object.values(parsed.params)[0]
49
- };
50
- return null;
51
- },
52
- onNotification(parsed) {
53
- if (parsed.method !== NOTIFICATION_METHOD)
28
+ var [START_METHODS, STOP_METHODS, NOTIFICATION_METHODS] = [
29
+ "follow",
30
+ "unfollow",
31
+ "followEvent"
32
+ ].map(
33
+ (name) => new Set(
34
+ ["v1", "unstable"].map((version) => `chainHead_${version}_${name}`)
35
+ )
36
+ );
37
+ var STOP_EVENT = "stop";
38
+ var chainHeadFollow = (onMessage) => {
39
+ let notificationMethod = "";
40
+ return {
41
+ onSent(parsed) {
42
+ if (START_METHODS.has(parsed.method)) {
43
+ notificationMethod = parsed.method + "Event";
44
+ return {
45
+ type: "subscribe",
46
+ id: parsed.id,
47
+ onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
48
+ };
49
+ }
50
+ if (STOP_METHODS.has(parsed.method))
51
+ return {
52
+ type: "unsubscribe",
53
+ id: Object.values(parsed.params)[0]
54
+ };
54
55
  return null;
55
- return terminalEvents.has(parsed.params.result.event) ? {
56
- type: "end",
57
- id: parsed.params.subscription
58
- } : null;
59
- },
60
- onAbort: (id) => {
61
- onMessage(
62
- JSON.stringify({
63
- jsonrpc: "2.0",
64
- method: NOTIFICATION_METHOD,
65
- params: {
66
- subscription: id,
67
- result: {
68
- event: ABORT_EVENT
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
+ }
69
75
  }
70
- }
71
- })
72
- );
73
- }
74
- });
76
+ })
77
+ );
78
+ }
79
+ };
80
+ };
75
81
 
76
82
  // src/subscription-manager/transaction-submit-watch.ts
77
- var START_METHOD2 = "transaction_unstable_submitAndWatch";
78
- var STOP_METHOD2 = "transaction_unstable_unwatch";
79
- var NOTIFICATION_METHOD2 = "transaction_unstable_watchEvent";
80
- var ABORT_EVENT2 = "dropped";
81
- var terminalEvents2 = /* @__PURE__ */ new Set([ABORT_EVENT2, "finalized", "error", "invalid"]);
82
- var txSubmitAndWatch = (onMessage) => ({
83
- onSent(parsed) {
84
- if (parsed.method === START_METHOD2)
85
- return {
86
- type: "subscribe",
87
- id: parsed.id,
88
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
89
- };
90
- if (parsed.method === STOP_METHOD2)
91
- return {
92
- type: "unsubscribe",
93
- id: Object.values(parsed.params)[0]
94
- };
95
- return null;
96
- },
97
- onNotification(parsed) {
98
- if (parsed.method !== NOTIFICATION_METHOD2)
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
+ };
99
115
  return null;
100
- return terminalEvents2.has(parsed.params.result.event) ? {
101
- type: "end",
102
- id: parsed.params.subscription
103
- } : null;
104
- },
105
- onAbort: (id) => {
106
- onMessage(
107
- JSON.stringify({
108
- jsonrpc: "2.0",
109
- method: NOTIFICATION_METHOD2,
110
- params: {
111
- subscription: id,
112
- result: {
113
- event: ABORT_EVENT2
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
+ }
114
135
  }
115
- }
116
- })
117
- );
118
- }
119
- });
136
+ })
137
+ );
138
+ }
139
+ };
140
+ };
120
141
 
121
142
  // src/subscription-manager/subscription-manager.ts
122
143
  var addSubscription = ({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/subscription-manager/chainHeadFollow.ts","../src/subscription-manager/transaction-submit-watch.ts","../src/subscription-manager/subscription-manager.ts","../src/get-sync-provider.ts"],"sourcesContent":["export * from \"./get-sync-provider\"\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","input"]}
1
+ {"version":3,"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"]}
package/dist/index.mjs CHANGED
@@ -1,96 +1,117 @@
1
1
  // src/subscription-manager/chainHeadFollow.ts
2
- var START_METHOD = "chainHead_unstable_follow";
3
- var STOP_METHOD = "chainHead_unstable_unfollow";
4
- var NOTIFICATION_METHOD = "chainHead_unstable_followEvent";
5
- var ABORT_EVENT = "stop";
6
- var terminalEvents = /* @__PURE__ */ new Set([
7
- ABORT_EVENT,
8
- "operationInaccessible",
9
- "operationError"
10
- ]);
11
- var chainHeadFollow = (onMessage) => ({
12
- onSent(parsed) {
13
- if (parsed.method === START_METHOD)
14
- return {
15
- type: "subscribe",
16
- id: parsed.id,
17
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
18
- };
19
- if (parsed.method === STOP_METHOD)
20
- return {
21
- type: "unsubscribe",
22
- id: Object.values(parsed.params)[0]
23
- };
24
- return null;
25
- },
26
- onNotification(parsed) {
27
- if (parsed.method !== NOTIFICATION_METHOD)
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
+ };
28
29
  return null;
29
- return terminalEvents.has(parsed.params.result.event) ? {
30
- type: "end",
31
- id: parsed.params.subscription
32
- } : null;
33
- },
34
- onAbort: (id) => {
35
- onMessage(
36
- JSON.stringify({
37
- jsonrpc: "2.0",
38
- method: NOTIFICATION_METHOD,
39
- params: {
40
- subscription: id,
41
- result: {
42
- event: ABORT_EVENT
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
+ }
43
49
  }
44
- }
45
- })
46
- );
47
- }
48
- });
50
+ })
51
+ );
52
+ }
53
+ };
54
+ };
49
55
 
50
56
  // src/subscription-manager/transaction-submit-watch.ts
51
- var START_METHOD2 = "transaction_unstable_submitAndWatch";
52
- var STOP_METHOD2 = "transaction_unstable_unwatch";
53
- var NOTIFICATION_METHOD2 = "transaction_unstable_watchEvent";
54
- var ABORT_EVENT2 = "dropped";
55
- var terminalEvents2 = /* @__PURE__ */ new Set([ABORT_EVENT2, "finalized", "error", "invalid"]);
56
- var txSubmitAndWatch = (onMessage) => ({
57
- onSent(parsed) {
58
- if (parsed.method === START_METHOD2)
59
- return {
60
- type: "subscribe",
61
- id: parsed.id,
62
- onRes: (innerParsed) => innerParsed.id === parsed.id ? { id: innerParsed.result } : null
63
- };
64
- if (parsed.method === STOP_METHOD2)
65
- return {
66
- type: "unsubscribe",
67
- id: Object.values(parsed.params)[0]
68
- };
69
- return null;
70
- },
71
- onNotification(parsed) {
72
- if (parsed.method !== NOTIFICATION_METHOD2)
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
+ };
73
89
  return null;
74
- return terminalEvents2.has(parsed.params.result.event) ? {
75
- type: "end",
76
- id: parsed.params.subscription
77
- } : null;
78
- },
79
- onAbort: (id) => {
80
- onMessage(
81
- JSON.stringify({
82
- jsonrpc: "2.0",
83
- method: NOTIFICATION_METHOD2,
84
- params: {
85
- subscription: id,
86
- result: {
87
- event: ABORT_EVENT2
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
+ }
88
109
  }
89
- }
90
- })
91
- );
92
- }
93
- });
110
+ })
111
+ );
112
+ }
113
+ };
114
+ };
94
115
 
95
116
  // src/subscription-manager/subscription-manager.ts
96
117
  var addSubscription = ({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/subscription-manager/chainHeadFollow.ts","../src/subscription-manager/transaction-submit-watch.ts","../src/subscription-manager/subscription-manager.ts","../src/get-sync-provider.ts"],"sourcesContent":["import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","input"]}
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.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var I=(o,n)=>{for(var t in n)d(o,t,{get:n[t],enumerable:!0})},P=(o,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of E(n))!O.call(o,r)&&r!==t&&d(o,r,{get:()=>n[r],enumerable:!(e=A(n,r))||e.enumerable});return o};var J=o=>P(d({},"__esModule",{value:!0}),o);var q={};I(q,{getSyncProvider:()=>j});module.exports=J(q);var N="chainHead_unstable_follow",w="chainHead_unstable_unfollow",g="chainHead_unstable_followEvent",h="stop",H=new Set([h,"operationInaccessible","operationError"]),S=o=>({onSent(n){return n.method===N?{type:"subscribe",id:n.id,onRes:t=>t.id===n.id?{id:t.result}:null}:n.method===w?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return n.method!==g?null:H.has(n.params.result.event)?{type:"end",id:n.params.subscription}:null},onAbort:n=>{o(JSON.stringify({jsonrpc:"2.0",method:g,params:{subscription:n,result:{event:h}}}))}});var M="transaction_unstable_submitAndWatch",x="transaction_unstable_unwatch",y="transaction_unstable_watchEvent",R="dropped",C=new Set([R,"finalized","error","invalid"]),v=o=>({onSent(n){return n.method===M?{type:"subscribe",id:n.id,onRes:t=>t.id===n.id?{id:t.result}:null}:n.method===x?{type:"unsubscribe",id:Object.values(n.params)[0]}:null},onNotification(n){return n.method!==y?null:C.has(n.params.result.event)?{type:"end",id:n.params.subscription}:null},onAbort:n=>{o(JSON.stringify({jsonrpc:"2.0",method:y,params:{subscription:n,result:{event:R}}}))}});var D=({onSent:o,onNotification:n,onAbort:t})=>{let e=new Map,r=new Set,u=()=>{e.clear(),r.clear()};return{onSent(a){let c=o(a);c&&(c.type==="subscribe"?e.set(c.id,c.onRes):r.delete(c.id))},onResponse(a){let c=e.get(a.id)?.(a);c&&(e.delete(a.id),r.add(c.id))},onNotifiaction(a){let c=n(a);c&&r.delete(c.id)},onDisconnect:u,onAbort(){let a=[...r];u(),a.forEach(t)}}},T=o=>{let n=[S,v].map(t=>D(t(o)));return{onSent(t){n.forEach(e=>{e.onSent(t)})},onResponse(t){n.forEach(e=>{e.onResponse(t)})},onNotifiaction(t){n.forEach(e=>{e.onNotifiaction(t)})},onDisconnect(){n.forEach(t=>t.onDisconnect())},onAbort(){n.forEach(t=>t.onAbort())}}};var j=o=>n=>{let t,e=[],r=new Set,u=T(n),a=i=>{let s;try{s=JSON.parse(i)}catch{console.error(`Unable to parse incoming message: ${i}`);return}s.id!==void 0?(r.delete(s.id),u.onResponse(s)):u.onNotifiaction(s),n(i)},c=i=>{if(!t)return;let s=JSON.parse(i);u.onSent(s),s.id&&r.add(s.id),t instanceof Promise?e.push(i):t.send(i)},f=()=>{e=[];let i=[...r];if(r.clear(),!t)throw null;let s=m();return u.onAbort(),i.forEach(l=>{n(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:"Internal error"},id:l}))}),s},m=()=>{let i=s=>{let l=!1,b=s(p=>{l||a(p)},()=>{l||(l=!0,f())});return e.forEach(p=>{b.send(p)}),e=[],t=b};return t=o().then(i,L(f)),t},_=()=>{if(!t)return;let i=s=>{u.onDisconnect(),r.clear(),t=null,s?.disconnect()};t instanceof Promise?(t.then(i,i),t=null):i(t)};return m(),{send:c,disconnect:_}},L=o=>(...n)=>new Promise(t=>setTimeout(t,0)).then(()=>o(...n));
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
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/subscription-manager/chainHeadFollow.ts","../../src/subscription-manager/transaction-submit-watch.ts","../../src/subscription-manager/subscription-manager.ts","../../src/get-sync-provider.ts"],"sourcesContent":["export * from \"./get-sync-provider\"\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"chainHead_unstable_follow\"\nconst STOP_METHOD = \"chainHead_unstable_unfollow\"\nconst NOTIFICATION_METHOD = \"chainHead_unstable_followEvent\"\nconst ABORT_EVENT = \"stop\"\n\nconst terminalEvents = new Set([\n ABORT_EVENT,\n \"operationInaccessible\",\n \"operationError\",\n])\n\nexport const chainHeadFollow = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import { SubscriptionId, SubscriptionLogic } from \"@/internal-types\"\n\nconst START_METHOD = \"transaction_unstable_submitAndWatch\"\nconst STOP_METHOD = \"transaction_unstable_unwatch\"\nconst NOTIFICATION_METHOD = \"transaction_unstable_watchEvent\"\nconst ABORT_EVENT = \"dropped\"\n\nconst terminalEvents = new Set([ABORT_EVENT, \"finalized\", \"error\", \"invalid\"])\n\nexport const txSubmitAndWatch = (\n onMessage: (msg: string) => void,\n): SubscriptionLogic => ({\n onSent(parsed) {\n if (parsed.method === START_METHOD)\n return {\n type: \"subscribe\",\n id: parsed.id,\n onRes: (innerParsed) =>\n innerParsed.id === parsed.id ? { id: innerParsed.result } : null,\n }\n\n if (parsed.method === STOP_METHOD)\n return {\n type: \"unsubscribe\",\n id: Object.values(parsed.params)[0] as string,\n }\n\n return null\n },\n onNotification(parsed) {\n if (parsed.method !== NOTIFICATION_METHOD) return null\n\n return terminalEvents.has(parsed.params.result.event)\n ? {\n type: \"end\",\n id: parsed.params.subscription as SubscriptionId,\n }\n : null\n },\n onAbort: (id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n method: NOTIFICATION_METHOD,\n params: {\n subscription: id,\n result: {\n event: ABORT_EVENT,\n },\n },\n }),\n )\n },\n})\n","import type {\n RequestId,\n SubscriptionId,\n SubscriptionLogic,\n} from \"../internal-types\"\nimport { chainHeadFollow } from \"./chainHeadFollow\"\nimport { txSubmitAndWatch } from \"./transaction-submit-watch\"\n\nexport const addSubscription = ({\n onSent,\n onNotification,\n onAbort,\n}: SubscriptionLogic) => {\n const preActive = new Map<\n RequestId,\n (parsed: any) => { id: SubscriptionId } | null\n >()\n const active = new Set<SubscriptionId>()\n\n const onDisconnect = () => {\n preActive.clear()\n active.clear()\n }\n\n return {\n onSent(parsed: any) {\n const result = onSent(parsed)\n if (!result) return\n if (result.type === \"subscribe\") {\n preActive.set(result.id, result.onRes)\n } else {\n active.delete(result.id)\n }\n },\n onResponse(parsed: any) {\n const match = preActive.get(parsed.id)?.(parsed)\n if (!match) return\n preActive.delete(parsed.id)\n active.add(match.id)\n },\n onNotifiaction(parsed: any) {\n const result = onNotification(parsed)\n if (!result) return\n active.delete(result.id)\n },\n onDisconnect,\n onAbort() {\n const activeCopy = [...active]\n onDisconnect()\n activeCopy.forEach(onAbort)\n },\n }\n}\n\nexport const getSubscriptionManager = (onMessage: (msg: string) => void) => {\n const subscriptions = [chainHeadFollow, txSubmitAndWatch].map((logic) =>\n addSubscription(logic(onMessage)),\n )\n\n return {\n onSent(parsed: any) {\n subscriptions.forEach((s) => {\n s.onSent(parsed)\n })\n },\n onResponse(parsed: any) {\n subscriptions.forEach((s) => {\n s.onResponse(parsed)\n })\n },\n onNotifiaction(parsed: any) {\n subscriptions.forEach((s) => {\n s.onNotifiaction(parsed)\n })\n },\n onDisconnect() {\n subscriptions.forEach((s) => s.onDisconnect())\n },\n onAbort() {\n subscriptions.forEach((s) => s.onAbort())\n },\n }\n}\n","import type { RequestId } from \"./internal-types\"\nimport type {\n JsonRpcProvider,\n JsonRpcConnection,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { getSubscriptionManager } from \"./subscription-manager\"\n\nexport type AsyncJsonRpcProvider = (\n onMessage: (message: string) => void,\n onHalt: () => void,\n) => JsonRpcConnection\n\nexport const getSyncProvider =\n (input: () => Promise<AsyncJsonRpcProvider>): JsonRpcProvider =>\n (onMessage) => {\n // if it's null it means that the consumer has called `disconnect`\n // of it's a Promise it means that it's being respolved, otherwise it's resolved\n let provider: JsonRpcConnection | Promise<JsonRpcConnection> | null\n\n let bufferedMessages: Array<string> = []\n const pendingResponses = new Set<RequestId>()\n const subscriptionManager = getSubscriptionManager(onMessage)\n\n const onMessageProxy = (message: string) => {\n let parsed: any\n try {\n parsed = JSON.parse(message)\n } catch (_) {\n console.error(`Unable to parse incoming message: ${message}`)\n return\n }\n\n if (parsed.id !== undefined) {\n pendingResponses.delete(parsed.id)\n subscriptionManager.onResponse(parsed)\n } else {\n subscriptionManager.onNotifiaction(parsed)\n }\n\n onMessage(message)\n }\n\n const send = (message: string) => {\n if (!provider) return\n\n const parsed = JSON.parse(message)\n subscriptionManager.onSent(parsed)\n if (parsed.id) pendingResponses.add(parsed.id)\n\n if (provider instanceof Promise) {\n bufferedMessages.push(message)\n } else provider.send(message)\n }\n\n const onHalt = (): Promise<JsonRpcConnection> => {\n bufferedMessages = []\n const pendingResponsesCopy = [...pendingResponses]\n pendingResponses.clear()\n\n // it means that the user has disconnected while the\n // provider promise was being rejected. Therefore, we must\n // throw to prevent the Promise from recovering.\n // The rejection will be handled from the teardown logic.\n if (!provider) throw null\n\n // It needs to restart before sending the errored\n // responses/notifications because the consumer may\n // react to those by sending new requests\n const result = start()\n\n subscriptionManager.onAbort()\n pendingResponsesCopy.forEach((id) => {\n onMessage(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal error\" },\n id,\n }),\n )\n })\n\n return result\n }\n\n const start = (): Promise<JsonRpcConnection> => {\n const onResolve = (getProvider: AsyncJsonRpcProvider) => {\n let halted = false\n const _onHalt = () => {\n if (halted) return\n halted = true\n onHalt()\n }\n const _onMessageProxy = (msg: string) => {\n if (halted) return\n onMessageProxy(msg)\n }\n\n const result = getProvider(_onMessageProxy, _onHalt)\n bufferedMessages.forEach((m) => {\n result.send(m)\n })\n bufferedMessages = []\n return (provider = result)\n }\n\n provider = input().then(onResolve, withMacroTask(onHalt))\n return provider\n }\n\n const disconnect = () => {\n if (!provider) return\n\n const finishIt = (input: JsonRpcConnection | null) => {\n subscriptionManager.onDisconnect()\n pendingResponses.clear()\n provider = null\n input?.disconnect()\n }\n\n if (provider instanceof Promise) {\n provider.then(finishIt, finishIt)\n provider = null\n } else finishIt(provider)\n }\n\n start()\n return {\n send,\n disconnect,\n }\n }\n\nconst withMacroTask =\n <Args extends Array<any>, T>(\n inputFn: (...args: Args) => Promise<T>,\n ): ((...args: Args) => Promise<T>) =>\n (...args) =>\n new Promise((res) => setTimeout(res, 0)).then(() => inputFn(...args))\n"],"mappings":"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","names":["src_exports","__export","getSyncProvider","__toCommonJS","START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","chainHeadFollow","onMessage","parsed","innerParsed","id","START_METHOD","STOP_METHOD","NOTIFICATION_METHOD","ABORT_EVENT","terminalEvents","txSubmitAndWatch","onMessage","parsed","innerParsed","id","addSubscription","onSent","onNotification","onAbort","preActive","active","onDisconnect","parsed","result","match","activeCopy","getSubscriptionManager","onMessage","subscriptions","chainHeadFollow","txSubmitAndWatch","logic","s","getSyncProvider","input","onMessage","provider","bufferedMessages","pendingResponses","subscriptionManager","getSubscriptionManager","onMessageProxy","message","parsed","send","onHalt","pendingResponsesCopy","result","start","id","onResolve","getProvider","halted","msg","m","withMacroTask","disconnect","finishIt","inputFn","args","res"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/json-rpc-provider-proxy",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",