@polkadot-api/ws-middleware 0.2.3 → 0.2.4-canary.5629cfc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,102 @@
1
+ import { Subject, filter, take } from 'rxjs';
2
+ import { withLegacy } from './legacy/downstream/downstream.mjs';
3
+ import { modern } from './modern/modern.mjs';
4
+ import './modern/fix-follow.mjs';
5
+ import './modern/fix-premature-blocks.mjs';
6
+ import './modern/fix-unordered-blocks.mjs';
7
+ import './modern/fix-unordered-events.mjs';
8
+ import './methods.mjs';
9
+ import '@polkadot-api/raw-client';
10
+ import '@polkadot-api/utils';
11
+
12
+ const modernGroups = ["chainHead", "transaction", "chainSpec", "archive"].map(
13
+ (name) => `${name}_v1`
14
+ );
15
+ const hybridMiddleware = (methods) => {
16
+ const individualChecks = Object.fromEntries(
17
+ modernGroups.map((group) => [
18
+ group,
19
+ !!methods.find((v) => v.startsWith(group))
20
+ ])
21
+ );
22
+ return (base) => {
23
+ const multiplexed = multiplex(base);
24
+ const modernProvider = modern(multiplexed);
25
+ const legacyProvider = withLegacy(multiplexed);
26
+ return (onMsg, onHalt) => {
27
+ const modernConnection = modernProvider((message) => {
28
+ if ("error" in message && message.error.code === -32800) {
29
+ console.warn("Max follow connections received: chainHead_v1 disabled");
30
+ individualChecks.chainHead_v1 = false;
31
+ }
32
+ onMsg(message);
33
+ }, onHalt);
34
+ const legacyConnection = legacyProvider(onMsg, onHalt);
35
+ return {
36
+ send(message) {
37
+ for (const group of modernGroups) {
38
+ if (message.method.startsWith(group)) {
39
+ if (individualChecks[group]) {
40
+ modernConnection.send(message);
41
+ } else {
42
+ legacyConnection.send(message);
43
+ }
44
+ return;
45
+ }
46
+ }
47
+ modernConnection.send(message);
48
+ },
49
+ disconnect() {
50
+ modernConnection.disconnect();
51
+ legacyConnection.disconnect();
52
+ }
53
+ };
54
+ };
55
+ };
56
+ };
57
+ const multiplex = (base) => {
58
+ const halt$ = new Subject();
59
+ const msg$ = new Subject();
60
+ let refCount = 0;
61
+ let baseConnection = null;
62
+ return (onMsg, onHalt) => {
63
+ refCount++;
64
+ baseConnection ?? (baseConnection = base(
65
+ (msg) => msg$.next(msg),
66
+ (e) => halt$.next(e)
67
+ ));
68
+ const notificationSub = msg$.pipe(filter((v) => v.id == null)).subscribe(onMsg);
69
+ const haltSub = halt$.subscribe(onHalt);
70
+ const responseSubs = /* @__PURE__ */ new Set();
71
+ return {
72
+ send(message) {
73
+ if (message.id == null) {
74
+ return baseConnection?.send(message);
75
+ }
76
+ const id = message.id;
77
+ const responseSub = msg$.pipe(
78
+ filter((r) => r.id === id),
79
+ take(1)
80
+ ).subscribe((msg) => {
81
+ onMsg(msg);
82
+ if (!responseSub) throw new Error("unreachable");
83
+ responseSubs.delete(responseSub);
84
+ });
85
+ responseSubs.add(responseSub);
86
+ baseConnection?.send(message);
87
+ },
88
+ disconnect() {
89
+ notificationSub.unsubscribe();
90
+ haltSub.unsubscribe();
91
+ responseSubs.forEach((s) => s.unsubscribe());
92
+ refCount--;
93
+ if (refCount === 0) {
94
+ baseConnection?.disconnect();
95
+ }
96
+ }
97
+ };
98
+ };
99
+ };
100
+
101
+ export { hybridMiddleware };
102
+ //# sourceMappingURL=hybrid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.mjs","sources":["../../src/hybrid.ts"],"sourcesContent":["import {\n JsonRpcConnection,\n JsonRpcMessage,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { filter, Subject, Subscription, take } from \"rxjs\"\nimport { withLegacy } from \"./legacy\"\nimport { modern } from \"./modern\"\nimport { Middleware } from \"./types\"\n\nconst modernGroups = [\"chainHead\", \"transaction\", \"chainSpec\", \"archive\"].map(\n (name) => `${name}_v1`,\n)\n\nexport const hybridMiddleware = (methods: string[]): Middleware => {\n const individualChecks = Object.fromEntries(\n modernGroups.map((group) => [\n group,\n !!methods.find((v) => v.startsWith(group)),\n ]),\n )\n\n return (base) => {\n const multiplexed = multiplex(base)\n const modernProvider = modern(multiplexed)\n const legacyProvider = withLegacy(multiplexed)\n\n return (onMsg, onHalt) => {\n const modernConnection = modernProvider((message) => {\n if (\"error\" in message && message.error.code === -32800) {\n console.warn(\"Max follow connections received: chainHead_v1 disabled\")\n individualChecks.chainHead_v1 = false\n }\n onMsg(message)\n }, onHalt)\n const legacyConnection = legacyProvider(onMsg, onHalt)\n\n return {\n send(message) {\n for (const group of modernGroups) {\n if (message.method.startsWith(group)) {\n if (individualChecks[group]) {\n modernConnection.send(message)\n } else {\n legacyConnection.send(message)\n }\n return\n }\n }\n modernConnection.send(message)\n },\n disconnect() {\n modernConnection.disconnect()\n legacyConnection.disconnect()\n },\n }\n }\n }\n}\n\nconst multiplex: Middleware = (base) => {\n const halt$ = new Subject<any>()\n const msg$ = new Subject<JsonRpcMessage>()\n\n let refCount = 0\n let baseConnection: JsonRpcConnection | null = null\n\n return (onMsg, onHalt) => {\n refCount++\n baseConnection ??= base(\n (msg) => msg$.next(msg),\n (e) => halt$.next(e),\n )\n\n const notificationSub = msg$\n .pipe(filter((v) => v.id == null))\n .subscribe(onMsg)\n const haltSub = halt$.subscribe(onHalt)\n const responseSubs = new Set<Subscription>()\n\n return {\n send(message) {\n if (message.id == null) {\n return baseConnection?.send(message)\n }\n const id = message.id\n const responseSub = msg$\n .pipe(\n filter((r) => r.id === id),\n take(1),\n )\n .subscribe((msg) => {\n onMsg(msg)\n if (!responseSub) throw new Error(\"unreachable\")\n responseSubs.delete(responseSub)\n })\n responseSubs.add(responseSub)\n baseConnection?.send(message)\n },\n disconnect() {\n notificationSub.unsubscribe()\n haltSub.unsubscribe()\n responseSubs.forEach((s) => s.unsubscribe())\n refCount--\n if (refCount === 0) {\n baseConnection?.disconnect()\n }\n },\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -5,14 +5,14 @@ import { getMsgFromErr } from '../utils/message-from-error.mjs';
5
5
  import { archive } from '../../methods.mjs';
6
6
 
7
7
  const {
8
- body: body$1,
9
- call: call$1,
8
+ body: body$2,
9
+ call: call$2,
10
10
  finalizedHeight,
11
11
  genesisHash,
12
12
  hashByHeight,
13
- header,
13
+ header: header$1,
14
14
  stopStorage,
15
- storage: storage$1
15
+ storage: storage$2
16
16
  } = archive;
17
17
  const createArchive = (upstream, reply, err, notification) => {
18
18
  const stgSubscriptions = /* @__PURE__ */ new Map();
@@ -55,17 +55,17 @@ const createArchive = (upstream, reply, err, notification) => {
55
55
  };
56
56
  const [firstArg, secondArg, thirdArg] = params;
57
57
  switch (name) {
58
- case body$1:
58
+ case body$2:
59
59
  return obsReply(
60
60
  upstream.getBody(firstArg).pipe(map(({ block }) => block.extrinsics))
61
61
  );
62
- case call$1:
62
+ case call$2:
63
63
  return obsReply(
64
64
  upstream.runtimeCall(firstArg, secondArg, thirdArg).pipe(map((value) => ({ success: true, value })))
65
65
  );
66
66
  case finalizedHeight:
67
67
  return obsReply(
68
- upstream.finalized$.pipe(
68
+ upstream.subscribeBlocks().finalized$.pipe(
69
69
  map((x) => x.number),
70
70
  take(1)
71
71
  )
@@ -74,15 +74,15 @@ const createArchive = (upstream, reply, err, notification) => {
74
74
  return obsReply(upstream.genesisHash);
75
75
  case hashByHeight:
76
76
  return obsReply(upstream.getBlockHash$(firstArg).pipe(map((x) => [x])));
77
- case header:
77
+ case header$1:
78
78
  return obsReply(
79
- upstream.getHeader$(firstArg).pipe(map((h) => h.header))
79
+ upstream.subscribeBlocks().getHeader$(firstArg).pipe(map((h) => h.header))
80
80
  );
81
81
  case stopStorage: {
82
82
  const sub = stgSubscriptions.get(firstArg);
83
83
  return sub ? sub.unsubscribe() : err(rId, -32602, "Invalid args");
84
84
  }
85
- case storage$1:
85
+ case storage$2:
86
86
  return areItemsValid(secondArg) ? stg(innerReply, firstArg, secondArg) : err(rId, -32602, "Invalid args");
87
87
  }
88
88
  throw null;
@@ -1 +1 @@
1
- {"version":3,"file":"archive.mjs","sources":["../../../../src/legacy/downstream/archive.ts"],"sourcesContent":["import { finalize, map, Observable, Subscription, take } from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { areItemsValid, getStg$ } from \"./storage\"\nimport { getMsgFromErr } from \"../utils/message-from-error\"\nimport { archive } from \"../../methods\"\n\nconst {\n body,\n call,\n finalizedHeight,\n genesisHash,\n hashByHeight,\n header,\n stopStorage,\n storage,\n} = archive\n\nexport const createArchive = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n err: (id: string, code: number, msg: string) => void,\n notification: (method: string, subscription: string, result: any) => void,\n) => {\n const stgSubscriptions = new Map<string, Subscription>()\n\n const stg = (\n reply: (x: string) => void,\n at: string,\n items: Array<{\n key: string\n type:\n | \"value\"\n | \"hash\"\n | \"descendantsValues\"\n | \"descendantsHashes\"\n | \"closestDescendantMerkleValue\"\n }>,\n ) => {\n const subId = createOpaqueToken()\n reply(subId)\n const innerNotifiaction = (result: any) => {\n notification(\"archive_v1_storageEvent\", subId, result)\n }\n\n const subscription = getStg$(upstream, at, items)\n .pipe(\n finalize(() => {\n stgSubscriptions.delete(subId)\n }),\n )\n .subscribe(\n (items) => {\n items.forEach((item) =>\n innerNotifiaction({ event: \"storage\", ...item }),\n )\n },\n (e) => {\n innerNotifiaction({ event: \"storageError\", error: getMsgFromErr(e) })\n },\n () => {\n innerNotifiaction({ event: \"storageDone\" })\n },\n )\n\n if (!subscription.closed) stgSubscriptions.set(subId, subscription)\n }\n\n const result = (rId: string, name: string, params: Array<any>) => {\n const innerReply = (value: any) => {\n reply(rId, value)\n }\n\n const obsReply = (input: Observable<any>) => {\n // There is no need to keep these subscriptions around\n // b/c killing upstream will also kill this subscription\n input.subscribe({\n next: innerReply,\n error: (e) => {\n err(rId, e.code ?? -1, getMsgFromErr(e))\n },\n })\n }\n\n const [firstArg, secondArg, thirdArg] = params\n switch (name) {\n case body:\n return obsReply(\n upstream.getBody(firstArg).pipe(map(({ block }) => block.extrinsics)),\n )\n case call:\n return obsReply(\n upstream\n .runtimeCall(firstArg, secondArg, thirdArg)\n .pipe(map((value) => ({ success: true, value }))),\n )\n case finalizedHeight:\n return obsReply(\n upstream.finalized$.pipe(\n map((x) => x.number),\n take(1),\n ),\n )\n case genesisHash:\n return obsReply(upstream.genesisHash)\n case hashByHeight:\n return obsReply(upstream.getBlockHash$(firstArg).pipe(map((x) => [x])))\n case header:\n return obsReply(\n upstream.getHeader$(firstArg).pipe(map((h) => h.header)),\n )\n case stopStorage: {\n const sub = stgSubscriptions.get(firstArg)\n return sub ? sub.unsubscribe() : err(rId, -32602, \"Invalid args\")\n }\n case storage:\n return areItemsValid(secondArg)\n ? stg(innerReply, firstArg, secondArg)\n : err(rId, -32602, \"Invalid args\")\n }\n throw null\n }\n\n result.stop = () => {\n ;[...stgSubscriptions].forEach(([, s]) => s.unsubscribe())\n stgSubscriptions.clear()\n }\n\n return result\n}\n"],"names":["body","call","storage","reply","result","items"],"mappings":"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"}
1
+ {"version":3,"file":"archive.mjs","sources":["../../../../src/legacy/downstream/archive.ts"],"sourcesContent":["import { finalize, map, Observable, Subscription, take } from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { areItemsValid, getStg$ } from \"./storage\"\nimport { getMsgFromErr } from \"../utils/message-from-error\"\nimport { archive } from \"../../methods\"\n\nconst {\n body,\n call,\n finalizedHeight,\n genesisHash,\n hashByHeight,\n header,\n stopStorage,\n storage,\n} = archive\n\nexport const createArchive = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n err: (id: string, code: number, msg: string) => void,\n notification: (method: string, subscription: string, result: any) => void,\n) => {\n const stgSubscriptions = new Map<string, Subscription>()\n\n const stg = (\n reply: (x: string) => void,\n at: string,\n items: Array<{\n key: string\n type:\n | \"value\"\n | \"hash\"\n | \"descendantsValues\"\n | \"descendantsHashes\"\n | \"closestDescendantMerkleValue\"\n }>,\n ) => {\n const subId = createOpaqueToken()\n reply(subId)\n const innerNotifiaction = (result: any) => {\n notification(\"archive_v1_storageEvent\", subId, result)\n }\n\n const subscription = getStg$(upstream, at, items)\n .pipe(\n finalize(() => {\n stgSubscriptions.delete(subId)\n }),\n )\n .subscribe(\n (items) => {\n items.forEach((item) =>\n innerNotifiaction({ event: \"storage\", ...item }),\n )\n },\n (e) => {\n innerNotifiaction({ event: \"storageError\", error: getMsgFromErr(e) })\n },\n () => {\n innerNotifiaction({ event: \"storageDone\" })\n },\n )\n\n if (!subscription.closed) stgSubscriptions.set(subId, subscription)\n }\n\n const result = (rId: string, name: string, params: Array<any>) => {\n const innerReply = (value: any) => {\n reply(rId, value)\n }\n\n const obsReply = (input: Observable<any>) => {\n // There is no need to keep these subscriptions around\n // b/c killing upstream will also kill this subscription\n input.subscribe({\n next: innerReply,\n error: (e) => {\n err(rId, e.code ?? -1, getMsgFromErr(e))\n },\n })\n }\n\n const [firstArg, secondArg, thirdArg] = params\n switch (name) {\n case body:\n return obsReply(\n upstream.getBody(firstArg).pipe(map(({ block }) => block.extrinsics)),\n )\n case call:\n return obsReply(\n upstream\n .runtimeCall(firstArg, secondArg, thirdArg)\n .pipe(map((value) => ({ success: true, value }))),\n )\n case finalizedHeight:\n return obsReply(\n upstream.subscribeBlocks().finalized$.pipe(\n map((x) => x.number),\n take(1),\n ),\n )\n case genesisHash:\n return obsReply(upstream.genesisHash)\n case hashByHeight:\n return obsReply(upstream.getBlockHash$(firstArg).pipe(map((x) => [x])))\n case header:\n return obsReply(\n upstream\n .subscribeBlocks()\n .getHeader$(firstArg)\n .pipe(map((h) => h.header)),\n )\n case stopStorage: {\n const sub = stgSubscriptions.get(firstArg)\n return sub ? sub.unsubscribe() : err(rId, -32602, \"Invalid args\")\n }\n case storage:\n return areItemsValid(secondArg)\n ? stg(innerReply, firstArg, secondArg)\n : err(rId, -32602, \"Invalid args\")\n }\n throw null\n }\n\n result.stop = () => {\n ;[...stgSubscriptions].forEach(([, s]) => s.unsubscribe())\n stgSubscriptions.clear()\n }\n\n return result\n}\n"],"names":["body","call","header","storage","reply","result","items"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { areItemsValid, getStg$ } from './storage.mjs';
5
5
  import { getMsgFromErr } from '../utils/message-from-error.mjs';
6
6
  import { chainHead } from '../../methods.mjs';
7
7
 
8
- const { follow: follow$4, header: header$1, storage: storage$2, body: body$2, call: call$2, unfollow: unfollow$4, stopOperation: stopOperation$1, unpin: unpin$2 } = chainHead;
8
+ const { follow: follow$4, header, storage: storage$1, body: body$1, call: call$1, unfollow: unfollow$4, stopOperation: stopOperation$1, unpin: unpin$2 } = chainHead;
9
9
  const createChainHead = (upstream, reply, err, notification) => {
10
10
  const subscriptions = /* @__PURE__ */ new Map();
11
11
  const _follow = (rId) => {
@@ -14,7 +14,7 @@ const createChainHead = (upstream, reply, err, notification) => {
14
14
  }
15
15
  const token = createOpaqueToken();
16
16
  const fNotification = (result2) => notification("chainHead_v1_followEvent", token, result2);
17
- const up = upstream.getBlocks(token);
17
+ const up = upstream.subscribeBlocks().getBlocks(token);
18
18
  const operations = /* @__PURE__ */ new Map();
19
19
  subscriptions.set(token, {
20
20
  id: token,
@@ -66,7 +66,7 @@ const createChainHead = (upstream, reply, err, notification) => {
66
66
  const operationId = createOpaqueToken();
67
67
  reply2({ result: "started", operationId });
68
68
  const cNotification = (output, isErr = false) => notification(
69
- call$2,
69
+ call$1,
70
70
  followId,
71
71
  isErr ? {
72
72
  operationId,
@@ -100,7 +100,7 @@ const createChainHead = (upstream, reply, err, notification) => {
100
100
  const subscription = upstream.getBody(at).subscribe(
101
101
  ({ block: { extrinsics: value } }) => {
102
102
  operations.delete(operationId);
103
- notification(body$2, followId, {
103
+ notification(body$1, followId, {
104
104
  event: "operationBodyDone",
105
105
  operationId,
106
106
  value
@@ -108,7 +108,7 @@ const createChainHead = (upstream, reply, err, notification) => {
108
108
  },
109
109
  (e) => {
110
110
  operations.delete(operationId);
111
- notification(body$2, followId, {
111
+ notification(body$1, followId, {
112
112
  event: "operationError",
113
113
  operationId,
114
114
  error: getMsgFromErr(e)
@@ -125,7 +125,7 @@ const createChainHead = (upstream, reply, err, notification) => {
125
125
  const operationId = createOpaqueToken();
126
126
  reply2({ result: "started", operationId });
127
127
  const innerNotifiaction = (msg) => {
128
- notification(storage$2, followId, msg);
128
+ notification(storage$1, followId, msg);
129
129
  };
130
130
  const subscription = getStg$(upstream, at, items).pipe(
131
131
  finalize(() => {
@@ -183,17 +183,17 @@ const createChainHead = (upstream, reply, err, notification) => {
183
183
  const [at, ...other] = rest;
184
184
  if (!ctx.up.isPinned(at)) return err(rId, -32801, "Block not pinned");
185
185
  switch (method) {
186
- case header$1:
186
+ case header:
187
187
  return _header(ctx, innerReply, at);
188
- case body$2:
188
+ case body$1:
189
189
  return _body(ctx, innerReply, at);
190
- case call$2: {
190
+ case call$1: {
191
191
  const [method2, data] = other;
192
192
  if (typeof method2 !== "string" || typeof data !== "string")
193
193
  return err(rId, -32602, "Invalid args");
194
194
  return _call(ctx, innerReply, at, method2, data);
195
195
  }
196
- case storage$2: {
196
+ case storage$1: {
197
197
  const [items] = other;
198
198
  return areItemsValid(items) ? _stg(ctx, innerReply, at, items) : err(rId, -32602, "Invalid args");
199
199
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chain-head.mjs","sources":["../../../../src/legacy/downstream/chain-head.ts"],"sourcesContent":["import { noop } from \"@polkadot-api/utils\"\nimport { finalize, Subscription } from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { areItemsValid, getStg$ } from \"./storage\"\nimport { getMsgFromErr } from \"../utils/message-from-error\"\nimport { chainHead } from \"../../methods\"\n\nconst { follow, header, storage, body, call, unfollow, stopOperation, unpin } =\n chainHead\n\nexport const createChainHead = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n err: (id: string, code: number, msg: string) => void,\n notification: (method: string, subscription: string, result: any) => void,\n) => {\n type SubCtx = {\n id: string\n up: ReturnType<typeof upstream.getBlocks>\n operations: Map<string, () => void>\n cleanUp: () => void\n }\n const subscriptions = new Map<string, SubCtx>()\n\n const _follow = (rId: string) => {\n if (subscriptions.size === 2) {\n return err(rId, -32800, \"Limit reached\")\n }\n const token = createOpaqueToken()\n const fNotification = (result: any) =>\n notification(\"chainHead_v1_followEvent\", token, result)\n const up = upstream.getBlocks(token)\n const operations = new Map<string, () => void>()\n subscriptions.set(token, {\n id: token,\n up,\n operations,\n cleanUp: () => {\n cleanUp()\n },\n })\n\n reply(rId, token)\n\n let subscription: Subscription | null = null\n let cleanUp = () => {\n cleanUp = noop\n subscription?.unsubscribe()\n subscription = null as any\n operations.forEach((cb) => {\n cb()\n })\n operations.clear()\n subscriptions.delete(token)\n }\n\n subscription = up.blocks$.subscribe({\n next(v) {\n fNotification(v)\n },\n error() {\n cleanUp()\n fNotification({ event: \"stop\" })\n },\n })\n if (subscription.closed) subscription = null\n }\n\n const _unfollow = (rId: string, followId: string) => {\n subscriptions.get(followId)?.cleanUp()\n reply(rId, \"null\")\n }\n\n const _stopOperation = (\n rId: string,\n followId: string,\n operationId: string,\n ) => {\n const cb = subscriptions.get(followId)?.operations.get(operationId)\n if (cb) cb()\n reply(rId, \"null\")\n }\n\n const _header = (\n { up: { getHeader } }: SubCtx,\n reply: (x: any) => void,\n at: string,\n ) => reply(getHeader(at))\n\n const _unpin = (\n { up: { unpin: innerUnpin } }: SubCtx,\n reply: (x: any) => void,\n hashOrHashes: string | string[],\n ) => {\n const hashes =\n typeof hashOrHashes === \"string\" ? [hashOrHashes] : hashOrHashes\n hashes.forEach(innerUnpin)\n reply(null)\n }\n\n const _call = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n method: string,\n args: string,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const cNotification = (output: any, isErr = false) =>\n notification(\n call,\n followId,\n isErr\n ? {\n operationId,\n event: \"operationError\",\n error: output,\n }\n : {\n operationId,\n event: \"operationCallDone\",\n output,\n },\n )\n const subscription = upstream.runtimeCall(at, method, args).subscribe(\n (output) => {\n operations.delete(operationId)\n cNotification(output)\n },\n (e) => {\n operations.delete(operationId)\n cNotification(getMsgFromErr(e), true)\n },\n )\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n operations.delete(operationId)\n })\n }\n\n const _body = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const subscription = upstream.getBody(at).subscribe(\n ({ block: { extrinsics: value } }) => {\n operations.delete(operationId)\n notification(body, followId, {\n event: \"operationBodyDone\",\n operationId,\n value,\n })\n },\n (e) => {\n operations.delete(operationId)\n notification(body, followId, {\n event: \"operationError\",\n operationId,\n error: getMsgFromErr(e),\n })\n },\n )\n\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n operations.delete(operationId)\n })\n }\n\n const _stg = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n items: Array<{\n key: string\n type:\n | \"value\"\n | \"hash\"\n | \"descendantsValues\"\n | \"descendantsHashes\"\n | \"closestDescendantMerkleValue\"\n }>,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const innerNotifiaction = (msg: any) => {\n notification(storage, followId, msg)\n }\n const subscription = getStg$(upstream, at, items)\n .pipe(\n finalize(() => {\n operations.delete(operationId)\n }),\n )\n .subscribe(\n (items) => {\n innerNotifiaction({\n event: \"operationStorageItems\",\n operationId,\n items,\n })\n },\n (e) => {\n innerNotifiaction({\n event: \"operationError\",\n operationId,\n error: getMsgFromErr(e),\n })\n },\n () => {\n innerNotifiaction({\n event: \"operationStorageDone\",\n operationId,\n })\n },\n )\n\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n })\n }\n\n const result = (rId: string, method: string, params: Array<any>) => {\n if (method === follow) return _follow(rId)\n const [followId, ...rest] = params as [string, ...any[]]\n const ctx = subscriptions.get(followId)\n if (!ctx) return err(rId, -32602, \"Ivalid followSubscription\")\n\n const innerReply = (value: any) => {\n reply(rId, value)\n }\n\n switch (method) {\n case unfollow:\n return _unfollow(rId, followId)\n case stopOperation:\n return _stopOperation(rId, followId, rest[0])\n case unpin: {\n const [hashOrHashes] = rest\n if (\n (Array.isArray(hashOrHashes) ? hashOrHashes : [hashOrHashes]).some(\n (hash) => typeof hash !== \"string\",\n )\n )\n return err(rId, -32602, \"Invalid args\")\n return _unpin(ctx, innerReply, hashOrHashes)\n }\n default: {\n const [at, ...other] = rest as [string, ...any[]]\n if (!ctx.up.isPinned(at)) return err(rId, -32801, \"Block not pinned\")\n\n switch (method) {\n case header:\n return _header(ctx, innerReply, at)\n case body:\n return _body(ctx, innerReply, at)\n case call: {\n const [method, data] = other\n if (typeof method !== \"string\" || typeof data !== \"string\")\n return err(rId, -32602, \"Invalid args\")\n return _call(ctx, innerReply, at, method, data)\n }\n case storage: {\n const [items] = other\n return areItemsValid(items)\n ? _stg(ctx, innerReply, at, items)\n : err(rId, -32602, \"Invalid args\")\n }\n }\n }\n }\n throw null\n }\n\n result.stop = () => {\n subscriptions.forEach((x) => {\n x.cleanUp()\n })\n }\n return result\n}\n"],"names":["follow","header","storage","body","call","unfollow","stopOperation","unpin","result","reply","items","method"],"mappings":"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"}
1
+ {"version":3,"file":"chain-head.mjs","sources":["../../../../src/legacy/downstream/chain-head.ts"],"sourcesContent":["import { noop } from \"@polkadot-api/utils\"\nimport { finalize, Subscription } from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { areItemsValid, getStg$ } from \"./storage\"\nimport { getMsgFromErr } from \"../utils/message-from-error\"\nimport { chainHead } from \"../../methods\"\n\nconst { follow, header, storage, body, call, unfollow, stopOperation, unpin } =\n chainHead\n\nexport const createChainHead = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n err: (id: string, code: number, msg: string) => void,\n notification: (method: string, subscription: string, result: any) => void,\n) => {\n type SubCtx = {\n id: string\n up: ReturnType<\n ReturnType<(typeof upstream)[\"subscribeBlocks\"]>[\"getBlocks\"]\n >\n operations: Map<string, () => void>\n cleanUp: () => void\n }\n const subscriptions = new Map<string, SubCtx>()\n\n const _follow = (rId: string) => {\n if (subscriptions.size === 2) {\n return err(rId, -32800, \"Limit reached\")\n }\n const token = createOpaqueToken()\n const fNotification = (result: any) =>\n notification(\"chainHead_v1_followEvent\", token, result)\n const up = upstream.subscribeBlocks().getBlocks(token)\n const operations = new Map<string, () => void>()\n subscriptions.set(token, {\n id: token,\n up,\n operations,\n cleanUp: () => {\n cleanUp()\n },\n })\n\n reply(rId, token)\n\n let subscription: Subscription | null = null\n let cleanUp = () => {\n cleanUp = noop\n subscription?.unsubscribe()\n subscription = null as any\n operations.forEach((cb) => {\n cb()\n })\n operations.clear()\n subscriptions.delete(token)\n }\n\n subscription = up.blocks$.subscribe({\n next(v) {\n fNotification(v)\n },\n error() {\n cleanUp()\n fNotification({ event: \"stop\" })\n },\n })\n if (subscription.closed) subscription = null\n }\n\n const _unfollow = (rId: string, followId: string) => {\n subscriptions.get(followId)?.cleanUp()\n reply(rId, \"null\")\n }\n\n const _stopOperation = (\n rId: string,\n followId: string,\n operationId: string,\n ) => {\n const cb = subscriptions.get(followId)?.operations.get(operationId)\n if (cb) cb()\n reply(rId, \"null\")\n }\n\n const _header = (\n { up: { getHeader } }: SubCtx,\n reply: (x: any) => void,\n at: string,\n ) => reply(getHeader(at))\n\n const _unpin = (\n { up: { unpin: innerUnpin } }: SubCtx,\n reply: (x: any) => void,\n hashOrHashes: string | string[],\n ) => {\n const hashes =\n typeof hashOrHashes === \"string\" ? [hashOrHashes] : hashOrHashes\n hashes.forEach(innerUnpin)\n reply(null)\n }\n\n const _call = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n method: string,\n args: string,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const cNotification = (output: any, isErr = false) =>\n notification(\n call,\n followId,\n isErr\n ? {\n operationId,\n event: \"operationError\",\n error: output,\n }\n : {\n operationId,\n event: \"operationCallDone\",\n output,\n },\n )\n const subscription = upstream.runtimeCall(at, method, args).subscribe(\n (output) => {\n operations.delete(operationId)\n cNotification(output)\n },\n (e) => {\n operations.delete(operationId)\n cNotification(getMsgFromErr(e), true)\n },\n )\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n operations.delete(operationId)\n })\n }\n\n const _body = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const subscription = upstream.getBody(at).subscribe(\n ({ block: { extrinsics: value } }) => {\n operations.delete(operationId)\n notification(body, followId, {\n event: \"operationBodyDone\",\n operationId,\n value,\n })\n },\n (e) => {\n operations.delete(operationId)\n notification(body, followId, {\n event: \"operationError\",\n operationId,\n error: getMsgFromErr(e),\n })\n },\n )\n\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n operations.delete(operationId)\n })\n }\n\n const _stg = (\n { operations, id: followId }: SubCtx,\n reply: (x: any) => void,\n at: string,\n items: Array<{\n key: string\n type:\n | \"value\"\n | \"hash\"\n | \"descendantsValues\"\n | \"descendantsHashes\"\n | \"closestDescendantMerkleValue\"\n }>,\n ) => {\n const operationId = createOpaqueToken()\n reply({ result: \"started\", operationId })\n const innerNotifiaction = (msg: any) => {\n notification(storage, followId, msg)\n }\n const subscription = getStg$(upstream, at, items)\n .pipe(\n finalize(() => {\n operations.delete(operationId)\n }),\n )\n .subscribe(\n (items) => {\n innerNotifiaction({\n event: \"operationStorageItems\",\n operationId,\n items,\n })\n },\n (e) => {\n innerNotifiaction({\n event: \"operationError\",\n operationId,\n error: getMsgFromErr(e),\n })\n },\n () => {\n innerNotifiaction({\n event: \"operationStorageDone\",\n operationId,\n })\n },\n )\n\n if (!subscription.closed)\n operations.set(operationId, () => {\n subscription.unsubscribe()\n })\n }\n\n const result = (rId: string, method: string, params: Array<any>) => {\n if (method === follow) return _follow(rId)\n const [followId, ...rest] = params as [string, ...any[]]\n const ctx = subscriptions.get(followId)\n if (!ctx) return err(rId, -32602, \"Ivalid followSubscription\")\n\n const innerReply = (value: any) => {\n reply(rId, value)\n }\n\n switch (method) {\n case unfollow:\n return _unfollow(rId, followId)\n case stopOperation:\n return _stopOperation(rId, followId, rest[0])\n case unpin: {\n const [hashOrHashes] = rest\n if (\n (Array.isArray(hashOrHashes) ? hashOrHashes : [hashOrHashes]).some(\n (hash) => typeof hash !== \"string\",\n )\n )\n return err(rId, -32602, \"Invalid args\")\n return _unpin(ctx, innerReply, hashOrHashes)\n }\n default: {\n const [at, ...other] = rest as [string, ...any[]]\n if (!ctx.up.isPinned(at)) return err(rId, -32801, \"Block not pinned\")\n\n switch (method) {\n case header:\n return _header(ctx, innerReply, at)\n case body:\n return _body(ctx, innerReply, at)\n case call: {\n const [method, data] = other\n if (typeof method !== \"string\" || typeof data !== \"string\")\n return err(rId, -32602, \"Invalid args\")\n return _call(ctx, innerReply, at, method, data)\n }\n case storage: {\n const [items] = other\n return areItemsValid(items)\n ? _stg(ctx, innerReply, at, items)\n : err(rId, -32602, \"Invalid args\")\n }\n }\n }\n }\n throw null\n }\n\n result.stop = () => {\n subscriptions.forEach((x) => {\n x.cleanUp()\n })\n }\n return result\n}\n"],"names":["follow","storage","body","call","unfollow","stopOperation","unpin","result","reply","items","method"],"mappings":";;;;;;;AAQA,MAAM,UAAEA,UAAQ,MAAA,WAAQC,SAAA,QAASC,cAAMC,MAAA,YAAMC,UAAA,iBAAUC,eAAA,SAAeC,OAAA,EAAM,GAC1E,SAAA;AAEK,MAAM,eAAA,GAAkB,CAC7B,QAAA,EACA,KAAA,EACA,KACA,YAAA,KACG;AASH,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAE9C,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAgB;AAC/B,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,IAAA,MAAM,gBAAgB,CAACC,OAAAA,KACrB,YAAA,CAAa,0BAAA,EAA4B,OAAOA,OAAM,CAAA;AACxD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,eAAA,EAAgB,CAAE,UAAU,KAAK,CAAA;AACrD,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAwB;AAC/C,IAAA,aAAA,CAAc,IAAI,KAAA,EAAO;AAAA,MACvB,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,KACD,CAAA;AAED,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAEhB,IAAA,IAAI,YAAA,GAAoC,IAAA;AACxC,IAAA,IAAI,UAAU,MAAM;AAClB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,YAAA,EAAc,WAAA,EAAY;AAC1B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,EAAA,KAAO;AACzB,QAAA,EAAA,EAAG;AAAA,MACL,CAAC,CAAA;AACD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,aAAA,CAAc,OAAO,KAAK,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,YAAA,GAAe,EAAA,CAAG,QAAQ,SAAA,CAAU;AAAA,MAClC,KAAK,CAAA,EAAG;AACN,QAAA,aAAA,CAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,KAAA,GAAQ;AACN,QAAA,OAAA,EAAQ;AACR,QAAA,aAAA,CAAc,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,MACjC;AAAA,KACD,CAAA;AACD,IAAA,IAAI,YAAA,CAAa,QAAQ,YAAA,GAAe,IAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,EAAa,QAAA,KAAqB;AACnD,IAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG,OAAA,EAAQ;AACrC,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CACrB,GAAA,EACA,QAAA,EACA,WAAA,KACG;AACH,IAAA,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG,UAAA,CAAW,IAAI,WAAW,CAAA;AAClE,IAAA,IAAI,IAAI,EAAA,EAAG;AACX,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CACd,EAAE,EAAA,EAAI,EAAE,SAAA,EAAU,EAAE,EACpBC,MAAAA,EACA,EAAA,KACGA,MAAAA,CAAM,SAAA,CAAU,EAAE,CAAC,CAAA;AAExB,EAAA,MAAM,MAAA,GAAS,CACb,EAAE,EAAA,EAAI,EAAE,OAAO,UAAA,EAAW,EAAE,EAC5BA,MAAAA,EACA,YAAA,KACG;AACH,IAAA,MAAM,SACJ,OAAO,YAAA,KAAiB,QAAA,GAAW,CAAC,YAAY,CAAA,GAAI,YAAA;AACtD,IAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AACzB,IAAAA,OAAM,IAAI,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CACZ,EAAE,UAAA,EAAY,EAAA,EAAI,UAAS,EAC3BA,MAAAA,EACA,EAAA,EACA,MAAA,EACA,IAAA,KACG;AACH,IAAA,MAAM,cAAc,iBAAA,EAAkB;AACtC,IAAAA,MAAAA,CAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAa,CAAA;AACxC,IAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAa,KAAA,GAAQ,KAAA,KAC1C,YAAA;AAAA,MACEL,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,GACI;AAAA,QACE,WAAA;AAAA,QACA,KAAA,EAAO,gBAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT,GACA;AAAA,QACE,WAAA;AAAA,QACA,KAAA,EAAO,mBAAA;AAAA,QACP;AAAA;AACF,KACN;AACF,IAAA,MAAM,eAAe,QAAA,CAAS,WAAA,CAAY,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA,CAAE,SAAA;AAAA,MAC1D,CAAC,MAAA,KAAW;AACV,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAC7B,QAAA,aAAA,CAAc,MAAM,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAC7B,QAAA,aAAA,CAAc,aAAA,CAAc,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,MACtC;AAAA,KACF;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,MAAA;AAChB,MAAA,UAAA,CAAW,GAAA,CAAI,aAAa,MAAM;AAChC,QAAA,YAAA,CAAa,WAAA,EAAY;AACzB,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,EACL,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CACZ,EAAE,UAAA,EAAY,IAAI,QAAA,EAAS,EAC3BK,QACA,EAAA,KACG;AACH,IAAA,MAAM,cAAc,iBAAA,EAAkB;AACtC,IAAAA,MAAAA,CAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAa,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,CAAE,SAAA;AAAA,MACxC,CAAC,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,IAAQ,KAAM;AACpC,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAC7B,QAAA,YAAA,CAAaN,QAAM,QAAA,EAAU;AAAA,UAC3B,KAAA,EAAO,mBAAA;AAAA,UACP,WAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAC7B,QAAA,YAAA,CAAaA,QAAM,QAAA,EAAU;AAAA,UAC3B,KAAA,EAAO,gBAAA;AAAA,UACP,WAAA;AAAA,UACA,KAAA,EAAO,cAAc,CAAC;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,MAAA;AAChB,MAAA,UAAA,CAAW,GAAA,CAAI,aAAa,MAAM;AAChC,QAAA,YAAA,CAAa,WAAA,EAAY;AACzB,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,EACL,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CACX,EAAE,UAAA,EAAY,IAAI,QAAA,EAAS,EAC3BM,MAAAA,EACA,EAAA,EACA,KAAA,KASG;AACH,IAAA,MAAM,cAAc,iBAAA,EAAkB;AACtC,IAAAA,MAAAA,CAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAa,CAAA;AACxC,IAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KAAa;AACtC,MAAA,YAAA,CAAaP,SAAA,EAAS,UAAU,GAAG,CAAA;AAAA,IACrC,CAAA;AACA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,EAAU,EAAA,EAAI,KAAK,CAAA,CAC7C,IAAA;AAAA,MACC,SAAS,MAAM;AACb,QAAA,UAAA,CAAW,OAAO,WAAW,CAAA;AAAA,MAC/B,CAAC;AAAA,KACH,CACC,SAAA;AAAA,MACC,CAACQ,MAAAA,KAAU;AACT,QAAA,iBAAA,CAAkB;AAAA,UAChB,KAAA,EAAO,uBAAA;AAAA,UACP,WAAA;AAAA,UACA,KAAA,EAAAA;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,iBAAA,CAAkB;AAAA,UAChB,KAAA,EAAO,gBAAA;AAAA,UACP,WAAA;AAAA,UACA,KAAA,EAAO,cAAc,CAAC;AAAA,SACvB,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM;AACJ,QAAA,iBAAA,CAAkB;AAAA,UAChB,KAAA,EAAO,sBAAA;AAAA,UACP;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAEF,IAAA,IAAI,CAAC,YAAA,CAAa,MAAA;AAChB,MAAA,UAAA,CAAW,GAAA,CAAI,aAAa,MAAM;AAChC,QAAA,YAAA,CAAa,WAAA,EAAY;AAAA,MAC3B,CAAC,CAAA;AAAA,EACL,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAa,MAAA,EAAgB,MAAA,KAAuB;AAClE,IAAA,IAAI,MAAA,KAAWT,QAAA,EAAQ,OAAO,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,MAAM,CAAC,QAAA,EAAU,GAAG,IAAI,CAAA,GAAI,MAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,GAAA,CAAI,GAAA,EAAK,QAAQ,2BAA2B,CAAA;AAE7D,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAe;AACjC,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAKI,UAAA;AACH,QAAA,OAAO,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MAChC,KAAKC,eAAA;AACH,QAAA,OAAO,cAAA,CAAe,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC9C,KAAKC,OAAA,EAAO;AACV,QAAA,MAAM,CAAC,YAAY,CAAA,GAAI,IAAA;AACvB,QAAA,IAAA,CACG,MAAM,OAAA,CAAQ,YAAY,IAAI,YAAA,GAAe,CAAC,YAAY,CAAA,EAAG,IAAA;AAAA,UAC5D,CAAC,IAAA,KAAS,OAAO,IAAA,KAAS;AAAA,SAC5B;AAEA,UAAA,OAAO,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,cAAc,CAAA;AACxC,QAAA,OAAO,MAAA,CAAO,GAAA,EAAK,UAAA,EAAY,YAAY,CAAA;AAAA,MAC7C;AAAA,MACA,SAAS;AACP,QAAA,MAAM,CAAC,EAAA,EAAI,GAAG,KAAK,CAAA,GAAI,IAAA;AACvB,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,EAAE,GAAG,OAAO,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,kBAAkB,CAAA;AAEpE,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,MAAA;AACH,YAAA,OAAO,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,EAAE,CAAA;AAAA,UACpC,KAAKJ,MAAA;AACH,YAAA,OAAO,KAAA,CAAM,GAAA,EAAK,UAAA,EAAY,EAAE,CAAA;AAAA,UAClC,KAAKC,MAAA,EAAM;AACT,YAAA,MAAM,CAACO,OAAAA,EAAQ,IAAI,CAAA,GAAI,KAAA;AACvB,YAAA,IAAI,OAAOA,OAAAA,KAAW,QAAA,IAAY,OAAO,IAAA,KAAS,QAAA;AAChD,cAAA,OAAO,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,cAAc,CAAA;AACxC,YAAA,OAAO,KAAA,CAAM,GAAA,EAAK,UAAA,EAAY,EAAA,EAAIA,SAAQ,IAAI,CAAA;AAAA,UAChD;AAAA,UACA,KAAKT,SAAA,EAAS;AACZ,YAAA,MAAM,CAAC,KAAK,CAAA,GAAI,KAAA;AAChB,YAAA,OAAO,aAAA,CAAc,KAAK,CAAA,GACtB,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,EAAA,EAAI,KAAK,CAAA,GAC/B,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,cAAc,CAAA;AAAA,UACrC;AAAA;AACF,MACF;AAAA;AAEF,IAAA,MAAM,IAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAA,CAAO,OAAO,MAAM;AAClB,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC3B,MAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,IACZ,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1,11 +1,11 @@
1
+ import { createClient } from '@polkadot-api/raw-client';
1
2
  import { noop } from '@polkadot-api/utils';
3
+ import { chainHead, chainSpec, archive, transaction } from '../../methods.mjs';
2
4
  import { createUpstream } from '../upstream/upstream.mjs';
5
+ import { createArchive } from './archive.mjs';
3
6
  import { createChainSpec } from './chainspec.mjs';
4
- import { createChainHead } from './chain-head.mjs';
5
7
  import { createTransactionFns } from './transaction.mjs';
6
- import { createArchive } from './archive.mjs';
7
- import { createClient } from '@polkadot-api/raw-client';
8
- import { chainHead, chainSpec, archive, transaction } from '../../methods.mjs';
8
+ import { createChainHead } from './chain-head.mjs';
9
9
 
10
10
  const supportedMethods = new Set(
11
11
  [chainHead, chainSpec, archive, transaction].map((methods) => Object.values(methods)).flat()
@@ -40,16 +40,22 @@ const withLegacy = (base) => (onMessage, onHalt) => {
40
40
  const notification = (method, subscription, result) => {
41
41
  jsonRpc({ method, params: { subscription, result } });
42
42
  };
43
- const groups = {
44
- chainSpec: createChainSpec(upstream, reply, err),
45
- chainHead: createChainHead(upstream, reply, err, notification),
46
- archive: createArchive(upstream, reply, err, notification),
47
- transaction: createTransactionFns(upstream, reply)
43
+ const groupsCtor = {
44
+ chainSpec: () => createChainSpec(upstream, reply, err),
45
+ chainHead: () => createChainHead(upstream, reply, err, notification),
46
+ archive: () => createArchive(upstream, reply, err, notification),
47
+ transaction: () => createTransactionFns(upstream, reply)
48
+ };
49
+ const groups = {};
50
+ const getGroup = (name) => {
51
+ if (name in groups) return groups[name];
52
+ if (name in groupsCtor) return groups[name] = groupsCtor[name]();
53
+ return null;
48
54
  };
49
55
  clean = () => {
50
- groups.chainHead.stop();
51
- groups.archive.stop();
52
- groups.transaction.stop();
56
+ groups.chainHead?.stop();
57
+ groups.archive?.stop();
58
+ groups.transaction?.stop();
53
59
  upstream.clean();
54
60
  };
55
61
  return {
@@ -78,9 +84,10 @@ ${JSON.stringify(parsedMsg)}`);
78
84
  );
79
85
  }
80
86
  const [groupName] = method.split("_");
81
- if (groupName in groups) {
87
+ const group = getGroup(groupName);
88
+ if (group) {
82
89
  try {
83
- return groups[groupName](id, method, params);
90
+ return group(id, method, params);
84
91
  } catch (e) {
85
92
  if (e !== null) throw e;
86
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"downstream.mjs","sources":["../../../../src/legacy/downstream/downstream.ts"],"sourcesContent":["import { noop } from \"@polkadot-api/utils\"\nimport { createUpstream } from \"../upstream\"\nimport { createChainSpec } from \"./chainspec\"\nimport { createChainHead } from \"./chain-head\"\nimport { createTransactionFns } from \"./transaction\"\nimport { createArchive } from \"./archive\"\nimport { Middleware } from \"../../types\"\nimport { createClient } from \"@polkadot-api/raw-client\"\nimport { JsonRpcMessage } from \"@polkadot-api/json-rpc-provider\"\nimport { archive, chainHead, chainSpec, transaction } from \"../../methods\"\n\nconst supportedMethods = new Set(\n [chainHead, chainSpec, archive, transaction]\n .map((methods) => Object.values(methods) as string[])\n .flat(),\n)\n\nexport const withLegacy: Middleware = (base) => (onMessage, onHalt) => {\n let clean = noop\n let onMsg: (msg: JsonRpcMessage) => void = noop\n const innerConnection = base(\n (msg) => {\n onMsg(msg)\n },\n (e) => {\n clean()\n onHalt(e)\n },\n )\n const { disconnect, request } = createClient((_onMsg) => {\n onMsg = _onMsg\n return innerConnection\n }, onMessage)\n const upstream = createUpstream(request)\n\n const jsonRpc = (\n input:\n | ({ id: string } & (\n | { result: any }\n | { error: { code: number; message: string } }\n ))\n | {\n method: string\n params: { subscription: string; result: any }\n },\n ) =>\n onMessage({\n jsonrpc: \"2.0\",\n ...input,\n })\n\n const reply = (id: string, result: any) => {\n jsonRpc({ id, result })\n }\n const err = (id: string, code: number, message: string) => {\n jsonRpc({ id, error: { code, message } })\n }\n const notification = (method: string, subscription: string, result: any) => {\n jsonRpc({ method, params: { subscription, result } })\n }\n\n const groups = {\n chainSpec: createChainSpec(upstream, reply, err),\n chainHead: createChainHead(upstream, reply, err, notification),\n archive: createArchive(upstream, reply, err, notification),\n transaction: createTransactionFns(upstream, reply),\n }\n\n clean = () => {\n groups.chainHead.stop()\n groups.archive.stop()\n groups.transaction.stop()\n upstream.clean()\n }\n\n return {\n send: (parsedMsg: any) => {\n if (!parsedMsg) return\n const { id, method, params } = parsedMsg\n if (\n (id !== null && typeof id !== \"string\" && typeof id !== \"number\") ||\n typeof method !== \"string\"\n ) {\n console.warn(`Invalid message:\\n${JSON.stringify(parsedMsg)}`)\n return\n }\n if (method === \"rpc_methods\") {\n return upstream.methods.subscribe(\n ({ methods }) => {\n reply(id, {\n methods: [\n ...supportedMethods,\n ...methods.filter((method) => !supportedMethods.has(method)),\n ],\n })\n },\n (e: any) => {\n console.error(e)\n err(id, -32602, \"Invalid\")\n },\n )\n }\n\n const [groupName] = method.split(\"_\")\n if (groupName in groups) {\n try {\n return groups[groupName as keyof typeof groups](id, method, params)\n } catch (e) {\n if (e !== null) throw e\n }\n }\n\n upstream.request(\n method,\n params,\n (value) => {\n reply(id, value)\n },\n (e) => {\n err(id, e?.code || -1, e?.message || \"\")\n },\n )\n },\n disconnect: () => {\n clean()\n disconnect()\n },\n }\n}\n"],"names":["method"],"mappings":"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"}
1
+ {"version":3,"file":"downstream.mjs","sources":["../../../../src/legacy/downstream/downstream.ts"],"sourcesContent":["import { JsonRpcMessage } from \"@polkadot-api/json-rpc-provider\"\nimport { createClient } from \"@polkadot-api/raw-client\"\nimport { noop } from \"@polkadot-api/utils\"\nimport { archive, chainHead, chainSpec, transaction } from \"../../methods\"\nimport { Middleware } from \"../../types\"\nimport { createUpstream } from \"../upstream\"\nimport { createArchive } from \"./archive\"\nimport { createChainSpec } from \"./chainspec\"\nimport { createTransactionFns } from \"./transaction\"\nimport { createChainHead } from \"./chain-head\"\n\nconst supportedMethods = new Set(\n [chainHead, chainSpec, archive, transaction]\n .map((methods) => Object.values(methods) as string[])\n .flat(),\n)\n\nexport const withLegacy: Middleware = (base) => (onMessage, onHalt) => {\n let clean = noop\n let onMsg: (msg: JsonRpcMessage) => void = noop\n const innerConnection = base(\n (msg) => {\n onMsg(msg)\n },\n (e) => {\n clean()\n onHalt(e)\n },\n )\n const { disconnect, request } = createClient((_onMsg) => {\n onMsg = _onMsg\n return innerConnection\n }, onMessage)\n const upstream = createUpstream(request)\n\n const jsonRpc = (\n input:\n | ({ id: string } & (\n | { result: any }\n | { error: { code: number; message: string } }\n ))\n | {\n method: string\n params: { subscription: string; result: any }\n },\n ) =>\n onMessage({\n jsonrpc: \"2.0\",\n ...input,\n })\n\n const reply = (id: string, result: any) => {\n jsonRpc({ id, result })\n }\n const err = (id: string, code: number, message: string) => {\n jsonRpc({ id, error: { code, message } })\n }\n const notification = (method: string, subscription: string, result: any) => {\n jsonRpc({ method, params: { subscription, result } })\n }\n\n const groupsCtor: Record<string, () => any> = {\n chainSpec: () => createChainSpec(upstream, reply, err),\n chainHead: () => createChainHead(upstream, reply, err, notification),\n archive: () => createArchive(upstream, reply, err, notification),\n transaction: () => createTransactionFns(upstream, reply),\n }\n const groups: Record<string, any> = {}\n const getGroup = (name: string) => {\n if (name in groups) return groups[name]\n if (name in groupsCtor) return (groups[name] = groupsCtor[name]())\n return null\n }\n clean = () => {\n groups.chainHead?.stop()\n groups.archive?.stop()\n groups.transaction?.stop()\n upstream.clean()\n }\n\n return {\n send: (parsedMsg: any) => {\n if (!parsedMsg) return\n const { id, method, params } = parsedMsg\n if (\n (id !== null && typeof id !== \"string\" && typeof id !== \"number\") ||\n typeof method !== \"string\"\n ) {\n console.warn(`Invalid message:\\n${JSON.stringify(parsedMsg)}`)\n return\n }\n if (method === \"rpc_methods\") {\n return upstream.methods.subscribe(\n ({ methods }) => {\n reply(id, {\n methods: [\n ...supportedMethods,\n ...methods.filter((method) => !supportedMethods.has(method)),\n ],\n })\n },\n (e: any) => {\n console.error(e)\n err(id, -32602, \"Invalid\")\n },\n )\n }\n\n const [groupName] = method.split(\"_\")\n const group = getGroup(groupName)\n if (group) {\n try {\n return group(id, method, params)\n } catch (e) {\n if (e !== null) throw e\n }\n }\n\n upstream.request(\n method,\n params,\n (value) => {\n reply(id, value)\n },\n (e) => {\n err(id, e?.code || -1, e?.message || \"\")\n },\n )\n },\n disconnect: () => {\n clean()\n disconnect()\n },\n }\n}\n"],"names":["method"],"mappings":"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"}
@@ -22,7 +22,7 @@ const createTransactionFns = (upstream, reply) => {
22
22
  // This logic ensures that the subscription dies if an
23
23
  // upstream error (like the client being destroyed) takes place
24
24
  takeUntil(
25
- upstream.finalized$.pipe(
25
+ upstream.subscribeBlocks().finalized$.pipe(
26
26
  ignoreElements(),
27
27
  catchError(() => {
28
28
  ongoing.delete(token);
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.mjs","sources":["../../../../src/legacy/downstream/transaction.ts"],"sourcesContent":["import {\n catchError,\n concat,\n ignoreElements,\n Subscription,\n takeUntil,\n timer,\n} from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { transaction } from \"../../methods\"\n\nconst { stop, broadcast } = transaction\nexport const createTransactionFns = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n) => {\n const ongoing = new Map<string, Subscription>()\n const result = (rId: string, method: string, args: any[]) => {\n if (method === stop) {\n const [token] = args\n ongoing.get(token)?.unsubscribe()\n ongoing.delete(token)\n reply(rId, null)\n } else if (method === broadcast) {\n const token = createOpaqueToken()\n ongoing.set(\n token,\n upstream\n .obsRequest(\"author_submitExtrinsic\", args)\n .pipe(\n // We want to make sure that we keep on retrying if there\n // are errors with the `author_submitExtrinsic` request\n catchError((_, source) => concat(timer(5_000), source)),\n // This logic ensures that the subscription dies if an\n // upstream error (like the client being destroyed) takes place\n takeUntil(\n upstream.finalized$.pipe(\n ignoreElements(),\n catchError(() => {\n ongoing.delete(token)\n return [null]\n }),\n ),\n ),\n )\n .subscribe(),\n )\n reply(rId, token)\n } else {\n throw null\n }\n }\n\n result.stop = () => {\n ongoing.forEach((s) => s.unsubscribe())\n ongoing.clear()\n }\n\n return result\n}\n"],"names":[],"mappings":";;;;AAYA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,WAAA;AACrB,MAAM,oBAAA,GAAuB,CAClC,QAAA,EACA,KAAA,KACG;AACH,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAa,MAAA,EAAgB,IAAA,KAAgB;AAC3D,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,WAAA,EAAY;AAChC,MAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,MAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,KAAA;AAAA,QACA,QAAA,CACG,UAAA,CAAW,wBAAA,EAA0B,IAAI,CAAA,CACzC,IAAA;AAAA;AAAA;AAAA,UAGC,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,KAAW,OAAO,KAAA,CAAM,GAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA,UAGtD,SAAA;AAAA,YACE,SAAS,UAAA,CAAW,IAAA;AAAA,cAClB,cAAA,EAAe;AAAA,cACf,WAAW,MAAM;AACf,gBAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAA;AAAA,cACd,CAAC;AAAA;AACH;AACF,UAED,SAAA;AAAU,OACf;AACA,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,IAAA;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,OAAO,MAAM;AAClB,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AACtC,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,CAAA;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"transaction.mjs","sources":["../../../../src/legacy/downstream/transaction.ts"],"sourcesContent":["import {\n catchError,\n concat,\n ignoreElements,\n Subscription,\n takeUntil,\n timer,\n} from \"rxjs\"\nimport { createUpstream } from \"../upstream/upstream\"\nimport { createOpaqueToken } from \"../utils/create-opaque-token\"\nimport { transaction } from \"../../methods\"\n\nconst { stop, broadcast } = transaction\nexport const createTransactionFns = (\n upstream: ReturnType<typeof createUpstream>,\n reply: (id: string, result: any) => void,\n) => {\n const ongoing = new Map<string, Subscription>()\n const result = (rId: string, method: string, args: any[]) => {\n if (method === stop) {\n const [token] = args\n ongoing.get(token)?.unsubscribe()\n ongoing.delete(token)\n reply(rId, null)\n } else if (method === broadcast) {\n const token = createOpaqueToken()\n ongoing.set(\n token,\n upstream\n .obsRequest(\"author_submitExtrinsic\", args)\n .pipe(\n // We want to make sure that we keep on retrying if there\n // are errors with the `author_submitExtrinsic` request\n catchError((_, source) => concat(timer(5_000), source)),\n // This logic ensures that the subscription dies if an\n // upstream error (like the client being destroyed) takes place\n takeUntil(\n upstream.subscribeBlocks().finalized$.pipe(\n ignoreElements(),\n catchError(() => {\n ongoing.delete(token)\n return [null]\n }),\n ),\n ),\n )\n .subscribe(),\n )\n reply(rId, token)\n } else {\n throw null\n }\n }\n\n result.stop = () => {\n ongoing.forEach((s) => s.unsubscribe())\n ongoing.clear()\n }\n\n return result\n}\n"],"names":[],"mappings":";;;;AAYA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,WAAA;AACrB,MAAM,oBAAA,GAAuB,CAClC,QAAA,EACA,KAAA,KACG;AACH,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAa,MAAA,EAAgB,IAAA,KAAgB;AAC3D,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,WAAA,EAAY;AAChC,MAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,WAAW,SAAA,EAAW;AAC/B,MAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,KAAA;AAAA,QACA,QAAA,CACG,UAAA,CAAW,wBAAA,EAA0B,IAAI,CAAA,CACzC,IAAA;AAAA;AAAA;AAAA,UAGC,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,KAAW,OAAO,KAAA,CAAM,GAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA,UAGtD,SAAA;AAAA,YACE,QAAA,CAAS,eAAA,EAAgB,CAAE,UAAA,CAAW,IAAA;AAAA,cACpC,cAAA,EAAe;AAAA,cACf,WAAW,MAAM;AACf,gBAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAA;AAAA,cACd,CAAC;AAAA;AACH;AACF,UAED,SAAA;AAAU,OACf;AACA,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,IAAA;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,OAAO,MAAM;AAClB,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AACtC,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB,CAAA;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -19,13 +19,15 @@ const createUpstream = (request) => {
19
19
  }
20
20
  )
21
21
  );
22
- const {
23
- upstream: getBlocks,
24
- finalized$,
25
- getHeader$,
26
- hasher$,
27
- clean
28
- } = getBlocks$(request, obsRequest);
22
+ let blockSubscription = null;
23
+ const subscribeBlocks = () => {
24
+ blockSubscription ?? (blockSubscription = getBlocks$(request, obsRequest));
25
+ return {
26
+ ...blockSubscription,
27
+ getBlocks: blockSubscription.upstream
28
+ };
29
+ };
30
+ const clean = () => blockSubscription?.clean();
29
31
  const runtimeCall = (atBlock, method, data) => obsRequest("state_call", [
30
32
  method,
31
33
  data,
@@ -59,7 +61,7 @@ const createUpstream = (request) => {
59
61
  return getKeys().pipe(mergeMap((keys) => getValues(keys)));
60
62
  };
61
63
  const stgDescendantHashes = (at, rootKey) => stgDescendantValues(at, rootKey).pipe(
62
- withLatestFromBp(hasher$),
64
+ withLatestFromBp(subscribeBlocks().hasher$),
63
65
  map(
64
66
  ([hasher, results]) => results.map(
65
67
  ([key, value]) => [key, toHex(hasher(fromHex(value)))]
@@ -83,10 +85,8 @@ const createUpstream = (request) => {
83
85
  const getBlockHash$ = (height) => obsRequest("chain_getBlockHash", [height]);
84
86
  const genesisHash = getBlockHash$(0);
85
87
  return {
86
- getBlocks,
87
- finalized$,
88
+ subscribeBlocks,
88
89
  getBlockHash$,
89
- getHeader$,
90
90
  stgValue,
91
91
  stgHash,
92
92
  stgDescendantValues,
@@ -97,10 +97,10 @@ const createUpstream = (request) => {
97
97
  chainName,
98
98
  properties,
99
99
  genesisHash,
100
- clean,
101
100
  methods,
102
101
  request: simpleRequest,
103
- obsRequest
102
+ obsRequest,
103
+ clean
104
104
  };
105
105
  };
106
106
 
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.mjs","sources":["../../../../src/legacy/upstream/upstream.ts"],"sourcesContent":["import { ClientRequest } from \"@polkadot-api/raw-client\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\nimport { catchError, EMPTY, map, merge, mergeMap, Observable, of } from \"rxjs\"\nimport { getBlocks$ } from \"./blocks\"\nimport { withLatestFromBp } from \"../utils/with-latest-from-bp\"\nimport { createClosestDescendantMerkleValue } from \"./proofs\"\n\nexport const createUpstream = (request: ClientRequest<any, any>) => {\n const simpleRequest = <Args extends Array<any>, Payload>(\n method: string,\n params: Args,\n onSuccess: (value: Payload) => void,\n onError: (e: any) => void,\n ): (() => void) => request(method, params, { onSuccess, onError })\n\n const obsRequest = <Args extends Array<any>, Payload>(\n method: string,\n params: Args,\n ): Observable<Payload> =>\n new Observable((observer) =>\n simpleRequest<Args, Payload>(\n method,\n params,\n (v) => {\n observer.next(v)\n observer.complete()\n },\n (e) => {\n observer.error(e)\n },\n ),\n )\n\n const {\n upstream: getBlocks,\n finalized$,\n getHeader$,\n hasher$,\n clean,\n } = getBlocks$(request, obsRequest)\n\n const runtimeCall = (atBlock: string, method: string, data: string) =>\n obsRequest<[string, string, string], string | null>(\"state_call\", [\n method,\n data,\n atBlock,\n ])\n\n const stgDescendantValues = (\n at: string,\n rootKey: string,\n ): Observable<Array<[string, string]>> => {\n const PAGE_SIZE = 1000\n const getKeys = (startAtKey?: string): Observable<string[]> => {\n return obsRequest<[string, number, string | undefined, string], string[]>(\n \"state_getKeysPaged\",\n [rootKey, PAGE_SIZE, startAtKey || undefined, at],\n ).pipe(\n mergeMap((receivedKeys) => {\n const keys =\n receivedKeys[0] === startAtKey\n ? receivedKeys.slice(1)\n : receivedKeys\n\n const continuation =\n receivedKeys.length < PAGE_SIZE\n ? EMPTY\n : getKeys(receivedKeys.at(-1))\n\n return merge(of(keys), continuation)\n }),\n )\n }\n\n const getValues = (\n keys: string[],\n nSplits = 0,\n ): Observable<Array<[string, string]>> =>\n keys.length\n ? obsRequest<\n [string[], string],\n [{ block: string; changes: Array<[string, string]> }]\n >(\"state_queryStorageAt\", [keys, at]).pipe(\n map(([{ changes }]) => changes),\n catchError((e: any) => {\n if (nSplits > 3) throw e\n\n const midIdx = Math.floor(keys.length / 2)\n return merge(\n getValues(keys.slice(0, midIdx), ++nSplits),\n getValues(keys.slice(midIdx), nSplits),\n )\n }),\n )\n : EMPTY\n\n return getKeys().pipe(mergeMap((keys) => getValues(keys)))\n }\n\n const stgDescendantHashes = (at: string, rootKey: string) =>\n stgDescendantValues(at, rootKey).pipe(\n withLatestFromBp(hasher$),\n map(([hasher, results]) =>\n results.map(\n ([key, value]) =>\n [key, toHex(hasher(fromHex(value)))] as [string, string],\n ),\n ),\n )\n\n const stgClosestDescendant = createClosestDescendantMerkleValue(obsRequest)\n\n const [stgValue, stgHash] = [\"state_getStorage\", \"state_getStorageHash\"].map(\n (method) => (atBlock: string, key: string) =>\n obsRequest<[string, string | undefined], string | null>(method, [\n key,\n atBlock,\n ]),\n )\n\n const methods = obsRequest<[], { methods: string[] }>(\"rpc_methods\", [])\n const chainName = obsRequest<[], string>(\"system_name\", [])\n const properties = obsRequest<[], {}>(\"system_properties\", [])\n const getBody = (at: string) =>\n obsRequest<[string], { block: { extrinsics: Array<string> } }>(\n \"chain_getBlock\",\n [at],\n )\n\n const getBlockHash$ = (height: number) =>\n obsRequest<[height: number], string>(\"chain_getBlockHash\", [height])\n const genesisHash = getBlockHash$(0)\n\n return {\n getBlocks,\n finalized$,\n getBlockHash$,\n getHeader$,\n stgValue,\n stgHash,\n stgDescendantValues,\n stgDescendantHashes,\n stgClosestDescendant,\n runtimeCall,\n getBody,\n chainName,\n properties,\n genesisHash,\n clean,\n methods,\n request: simpleRequest,\n obsRequest,\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upstream.mjs","sources":["../../../../src/legacy/upstream/upstream.ts"],"sourcesContent":["import { ClientRequest } from \"@polkadot-api/raw-client\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\nimport { catchError, EMPTY, map, merge, mergeMap, Observable, of } from \"rxjs\"\nimport { getBlocks$ } from \"./blocks\"\nimport { withLatestFromBp } from \"../utils/with-latest-from-bp\"\nimport { createClosestDescendantMerkleValue } from \"./proofs\"\n\nexport const createUpstream = (request: ClientRequest<any, any>) => {\n const simpleRequest = <Args extends Array<any>, Payload>(\n method: string,\n params: Args,\n onSuccess: (value: Payload) => void,\n onError: (e: any) => void,\n ): (() => void) => request(method, params, { onSuccess, onError })\n\n const obsRequest = <Args extends Array<any>, Payload>(\n method: string,\n params: Args,\n ): Observable<Payload> =>\n new Observable((observer) =>\n simpleRequest<Args, Payload>(\n method,\n params,\n (v) => {\n observer.next(v)\n observer.complete()\n },\n (e) => {\n observer.error(e)\n },\n ),\n )\n\n let blockSubscription: ReturnType<typeof getBlocks$> | null = null\n const subscribeBlocks = () => {\n blockSubscription ??= getBlocks$(request, obsRequest)\n return {\n ...blockSubscription,\n getBlocks: blockSubscription.upstream,\n }\n }\n const clean = () => blockSubscription?.clean()\n\n const runtimeCall = (atBlock: string, method: string, data: string) =>\n obsRequest<[string, string, string], string | null>(\"state_call\", [\n method,\n data,\n atBlock,\n ])\n\n const stgDescendantValues = (\n at: string,\n rootKey: string,\n ): Observable<Array<[string, string]>> => {\n const PAGE_SIZE = 1000\n const getKeys = (startAtKey?: string): Observable<string[]> => {\n return obsRequest<[string, number, string | undefined, string], string[]>(\n \"state_getKeysPaged\",\n [rootKey, PAGE_SIZE, startAtKey || undefined, at],\n ).pipe(\n mergeMap((receivedKeys) => {\n const keys =\n receivedKeys[0] === startAtKey\n ? receivedKeys.slice(1)\n : receivedKeys\n\n const continuation =\n receivedKeys.length < PAGE_SIZE\n ? EMPTY\n : getKeys(receivedKeys.at(-1))\n\n return merge(of(keys), continuation)\n }),\n )\n }\n\n const getValues = (\n keys: string[],\n nSplits = 0,\n ): Observable<Array<[string, string]>> =>\n keys.length\n ? obsRequest<\n [string[], string],\n [{ block: string; changes: Array<[string, string]> }]\n >(\"state_queryStorageAt\", [keys, at]).pipe(\n map(([{ changes }]) => changes),\n catchError((e: any) => {\n if (nSplits > 3) throw e\n\n const midIdx = Math.floor(keys.length / 2)\n return merge(\n getValues(keys.slice(0, midIdx), ++nSplits),\n getValues(keys.slice(midIdx), nSplits),\n )\n }),\n )\n : EMPTY\n\n return getKeys().pipe(mergeMap((keys) => getValues(keys)))\n }\n\n const stgDescendantHashes = (at: string, rootKey: string) =>\n stgDescendantValues(at, rootKey).pipe(\n withLatestFromBp(subscribeBlocks().hasher$),\n map(([hasher, results]) =>\n results.map(\n ([key, value]) =>\n [key, toHex(hasher(fromHex(value)))] as [string, string],\n ),\n ),\n )\n\n const stgClosestDescendant = createClosestDescendantMerkleValue(obsRequest)\n\n const [stgValue, stgHash] = [\"state_getStorage\", \"state_getStorageHash\"].map(\n (method) => (atBlock: string, key: string) =>\n obsRequest<[string, string | undefined], string | null>(method, [\n key,\n atBlock,\n ]),\n )\n\n const methods = obsRequest<[], { methods: string[] }>(\"rpc_methods\", [])\n const chainName = obsRequest<[], string>(\"system_name\", [])\n const properties = obsRequest<[], {}>(\"system_properties\", [])\n const getBody = (at: string) =>\n obsRequest<[string], { block: { extrinsics: Array<string> } }>(\n \"chain_getBlock\",\n [at],\n )\n\n const getBlockHash$ = (height: number) =>\n obsRequest<[height: number], string>(\"chain_getBlockHash\", [height])\n const genesisHash = getBlockHash$(0)\n\n return {\n subscribeBlocks,\n getBlockHash$,\n stgValue,\n stgHash,\n stgDescendantValues,\n stgDescendantHashes,\n stgClosestDescendant,\n runtimeCall,\n getBody,\n chainName,\n properties,\n genesisHash,\n methods,\n request: simpleRequest,\n obsRequest,\n clean,\n }\n}\n"],"names":[],"mappings":";;;;;;AAOO,MAAM,cAAA,GAAiB,CAAC,OAAA,KAAqC;AAClE,EAAA,MAAM,aAAA,GAAgB,CACpB,MAAA,EACA,MAAA,EACA,SAAA,EACA,OAAA,KACiB,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AAEjE,EAAA,MAAM,UAAA,GAAa,CACjB,MAAA,EACA,MAAA,KAEA,IAAI,UAAA;AAAA,IAAW,CAAC,QAAA,KACd,aAAA;AAAA,MACE,MAAA;AAAA,MACA,MAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AACf,QAAA,QAAA,CAAS,QAAA,EAAS;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MAClB;AAAA;AACF,GACF;AAEF,EAAA,IAAI,iBAAA,GAA0D,IAAA;AAC9D,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,iBAAA,KAAA,iBAAA,GAAsB,UAAA,CAAW,SAAS,UAAU,CAAA,CAAA;AACpD,IAAA,OAAO;AAAA,MACL,GAAG,iBAAA;AAAA,MACH,WAAW,iBAAA,CAAkB;AAAA,KAC/B;AAAA,EACF,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,iBAAA,EAAmB,KAAA,EAAM;AAE7C,EAAA,MAAM,cAAc,CAAC,OAAA,EAAiB,MAAA,EAAgB,IAAA,KACpD,WAAoD,YAAA,EAAc;AAAA,IAChE,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,mBAAA,GAAsB,CAC1B,EAAA,EACA,OAAA,KACwC;AACxC,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,MAAM,OAAA,GAAU,CAAC,UAAA,KAA8C;AAC7D,MAAA,OAAO,UAAA;AAAA,QACL,oBAAA;AAAA,QACA,CAAC,OAAA,EAAS,SAAA,EAAW,UAAA,IAAc,QAAW,EAAE;AAAA,OAClD,CAAE,IAAA;AAAA,QACA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,UAAA,MAAM,IAAA,GACJ,aAAa,CAAC,CAAA,KAAM,aAChB,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,GACpB,YAAA;AAEN,UAAA,MAAM,YAAA,GACJ,aAAa,MAAA,GAAS,SAAA,GAClB,QACA,OAAA,CAAQ,YAAA,CAAa,EAAA,CAAG,EAAE,CAAC,CAAA;AAEjC,UAAA,OAAO,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA,EAAG,YAAY,CAAA;AAAA,QACrC,CAAC;AAAA,OACH;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAChB,IAAA,EACA,OAAA,GAAU,CAAA,KAEV,IAAA,CAAK,MAAA,GACD,UAAA,CAGE,sBAAA,EAAwB,CAAC,IAAA,EAAM,EAAE,CAAC,CAAA,CAAE,IAAA;AAAA,MACpC,IAAI,CAAC,CAAC,EAAE,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,MAC9B,UAAA,CAAW,CAAC,CAAA,KAAW;AACrB,QAAA,IAAI,OAAA,GAAU,GAAG,MAAM,CAAA;AAEvB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACzC,QAAA,OAAO,KAAA;AAAA,UACL,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,MAAM,CAAA,EAAG,EAAE,OAAO,CAAA;AAAA,UAC1C,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,GAAG,OAAO;AAAA,SACvC;AAAA,MACF,CAAC;AAAA,KACH,GACA,KAAA;AAEN,IAAA,OAAO,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,MAAM,sBAAsB,CAAC,EAAA,EAAY,YACvC,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA,CAAE,IAAA;AAAA,IAC/B,gBAAA,CAAiB,eAAA,EAAgB,CAAE,OAAO,CAAA;AAAA,IAC1C,GAAA;AAAA,MAAI,CAAC,CAAC,MAAA,EAAQ,OAAO,MACnB,OAAA,CAAQ,GAAA;AAAA,QACN,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACV,CAAC,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAC;AAAA;AACvC;AACF,GACF;AAEF,EAAA,MAAM,oBAAA,GAAuB,mCAAmC,UAAU,CAAA;AAE1E,EAAA,MAAM,CAAC,QAAA,EAAU,OAAO,IAAI,CAAC,kBAAA,EAAoB,sBAAsB,CAAA,CAAE,GAAA;AAAA,IACvE,CAAC,MAAA,KAAW,CAAC,OAAA,EAAiB,GAAA,KAC5B,WAAwD,MAAA,EAAQ;AAAA,MAC9D,GAAA;AAAA,MACA;AAAA,KACD;AAAA,GACL;AAEA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAsC,aAAA,EAAe,EAAE,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,UAAA,CAAuB,aAAA,EAAe,EAAE,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,UAAA,CAAmB,mBAAA,EAAqB,EAAE,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KACf,UAAA;AAAA,IACE,gBAAA;AAAA,IACA,CAAC,EAAE;AAAA,GACL;AAEF,EAAA,MAAM,gBAAgB,CAAC,MAAA,KACrB,WAAqC,oBAAA,EAAsB,CAAC,MAAM,CAAC,CAAA;AACrE,EAAA,MAAM,WAAA,GAAc,cAAc,CAAC,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,oBAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,aAAA;AAAA,IACT,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}