@polkadot-api/logs-provider 0.0.1 → 0.0.3

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,20 @@
1
1
  # @polkadot-api/logs-provider
2
+
3
+ This package exports a `JsonRpcProvider` enhancer to record logs of messages sent & received, and a provider that reads from these logs to replay existing sessions.
4
+
5
+ This can be useful to set up reproduction cases with a provider that behaves consistently.
6
+
7
+ ## withLogsRecorder
8
+
9
+ ```ts
10
+ function withLogsRecorder(
11
+ persistLog: (line: string) => void,
12
+ provider: JsonRpcProvider,
13
+ ): JsonRpcProvider
14
+ ```
15
+
16
+ ## logsProvider
17
+
18
+ ```ts
19
+ function logsProvider(logs: string[]): JsonRpcProvider
20
+ ```
@@ -0,0 +1,3 @@
1
+ export { logsProvider } from './logs-provider.mjs';
2
+ export { withLogsRecorder } from './with-logs-recorder.mjs';
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,90 @@
1
+ import Queue from './queue.mjs';
2
+ import { OUT } from './types.mjs';
3
+
4
+ const rawLogsToLogs = (rawLogs) => {
5
+ const result = /* @__PURE__ */ new Map();
6
+ let prevDate = "";
7
+ let tick = -1;
8
+ for (let i = 0; i < rawLogs.length; i++) {
9
+ const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(
10
+ /^(\d*)-(.{24})-(.{2})-(.*)$/
11
+ );
12
+ const clientId = Number(clientIdRaw);
13
+ tick += dateRaw === prevDate ? 0 : 1;
14
+ prevDate = dateRaw;
15
+ const logs = result.get(clientId) ?? [];
16
+ result.set(clientId, logs);
17
+ logs.push({
18
+ clientId,
19
+ tick,
20
+ type,
21
+ msg
22
+ });
23
+ }
24
+ return result;
25
+ };
26
+ const extractTx = (msg) => {
27
+ const startTxt = 'TaggedTransactionQueue_validate_transaction","';
28
+ const start = msg.lastIndexOf(startTxt) + startTxt.length + 4;
29
+ const end = msg.indexOf(`"`, start + 1);
30
+ return msg.substring(start, end - 64);
31
+ };
32
+ const logsProvider = (rawLogs) => {
33
+ let nextClientId = 1;
34
+ const allLogs = rawLogsToLogs(
35
+ rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1)
36
+ );
37
+ return (onMsg) => {
38
+ const clientId = nextClientId++;
39
+ const logs = allLogs.get(clientId);
40
+ const pending = new Queue();
41
+ let idx = 0;
42
+ let transactions = /* @__PURE__ */ new Map();
43
+ const checkForIncommingMessages = async () => {
44
+ if (!pending.peek()) return;
45
+ while (idx < logs.length && token !== void 0) {
46
+ const expected = logs[idx];
47
+ transactions.forEach((value, key) => {
48
+ expected.msg = expected.msg.replace(key, value);
49
+ });
50
+ if (expected.type === OUT) {
51
+ if (!pending.peek()) {
52
+ token = setTimeout(checkForIncommingMessages, 100);
53
+ break;
54
+ }
55
+ const received = pending.pop();
56
+ if (expected.msg.includes(
57
+ "TaggedTransactionQueue_validate_transaction"
58
+ ) && received?.includes("TaggedTransactionQueue_validate_transaction")) {
59
+ transactions.set(extractTx(expected.msg), extractTx(received));
60
+ transactions.forEach((value, key) => {
61
+ expected.msg = expected.msg.replace(key, value);
62
+ });
63
+ }
64
+ if (received !== expected.msg) {
65
+ console.log(`recieved: "${received}"`);
66
+ console.log(`expected: "${expected.msg}"`);
67
+ throw new Error("unexpected messaged was received");
68
+ }
69
+ } else {
70
+ onMsg(expected.msg);
71
+ await Promise.resolve();
72
+ }
73
+ idx++;
74
+ }
75
+ };
76
+ let token = setTimeout(checkForIncommingMessages, 200);
77
+ return {
78
+ send: (msg) => {
79
+ pending.push(msg);
80
+ },
81
+ disconnect: () => {
82
+ clearTimeout(token);
83
+ token = void 0;
84
+ }
85
+ };
86
+ };
87
+ };
88
+
89
+ export { logsProvider };
90
+ //# sourceMappingURL=logs-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-provider.mjs","sources":["../../src/logs-provider.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport Queue from \"./queue\"\nimport { In, OUT, Out } from \"./types\"\n\ninterface Log {\n clientId: number\n type: In | Out\n msg: string\n tick: number\n}\n\nconst rawLogsToLogs = (rawLogs: string[]): Map<number, Log[]> => {\n const result = new Map<number, Log[]>()\n let prevDate = \"\"\n let tick = -1\n\n for (let i = 0; i < rawLogs.length; i++) {\n const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(\n /^(\\d*)-(.{24})-(.{2})-(.*)$/,\n )!\n const clientId = Number(clientIdRaw)\n\n tick += dateRaw === prevDate ? 0 : 1\n prevDate = dateRaw\n\n const logs = result.get(clientId) ?? []\n result.set(clientId, logs)\n\n logs.push({\n clientId,\n tick,\n type: type as any,\n msg,\n })\n }\n\n return result\n}\n\nconst extractTx = (msg: string) => {\n const startTxt = 'TaggedTransactionQueue_validate_transaction\",\"'\n const start = msg.lastIndexOf(startTxt) + startTxt.length + 4\n const end = msg.indexOf(`\"`, start + 1)\n return msg.substring(start, end - 64)\n}\n\nexport const logsProvider = (rawLogs: Array<string>): JsonRpcProvider => {\n let nextClientId = 1\n const allLogs = rawLogsToLogs(\n rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1),\n )\n\n return (onMsg) => {\n const clientId = nextClientId++\n const logs = allLogs.get(clientId)!\n const pending = new Queue<string>()\n let idx = 0\n\n let transactions = new Map<string, string>()\n const checkForIncommingMessages = async () => {\n if (!pending.peek()) return\n\n while (idx < logs.length && token !== undefined) {\n const expected = logs[idx]\n transactions.forEach((value, key) => {\n expected.msg = expected.msg.replace(key, value)\n })\n if (expected.type === OUT) {\n if (!pending.peek()) {\n token = setTimeout(checkForIncommingMessages, 100)\n break\n }\n\n const received = pending.pop()\n\n if (\n expected.msg.includes(\n \"TaggedTransactionQueue_validate_transaction\",\n ) &&\n received?.includes(\"TaggedTransactionQueue_validate_transaction\")\n ) {\n transactions.set(extractTx(expected.msg), extractTx(received))\n transactions.forEach((value, key) => {\n expected.msg = expected.msg.replace(key, value)\n })\n }\n\n if (received !== expected.msg) {\n console.log(`recieved: \"${received}\"`)\n console.log(`expected: \"${expected.msg}\"`)\n throw new Error(\"unexpected messaged was received\")\n }\n } else {\n onMsg(expected.msg)\n await Promise.resolve()\n }\n idx++\n }\n }\n\n let token: undefined | number = setTimeout(checkForIncommingMessages, 200)\n\n return {\n send: (msg) => {\n pending.push(msg)\n },\n disconnect: () => {\n clearTimeout(token)\n token = undefined\n },\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ class Queue {
5
+ constructor(...vals) {
6
+ __publicField(this, "first");
7
+ __publicField(this, "last");
8
+ if (vals.length === 0) return;
9
+ vals.forEach((val) => this.push(val));
10
+ }
11
+ push(value) {
12
+ const nextLast = { value };
13
+ if (this.last === void 0) {
14
+ this.last = nextLast;
15
+ this.first = this.last;
16
+ } else {
17
+ this.last.next = nextLast;
18
+ this.last = nextLast;
19
+ }
20
+ }
21
+ pop() {
22
+ const result = this.first?.value;
23
+ if (this.first) {
24
+ this.first = this.first.next;
25
+ if (!this.first) {
26
+ this.last = void 0;
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ peek() {
32
+ return this.first?.value;
33
+ }
34
+ }
35
+
36
+ export { Queue as default };
37
+ //# sourceMappingURL=queue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.mjs","sources":["../../src/queue.ts"],"sourcesContent":["interface QueueNode<T> {\n value: T\n next?: QueueNode<T>\n}\n\nexport default class Queue<T> {\n private first?: QueueNode<T>\n private last?: QueueNode<T>\n\n constructor(...vals: T[]) {\n if (vals.length === 0) return\n vals.forEach((val) => this.push(val))\n }\n\n push(value: T) {\n const nextLast: QueueNode<T> = { value }\n if (this.last === undefined) {\n this.last = nextLast\n this.first = this.last\n } else {\n this.last.next = nextLast\n this.last = nextLast\n }\n }\n\n pop() {\n const result = this.first?.value\n if (this.first) {\n this.first = this.first.next\n if (!this.first) {\n this.last = undefined\n }\n }\n return result\n }\n\n peek() {\n return this.first?.value\n }\n}\n"],"names":[],"mappings":";;;AAKA,MAAqB,KAAS,CAAA;AAAA,EAI5B,eAAe,IAAW,EAAA;AAH1B,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAGN,IAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA,OAAA;AACvB,IAAA,IAAA,CAAK,QAAQ,CAAC,GAAA,KAAQ,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,GACtC;AAAA,EAEA,KAAK,KAAU,EAAA;AACb,IAAM,MAAA,QAAA,GAAyB,EAAE,KAAM,EAAA,CAAA;AACvC,IAAI,IAAA,IAAA,CAAK,SAAS,KAAW,CAAA,EAAA;AAC3B,MAAA,IAAA,CAAK,IAAO,GAAA,QAAA,CAAA;AACZ,MAAA,IAAA,CAAK,QAAQ,IAAK,CAAA,IAAA,CAAA;AAAA,KACb,MAAA;AACL,MAAA,IAAA,CAAK,KAAK,IAAO,GAAA,QAAA,CAAA;AACjB,MAAA,IAAA,CAAK,IAAO,GAAA,QAAA,CAAA;AAAA,KACd;AAAA,GACF;AAAA,EAEA,GAAM,GAAA;AACJ,IAAM,MAAA,MAAA,GAAS,KAAK,KAAO,EAAA,KAAA,CAAA;AAC3B,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,IAAA,CAAA;AACxB,MAAI,IAAA,CAAC,KAAK,KAAO,EAAA;AACf,QAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA,CAAA;AAAA,OACd;AAAA,KACF;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAO,GAAA;AACL,IAAA,OAAO,KAAK,KAAO,EAAA,KAAA,CAAA;AAAA,GACrB;AACF;;;;"}
@@ -0,0 +1,5 @@
1
+ const OUT = ">>";
2
+ const IN = "<<";
3
+
4
+ export { IN, OUT };
5
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","sources":["../../src/types.ts"],"sourcesContent":["export type Out = \">>\"\nexport const OUT: Out = \">>\"\n\nexport type In = \"<<\"\nexport const IN: In = \"<<\"\n"],"names":[],"mappings":"AACO,MAAM,GAAW,GAAA,KAAA;AAGjB,MAAM,EAAS,GAAA;;;;"}
@@ -0,0 +1,33 @@
1
+ import { IN, OUT } from './types.mjs';
2
+
3
+ const withLogsRecorder = (persistLog, input) => {
4
+ let nextId = 1;
5
+ let token;
6
+ let tickDate = "";
7
+ const setTickDate = () => {
8
+ tickDate = (/* @__PURE__ */ new Date()).toISOString();
9
+ token = setTimeout(setTickDate, 0);
10
+ };
11
+ return (onMsg) => {
12
+ const clientId = nextId++;
13
+ setTickDate();
14
+ const result = input((msg) => {
15
+ persistLog(`${clientId}-${tickDate}-${IN}-${msg}`);
16
+ onMsg(msg);
17
+ });
18
+ return {
19
+ ...result,
20
+ send: (msg) => {
21
+ persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`);
22
+ result.send(msg);
23
+ },
24
+ disconnect() {
25
+ clearTimeout(token);
26
+ result.disconnect();
27
+ }
28
+ };
29
+ };
30
+ };
31
+
32
+ export { withLogsRecorder };
33
+ //# sourceMappingURL=with-logs-recorder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-logs-recorder.mjs","sources":["../../src/with-logs-recorder.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { IN, OUT } from \"./types\"\n\nexport const withLogsRecorder = (\n persistLog: (log: string) => void,\n input: JsonRpcProvider,\n): JsonRpcProvider => {\n let nextId = 1\n let token: any\n let tickDate = \"\"\n const setTickDate = () => {\n tickDate = new Date().toISOString()\n token = setTimeout(setTickDate, 0)\n }\n\n return (onMsg) => {\n const clientId = nextId++\n\n setTickDate()\n\n const result = input((msg) => {\n persistLog(`${clientId}-${tickDate}-${IN}-${msg}`)\n onMsg(msg)\n })\n\n return {\n ...result,\n send: (msg) => {\n persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`)\n result.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n result.disconnect()\n },\n }\n }\n}\n"],"names":[],"mappings":";;AAGa,MAAA,gBAAA,GAAmB,CAC9B,UAAA,EACA,KACoB,KAAA;AACpB,EAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,EAAI,IAAA,KAAA,CAAA;AACJ,EAAA,IAAI,QAAW,GAAA,EAAA,CAAA;AACf,EAAA,MAAM,cAAc,MAAM;AACxB,IAAW,QAAA,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,WAAY,EAAA,CAAA;AAClC,IAAQ,KAAA,GAAA,UAAA,CAAW,aAAa,CAAC,CAAA,CAAA;AAAA,GACnC,CAAA;AAEA,EAAA,OAAO,CAAC,KAAU,KAAA;AAChB,IAAA,MAAM,QAAW,GAAA,MAAA,EAAA,CAAA;AAEjB,IAAY,WAAA,EAAA,CAAA;AAEZ,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,CAAC,GAAQ,KAAA;AAC5B,MAAW,UAAA,CAAA,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,QAAQ,IAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA,CAAA,CAAA;AACjD,MAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,KACV,CAAA,CAAA;AAED,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,IAAA,EAAM,CAAC,GAAQ,KAAA;AACb,QAAW,UAAA,CAAA,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,QAAQ,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAE,CAAA,CAAA,CAAA;AAClD,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA,CAAA;AAAA,OACjB;AAAA,MACA,UAAa,GAAA;AACX,QAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAClB,QAAA,MAAA,CAAO,UAAW,EAAA,CAAA;AAAA,OACpB;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AACF;;;;"}
package/dist/index.js CHANGED
@@ -1,42 +1,13 @@
1
- "use strict";
1
+ 'use strict';
2
+
2
3
  var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
- var __publicField = (obj, key, value) => {
21
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
22
- return value;
23
- };
24
-
25
- // src/index.ts
26
- var src_exports = {};
27
- __export(src_exports, {
28
- logsProvider: () => logsProvider,
29
- withLogsRecorder: () => withLogsRecorder
30
- });
31
- module.exports = __toCommonJS(src_exports);
32
-
33
- // src/queue.ts
34
- var Queue = class {
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ class Queue {
35
7
  constructor(...vals) {
36
8
  __publicField(this, "first");
37
9
  __publicField(this, "last");
38
- if (vals.length === 0)
39
- return;
10
+ if (vals.length === 0) return;
40
11
  vals.forEach((val) => this.push(val));
41
12
  }
42
13
  push(value) {
@@ -62,14 +33,12 @@ var Queue = class {
62
33
  peek() {
63
34
  return this.first?.value;
64
35
  }
65
- };
36
+ }
66
37
 
67
- // src/types.ts
68
- var OUT = ">>";
69
- var IN = "<<";
38
+ const OUT = ">>";
39
+ const IN = "<<";
70
40
 
71
- // src/logs-provider.ts
72
- var rawLogsToLogs = (rawLogs) => {
41
+ const rawLogsToLogs = (rawLogs) => {
73
42
  const result = /* @__PURE__ */ new Map();
74
43
  let prevDate = "";
75
44
  let tick = -1;
@@ -91,7 +60,13 @@ var rawLogsToLogs = (rawLogs) => {
91
60
  }
92
61
  return result;
93
62
  };
94
- var logsProvider = (rawLogs) => {
63
+ const extractTx = (msg) => {
64
+ const startTxt = 'TaggedTransactionQueue_validate_transaction","';
65
+ const start = msg.lastIndexOf(startTxt) + startTxt.length + 4;
66
+ const end = msg.indexOf(`"`, start + 1);
67
+ return msg.substring(start, end - 64);
68
+ };
69
+ const logsProvider = (rawLogs) => {
95
70
  let nextClientId = 1;
96
71
  const allLogs = rawLogsToLogs(
97
72
  rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1)
@@ -101,21 +76,31 @@ var logsProvider = (rawLogs) => {
101
76
  const logs = allLogs.get(clientId);
102
77
  const pending = new Queue();
103
78
  let idx = 0;
79
+ let transactions = /* @__PURE__ */ new Map();
104
80
  const checkForIncommingMessages = async () => {
105
- if (!pending.peek)
106
- return;
81
+ if (!pending.peek()) return;
107
82
  while (idx < logs.length && token !== void 0) {
108
83
  const expected = logs[idx];
84
+ transactions.forEach((value, key) => {
85
+ expected.msg = expected.msg.replace(key, value);
86
+ });
109
87
  if (expected.type === OUT) {
110
88
  if (!pending.peek()) {
111
89
  token = setTimeout(checkForIncommingMessages, 100);
112
90
  break;
113
91
  }
114
92
  const received = pending.pop();
93
+ if (expected.msg.includes(
94
+ "TaggedTransactionQueue_validate_transaction"
95
+ ) && received?.includes("TaggedTransactionQueue_validate_transaction")) {
96
+ transactions.set(extractTx(expected.msg), extractTx(received));
97
+ transactions.forEach((value, key) => {
98
+ expected.msg = expected.msg.replace(key, value);
99
+ });
100
+ }
115
101
  if (received !== expected.msg) {
116
- console.log("recieved: ", received);
117
- console.log(received);
118
- console.log("expected: ", expected.msg);
102
+ console.log(`recieved: "${received}"`);
103
+ console.log(`expected: "${expected.msg}"`);
119
104
  throw new Error("unexpected messaged was received");
120
105
  }
121
106
  } else {
@@ -138,8 +123,7 @@ var logsProvider = (rawLogs) => {
138
123
  };
139
124
  };
140
125
 
141
- // src/with-logs-recorder.ts
142
- var withLogsRecorder = (persistLog, input) => {
126
+ const withLogsRecorder = (persistLog, input) => {
143
127
  let nextId = 1;
144
128
  let token;
145
129
  let tickDate = "";
@@ -167,4 +151,7 @@ var withLogsRecorder = (persistLog, input) => {
167
151
  };
168
152
  };
169
153
  };
170
- //# sourceMappingURL=index.js.map
154
+
155
+ exports.logsProvider = logsProvider;
156
+ exports.withLogsRecorder = withLogsRecorder;
157
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/queue.ts","../src/types.ts","../src/logs-provider.ts","../src/with-logs-recorder.ts"],"sourcesContent":["export * from \"./logs-provider\"\nexport * from \"./with-logs-recorder\"\n","interface QueueNode<T> {\n value: T\n next?: QueueNode<T>\n}\n\nexport default class Queue<T> {\n private first?: QueueNode<T>\n private last?: QueueNode<T>\n\n constructor(...vals: T[]) {\n if (vals.length === 0) return\n vals.forEach((val) => this.push(val))\n }\n\n push(value: T) {\n const nextLast: QueueNode<T> = { value }\n if (this.last === undefined) {\n this.last = nextLast\n this.first = this.last\n } else {\n this.last.next = nextLast\n this.last = nextLast\n }\n }\n\n pop() {\n const result = this.first?.value\n if (this.first) {\n this.first = this.first.next\n if (!this.first) {\n this.last = undefined\n }\n }\n return result\n }\n\n peek() {\n return this.first?.value\n }\n}\n","export type Out = \">>\"\nexport const OUT: Out = \">>\"\n\nexport type In = \"<<\"\nexport const IN: In = \"<<\"\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport Queue from \"./queue\"\nimport { In, OUT, Out } from \"./types\"\n\ninterface Log {\n clientId: number\n type: In | Out\n msg: string\n tick: number\n}\n\nconst rawLogsToLogs = (rawLogs: string[]): Map<number, Log[]> => {\n const result = new Map<number, Log[]>()\n let prevDate = \"\"\n let tick = -1\n\n for (let i = 0; i < rawLogs.length; i++) {\n const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(\n /^(\\d*)-(.{24})-(.{2})-(.*)$/,\n )!\n const clientId = Number(clientIdRaw)\n\n tick += dateRaw === prevDate ? 0 : 1\n prevDate = dateRaw\n\n const logs = result.get(clientId) ?? []\n result.set(clientId, logs)\n\n logs.push({\n clientId,\n tick,\n type: type as any,\n msg,\n })\n }\n\n return result\n}\n\nexport const logsProvider = (rawLogs: Array<string>): JsonRpcProvider => {\n let nextClientId = 1\n const allLogs = rawLogsToLogs(\n rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1),\n )\n\n return (onMsg) => {\n const clientId = nextClientId++\n const logs = allLogs.get(clientId)!\n const pending = new Queue<string>()\n let idx = 0\n\n const checkForIncommingMessages = async () => {\n if (!pending.peek) return\n\n while (idx < logs.length && token !== undefined) {\n const expected = logs[idx]\n if (expected.type === OUT) {\n if (!pending.peek()) {\n token = setTimeout(checkForIncommingMessages, 100)\n break\n }\n const received = pending.pop()\n if (received !== expected.msg) {\n console.log(\"recieved: \", received)\n console.log(received)\n console.log(\"expected: \", expected.msg)\n throw new Error(\"unexpected messaged was received\")\n }\n } else {\n onMsg(expected.msg)\n await Promise.resolve()\n }\n idx++\n }\n }\n\n let token: undefined | number = setTimeout(checkForIncommingMessages, 200)\n\n return {\n send: (msg) => {\n pending.push(msg)\n },\n disconnect: () => {\n clearTimeout(token)\n token = undefined\n },\n }\n }\n}\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { IN, OUT } from \"./types\"\n\nexport const withLogsRecorder = (\n persistLog: (log: string) => void,\n input: JsonRpcProvider,\n): JsonRpcProvider => {\n let nextId = 1\n let token: any\n let tickDate = \"\"\n const setTickDate = () => {\n tickDate = new Date().toISOString()\n token = setTimeout(setTickDate, 0)\n }\n\n return (onMsg) => {\n const clientId = nextId++\n\n setTickDate()\n\n const result = input((msg) => {\n persistLog(`${clientId}-${tickDate}-${IN}-${msg}`)\n onMsg(msg)\n })\n\n return {\n ...result,\n send: (msg) => {\n persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`)\n result.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n result.disconnect()\n },\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"index.js","sources":["../src/queue.ts","../src/types.ts","../src/logs-provider.ts","../src/with-logs-recorder.ts"],"sourcesContent":["interface QueueNode<T> {\n value: T\n next?: QueueNode<T>\n}\n\nexport default class Queue<T> {\n private first?: QueueNode<T>\n private last?: QueueNode<T>\n\n constructor(...vals: T[]) {\n if (vals.length === 0) return\n vals.forEach((val) => this.push(val))\n }\n\n push(value: T) {\n const nextLast: QueueNode<T> = { value }\n if (this.last === undefined) {\n this.last = nextLast\n this.first = this.last\n } else {\n this.last.next = nextLast\n this.last = nextLast\n }\n }\n\n pop() {\n const result = this.first?.value\n if (this.first) {\n this.first = this.first.next\n if (!this.first) {\n this.last = undefined\n }\n }\n return result\n }\n\n peek() {\n return this.first?.value\n }\n}\n","export type Out = \">>\"\nexport const OUT: Out = \">>\"\n\nexport type In = \"<<\"\nexport const IN: In = \"<<\"\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport Queue from \"./queue\"\nimport { In, OUT, Out } from \"./types\"\n\ninterface Log {\n clientId: number\n type: In | Out\n msg: string\n tick: number\n}\n\nconst rawLogsToLogs = (rawLogs: string[]): Map<number, Log[]> => {\n const result = new Map<number, Log[]>()\n let prevDate = \"\"\n let tick = -1\n\n for (let i = 0; i < rawLogs.length; i++) {\n const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(\n /^(\\d*)-(.{24})-(.{2})-(.*)$/,\n )!\n const clientId = Number(clientIdRaw)\n\n tick += dateRaw === prevDate ? 0 : 1\n prevDate = dateRaw\n\n const logs = result.get(clientId) ?? []\n result.set(clientId, logs)\n\n logs.push({\n clientId,\n tick,\n type: type as any,\n msg,\n })\n }\n\n return result\n}\n\nconst extractTx = (msg: string) => {\n const startTxt = 'TaggedTransactionQueue_validate_transaction\",\"'\n const start = msg.lastIndexOf(startTxt) + startTxt.length + 4\n const end = msg.indexOf(`\"`, start + 1)\n return msg.substring(start, end - 64)\n}\n\nexport const logsProvider = (rawLogs: Array<string>): JsonRpcProvider => {\n let nextClientId = 1\n const allLogs = rawLogsToLogs(\n rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1),\n )\n\n return (onMsg) => {\n const clientId = nextClientId++\n const logs = allLogs.get(clientId)!\n const pending = new Queue<string>()\n let idx = 0\n\n let transactions = new Map<string, string>()\n const checkForIncommingMessages = async () => {\n if (!pending.peek()) return\n\n while (idx < logs.length && token !== undefined) {\n const expected = logs[idx]\n transactions.forEach((value, key) => {\n expected.msg = expected.msg.replace(key, value)\n })\n if (expected.type === OUT) {\n if (!pending.peek()) {\n token = setTimeout(checkForIncommingMessages, 100)\n break\n }\n\n const received = pending.pop()\n\n if (\n expected.msg.includes(\n \"TaggedTransactionQueue_validate_transaction\",\n ) &&\n received?.includes(\"TaggedTransactionQueue_validate_transaction\")\n ) {\n transactions.set(extractTx(expected.msg), extractTx(received))\n transactions.forEach((value, key) => {\n expected.msg = expected.msg.replace(key, value)\n })\n }\n\n if (received !== expected.msg) {\n console.log(`recieved: \"${received}\"`)\n console.log(`expected: \"${expected.msg}\"`)\n throw new Error(\"unexpected messaged was received\")\n }\n } else {\n onMsg(expected.msg)\n await Promise.resolve()\n }\n idx++\n }\n }\n\n let token: undefined | number = setTimeout(checkForIncommingMessages, 200)\n\n return {\n send: (msg) => {\n pending.push(msg)\n },\n disconnect: () => {\n clearTimeout(token)\n token = undefined\n },\n }\n }\n}\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { IN, OUT } from \"./types\"\n\nexport const withLogsRecorder = (\n persistLog: (log: string) => void,\n input: JsonRpcProvider,\n): JsonRpcProvider => {\n let nextId = 1\n let token: any\n let tickDate = \"\"\n const setTickDate = () => {\n tickDate = new Date().toISOString()\n token = setTimeout(setTickDate, 0)\n }\n\n return (onMsg) => {\n const clientId = nextId++\n\n setTickDate()\n\n const result = input((msg) => {\n persistLog(`${clientId}-${tickDate}-${IN}-${msg}`)\n onMsg(msg)\n })\n\n return {\n ...result,\n send: (msg) => {\n persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`)\n result.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n result.disconnect()\n },\n }\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/logs-provider",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,43 +12,36 @@
12
12
  ".": {
13
13
  "node": {
14
14
  "production": {
15
- "import": "./dist/index.mjs",
15
+ "import": "./dist/esm/index.mjs",
16
16
  "require": "./dist/min/index.js",
17
17
  "default": "./dist/index.js"
18
18
  },
19
- "import": "./dist/index.mjs",
19
+ "import": "./dist/esm/index.mjs",
20
20
  "require": "./dist/index.js",
21
21
  "default": "./dist/index.js"
22
22
  },
23
- "module": "./dist/index.mjs",
24
- "import": "./dist/index.mjs",
23
+ "module": "./dist/esm/index.mjs",
24
+ "import": "./dist/esm/index.mjs",
25
25
  "require": "./dist/index.js",
26
26
  "default": "./dist/index.js"
27
27
  },
28
28
  "./package.json": "./package.json"
29
29
  },
30
30
  "main": "./dist/index.js",
31
- "module": "./dist/index.mjs",
32
- "browser": "./dist/index.mjs",
31
+ "module": "./dist/esm/index.mjs",
32
+ "browser": "./dist/esm/index.mjs",
33
33
  "types": "./dist/index.d.ts",
34
34
  "files": [
35
35
  "dist"
36
36
  ],
37
- "prettier": {
38
- "printWidth": 80,
39
- "semi": false,
40
- "trailingComma": "all"
41
- },
42
37
  "dependencies": {
43
- "@substrate/connect": "^0.8.4",
44
- "@polkadot-api/json-rpc-provider-proxy": "0.0.1",
45
- "@polkadot-api/json-rpc-provider": "0.0.1"
38
+ "@polkadot-api/json-rpc-provider": "0.0.2"
46
39
  },
47
40
  "devDependencies": {
48
- "@polkadot-api/json-rpc-provider": "0.0.1"
41
+ "@polkadot-api/json-rpc-provider": "0.0.2"
49
42
  },
50
43
  "scripts": {
51
- "build": "tsc --noEmit && tsup-node src/index.ts --clean --sourcemap --platform neutral --target=es2020 --format esm,cjs --dts && tsup-node src/index.ts --clean --sourcemap --platform neutral --target=es2020 --format cjs --dts --minify --out-dir dist/min",
44
+ "build": "tsc --noEmit && rollup -c ../../../rollup.config.js",
52
45
  "test": "echo 'no tests'",
53
46
  "lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
54
47
  "format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
package/dist/index.d.mts DELETED
@@ -1,7 +0,0 @@
1
- import { JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
2
-
3
- declare const logsProvider: (rawLogs: Array<string>) => JsonRpcProvider;
4
-
5
- declare const withLogsRecorder: (persistLog: (log: string) => void, input: JsonRpcProvider) => JsonRpcProvider;
6
-
7
- export { logsProvider, withLogsRecorder };
package/dist/index.mjs DELETED
@@ -1,149 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
-
8
- // src/queue.ts
9
- var Queue = class {
10
- constructor(...vals) {
11
- __publicField(this, "first");
12
- __publicField(this, "last");
13
- if (vals.length === 0)
14
- return;
15
- vals.forEach((val) => this.push(val));
16
- }
17
- push(value) {
18
- const nextLast = { value };
19
- if (this.last === void 0) {
20
- this.last = nextLast;
21
- this.first = this.last;
22
- } else {
23
- this.last.next = nextLast;
24
- this.last = nextLast;
25
- }
26
- }
27
- pop() {
28
- const result = this.first?.value;
29
- if (this.first) {
30
- this.first = this.first.next;
31
- if (!this.first) {
32
- this.last = void 0;
33
- }
34
- }
35
- return result;
36
- }
37
- peek() {
38
- return this.first?.value;
39
- }
40
- };
41
-
42
- // src/types.ts
43
- var OUT = ">>";
44
- var IN = "<<";
45
-
46
- // src/logs-provider.ts
47
- var rawLogsToLogs = (rawLogs) => {
48
- const result = /* @__PURE__ */ new Map();
49
- let prevDate = "";
50
- let tick = -1;
51
- for (let i = 0; i < rawLogs.length; i++) {
52
- const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(
53
- /^(\d*)-(.{24})-(.{2})-(.*)$/
54
- );
55
- const clientId = Number(clientIdRaw);
56
- tick += dateRaw === prevDate ? 0 : 1;
57
- prevDate = dateRaw;
58
- const logs = result.get(clientId) ?? [];
59
- result.set(clientId, logs);
60
- logs.push({
61
- clientId,
62
- tick,
63
- type,
64
- msg
65
- });
66
- }
67
- return result;
68
- };
69
- var logsProvider = (rawLogs) => {
70
- let nextClientId = 1;
71
- const allLogs = rawLogsToLogs(
72
- rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1)
73
- );
74
- return (onMsg) => {
75
- const clientId = nextClientId++;
76
- const logs = allLogs.get(clientId);
77
- const pending = new Queue();
78
- let idx = 0;
79
- const checkForIncommingMessages = async () => {
80
- if (!pending.peek)
81
- return;
82
- while (idx < logs.length && token !== void 0) {
83
- const expected = logs[idx];
84
- if (expected.type === OUT) {
85
- if (!pending.peek()) {
86
- token = setTimeout(checkForIncommingMessages, 100);
87
- break;
88
- }
89
- const received = pending.pop();
90
- if (received !== expected.msg) {
91
- console.log("recieved: ", received);
92
- console.log(received);
93
- console.log("expected: ", expected.msg);
94
- throw new Error("unexpected messaged was received");
95
- }
96
- } else {
97
- onMsg(expected.msg);
98
- await Promise.resolve();
99
- }
100
- idx++;
101
- }
102
- };
103
- let token = setTimeout(checkForIncommingMessages, 200);
104
- return {
105
- send: (msg) => {
106
- pending.push(msg);
107
- },
108
- disconnect: () => {
109
- clearTimeout(token);
110
- token = void 0;
111
- }
112
- };
113
- };
114
- };
115
-
116
- // src/with-logs-recorder.ts
117
- var withLogsRecorder = (persistLog, input) => {
118
- let nextId = 1;
119
- let token;
120
- let tickDate = "";
121
- const setTickDate = () => {
122
- tickDate = (/* @__PURE__ */ new Date()).toISOString();
123
- token = setTimeout(setTickDate, 0);
124
- };
125
- return (onMsg) => {
126
- const clientId = nextId++;
127
- setTickDate();
128
- const result = input((msg) => {
129
- persistLog(`${clientId}-${tickDate}-${IN}-${msg}`);
130
- onMsg(msg);
131
- });
132
- return {
133
- ...result,
134
- send: (msg) => {
135
- persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`);
136
- result.send(msg);
137
- },
138
- disconnect() {
139
- clearTimeout(token);
140
- result.disconnect();
141
- }
142
- };
143
- };
144
- };
145
- export {
146
- logsProvider,
147
- withLogsRecorder
148
- };
149
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/queue.ts","../src/types.ts","../src/logs-provider.ts","../src/with-logs-recorder.ts"],"sourcesContent":["interface QueueNode<T> {\n value: T\n next?: QueueNode<T>\n}\n\nexport default class Queue<T> {\n private first?: QueueNode<T>\n private last?: QueueNode<T>\n\n constructor(...vals: T[]) {\n if (vals.length === 0) return\n vals.forEach((val) => this.push(val))\n }\n\n push(value: T) {\n const nextLast: QueueNode<T> = { value }\n if (this.last === undefined) {\n this.last = nextLast\n this.first = this.last\n } else {\n this.last.next = nextLast\n this.last = nextLast\n }\n }\n\n pop() {\n const result = this.first?.value\n if (this.first) {\n this.first = this.first.next\n if (!this.first) {\n this.last = undefined\n }\n }\n return result\n }\n\n peek() {\n return this.first?.value\n }\n}\n","export type Out = \">>\"\nexport const OUT: Out = \">>\"\n\nexport type In = \"<<\"\nexport const IN: In = \"<<\"\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport Queue from \"./queue\"\nimport { In, OUT, Out } from \"./types\"\n\ninterface Log {\n clientId: number\n type: In | Out\n msg: string\n tick: number\n}\n\nconst rawLogsToLogs = (rawLogs: string[]): Map<number, Log[]> => {\n const result = new Map<number, Log[]>()\n let prevDate = \"\"\n let tick = -1\n\n for (let i = 0; i < rawLogs.length; i++) {\n const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(\n /^(\\d*)-(.{24})-(.{2})-(.*)$/,\n )!\n const clientId = Number(clientIdRaw)\n\n tick += dateRaw === prevDate ? 0 : 1\n prevDate = dateRaw\n\n const logs = result.get(clientId) ?? []\n result.set(clientId, logs)\n\n logs.push({\n clientId,\n tick,\n type: type as any,\n msg,\n })\n }\n\n return result\n}\n\nexport const logsProvider = (rawLogs: Array<string>): JsonRpcProvider => {\n let nextClientId = 1\n const allLogs = rawLogsToLogs(\n rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1),\n )\n\n return (onMsg) => {\n const clientId = nextClientId++\n const logs = allLogs.get(clientId)!\n const pending = new Queue<string>()\n let idx = 0\n\n const checkForIncommingMessages = async () => {\n if (!pending.peek) return\n\n while (idx < logs.length && token !== undefined) {\n const expected = logs[idx]\n if (expected.type === OUT) {\n if (!pending.peek()) {\n token = setTimeout(checkForIncommingMessages, 100)\n break\n }\n const received = pending.pop()\n if (received !== expected.msg) {\n console.log(\"recieved: \", received)\n console.log(received)\n console.log(\"expected: \", expected.msg)\n throw new Error(\"unexpected messaged was received\")\n }\n } else {\n onMsg(expected.msg)\n await Promise.resolve()\n }\n idx++\n }\n }\n\n let token: undefined | number = setTimeout(checkForIncommingMessages, 200)\n\n return {\n send: (msg) => {\n pending.push(msg)\n },\n disconnect: () => {\n clearTimeout(token)\n token = undefined\n },\n }\n }\n}\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { IN, OUT } from \"./types\"\n\nexport const withLogsRecorder = (\n persistLog: (log: string) => void,\n input: JsonRpcProvider,\n): JsonRpcProvider => {\n let nextId = 1\n let token: any\n let tickDate = \"\"\n const setTickDate = () => {\n tickDate = new Date().toISOString()\n token = setTimeout(setTickDate, 0)\n }\n\n return (onMsg) => {\n const clientId = nextId++\n\n setTickDate()\n\n const result = input((msg) => {\n persistLog(`${clientId}-${tickDate}-${IN}-${msg}`)\n onMsg(msg)\n })\n\n return {\n ...result,\n send: (msg) => {\n persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`)\n result.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n result.disconnect()\n },\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +0,0 @@
1
- import { JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
2
-
3
- declare const logsProvider: (rawLogs: Array<string>) => JsonRpcProvider;
4
-
5
- declare const withLogsRecorder: (persistLog: (log: string) => void, input: JsonRpcProvider) => JsonRpcProvider;
6
-
7
- export { logsProvider, withLogsRecorder };
package/dist/min/index.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var a=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var I=(t,e,n)=>e in t?a(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var k=(t,e)=>{for(var n in e)a(t,n,{get:e[n],enumerable:!0})},y=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of T(e))!v.call(t,s)&&s!==n&&a(t,s,{get:()=>e[s],enumerable:!(r=x(e,s))||r.enumerable});return t};var $=t=>y(a({},"__esModule",{value:!0}),t);var g=(t,e,n)=>(I(t,typeof e!="symbol"?e+"":e,n),n);var R={};k(R,{logsProvider:()=>N,withLogsRecorder:()=>O});module.exports=$(R);var p=class{constructor(...e){g(this,"first");g(this,"last");e.length!==0&&e.forEach(n=>this.push(n))}push(e){let n={value:e};this.last===void 0?(this.last=n,this.first=this.last):(this.last.next=n,this.last=n)}pop(){let e=this.first?.value;return this.first&&(this.first=this.first.next,this.first||(this.last=void 0)),e}peek(){return this.first?.value}};var f=">>",h="<<";var w=t=>{let e=new Map,n="",r=-1;for(let s=0;s<t.length;s++){let[,d,i,l,u]=t[s].match(/^(\d*)-(.{24})-(.{2})-(.*)$/),o=Number(d);r+=i===n?0:1,n=i;let c=e.get(o)??[];e.set(o,c),c.push({clientId:o,tick:r,type:l,msg:u})}return e},N=t=>{let e=1,n=w(t[t.length-1]?t:t.slice(0,-1));return r=>{let s=e++,d=n.get(s),i=new p,l=0,u=async()=>{if(i.peek)for(;l<d.length&&o!==void 0;){let c=d[l];if(c.type===f){if(!i.peek()){o=setTimeout(u,100);break}let m=i.pop();if(m!==c.msg)throw console.log("recieved: ",m),console.log(m),console.log("expected: ",c.msg),new Error("unexpected messaged was received")}else r(c.msg),await Promise.resolve();l++}},o=setTimeout(u,200);return{send:c=>{i.push(c)},disconnect:()=>{clearTimeout(o),o=void 0}}}};var O=(t,e)=>{let n=1,r,s="",d=()=>{s=new Date().toISOString(),r=setTimeout(d,0)};return i=>{let l=n++;d();let u=e(o=>{t(`${l}-${s}-${h}-${o}`),i(o)});return{...u,send:o=>{t(`${l}-${s}-${f}-${o}`),u.send(o)},disconnect(){clearTimeout(r),u.disconnect()}}}};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/queue.ts","../../src/types.ts","../../src/logs-provider.ts","../../src/with-logs-recorder.ts"],"sourcesContent":["export * from \"./logs-provider\"\nexport * from \"./with-logs-recorder\"\n","interface QueueNode<T> {\n value: T\n next?: QueueNode<T>\n}\n\nexport default class Queue<T> {\n private first?: QueueNode<T>\n private last?: QueueNode<T>\n\n constructor(...vals: T[]) {\n if (vals.length === 0) return\n vals.forEach((val) => this.push(val))\n }\n\n push(value: T) {\n const nextLast: QueueNode<T> = { value }\n if (this.last === undefined) {\n this.last = nextLast\n this.first = this.last\n } else {\n this.last.next = nextLast\n this.last = nextLast\n }\n }\n\n pop() {\n const result = this.first?.value\n if (this.first) {\n this.first = this.first.next\n if (!this.first) {\n this.last = undefined\n }\n }\n return result\n }\n\n peek() {\n return this.first?.value\n }\n}\n","export type Out = \">>\"\nexport const OUT: Out = \">>\"\n\nexport type In = \"<<\"\nexport const IN: In = \"<<\"\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport Queue from \"./queue\"\nimport { In, OUT, Out } from \"./types\"\n\ninterface Log {\n clientId: number\n type: In | Out\n msg: string\n tick: number\n}\n\nconst rawLogsToLogs = (rawLogs: string[]): Map<number, Log[]> => {\n const result = new Map<number, Log[]>()\n let prevDate = \"\"\n let tick = -1\n\n for (let i = 0; i < rawLogs.length; i++) {\n const [, clientIdRaw, dateRaw, type, msg] = rawLogs[i].match(\n /^(\\d*)-(.{24})-(.{2})-(.*)$/,\n )!\n const clientId = Number(clientIdRaw)\n\n tick += dateRaw === prevDate ? 0 : 1\n prevDate = dateRaw\n\n const logs = result.get(clientId) ?? []\n result.set(clientId, logs)\n\n logs.push({\n clientId,\n tick,\n type: type as any,\n msg,\n })\n }\n\n return result\n}\n\nexport const logsProvider = (rawLogs: Array<string>): JsonRpcProvider => {\n let nextClientId = 1\n const allLogs = rawLogsToLogs(\n rawLogs[rawLogs.length - 1] ? rawLogs : rawLogs.slice(0, -1),\n )\n\n return (onMsg) => {\n const clientId = nextClientId++\n const logs = allLogs.get(clientId)!\n const pending = new Queue<string>()\n let idx = 0\n\n const checkForIncommingMessages = async () => {\n if (!pending.peek) return\n\n while (idx < logs.length && token !== undefined) {\n const expected = logs[idx]\n if (expected.type === OUT) {\n if (!pending.peek()) {\n token = setTimeout(checkForIncommingMessages, 100)\n break\n }\n const received = pending.pop()\n if (received !== expected.msg) {\n console.log(\"recieved: \", received)\n console.log(received)\n console.log(\"expected: \", expected.msg)\n throw new Error(\"unexpected messaged was received\")\n }\n } else {\n onMsg(expected.msg)\n await Promise.resolve()\n }\n idx++\n }\n }\n\n let token: undefined | number = setTimeout(checkForIncommingMessages, 200)\n\n return {\n send: (msg) => {\n pending.push(msg)\n },\n disconnect: () => {\n clearTimeout(token)\n token = undefined\n },\n }\n }\n}\n","import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { IN, OUT } from \"./types\"\n\nexport const withLogsRecorder = (\n persistLog: (log: string) => void,\n input: JsonRpcProvider,\n): JsonRpcProvider => {\n let nextId = 1\n let token: any\n let tickDate = \"\"\n const setTickDate = () => {\n tickDate = new Date().toISOString()\n token = setTimeout(setTickDate, 0)\n }\n\n return (onMsg) => {\n const clientId = nextId++\n\n setTickDate()\n\n const result = input((msg) => {\n persistLog(`${clientId}-${tickDate}-${IN}-${msg}`)\n onMsg(msg)\n })\n\n return {\n ...result,\n send: (msg) => {\n persistLog(`${clientId}-${tickDate}-${OUT}-${msg}`)\n result.send(msg)\n },\n disconnect() {\n clearTimeout(token)\n result.disconnect()\n },\n }\n }\n}\n"],"mappings":"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","names":["src_exports","__export","logsProvider","withLogsRecorder","__toCommonJS","Queue","vals","__publicField","val","value","nextLast","result","OUT","IN","rawLogsToLogs","rawLogs","result","prevDate","tick","i","clientIdRaw","dateRaw","type","msg","clientId","logs","logsProvider","nextClientId","allLogs","onMsg","pending","Queue","idx","checkForIncommingMessages","token","expected","OUT","received","withLogsRecorder","persistLog","input","nextId","token","tickDate","setTickDate","onMsg","clientId","result","msg","IN","OUT"]}