@polkadot-api/raw-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @polkadot-api/raw-client
2
+
3
+ Very low-level stuff, use it at your own risk...
@@ -0,0 +1,9 @@
1
+ class DestroyedError extends Error {
2
+ constructor() {
3
+ super("Client destroyed");
4
+ this.name = "DestroyedError";
5
+ }
6
+ }
7
+
8
+ export { DestroyedError };
9
+ //# sourceMappingURL=DestroyedError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DestroyedError.mjs","sources":["../../src/DestroyedError.ts"],"sourcesContent":["export class DestroyedError extends Error {\n constructor() {\n super(\"Client destroyed\")\n this.name = \"DestroyedError\"\n }\n}\n"],"names":[],"mappings":"AAAO,MAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,kBAAkB,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;;;;"}
@@ -0,0 +1,16 @@
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 RpcError extends Error {
5
+ constructor(e) {
6
+ super(e.message);
7
+ __publicField(this, "code");
8
+ __publicField(this, "data");
9
+ this.code = e.code;
10
+ this.data = e.data;
11
+ this.name = "RpcError";
12
+ }
13
+ }
14
+
15
+ export { RpcError };
16
+ //# sourceMappingURL=RpcError.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RpcError.mjs","sources":["../../src/RpcError.ts"],"sourcesContent":["export interface IRpcError {\n code: number\n message: string\n data?: any\n}\n\nexport class RpcError extends Error implements IRpcError {\n code\n data\n constructor(e: IRpcError) {\n super(e.message)\n this.code = e.code\n this.data = e.data\n this.name = \"RpcError\"\n }\n}\n"],"names":[],"mappings":";;;AAMO,MAAM,iBAAiB,KAAA,CAA2B;AAAA,EAGvD,YAAY,CAAA,EAAc;AACxB,IAAA,KAAA,CAAM,EAAE,OAAO,CAAA;AAHjB,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAGE,IAAA,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AACd,IAAA,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AACF;;;;"}
@@ -0,0 +1,78 @@
1
+ import { RpcError } from './RpcError.mjs';
2
+ import { getSubscriptionsManager } from './subscriptions-manager.mjs';
3
+ import { DestroyedError } from './DestroyedError.mjs';
4
+
5
+ let nextClientId = 1;
6
+ const createClient = (gProvider) => {
7
+ let clientId = nextClientId++;
8
+ const responses = /* @__PURE__ */ new Map();
9
+ const subscriptions = getSubscriptionsManager();
10
+ let connection = null;
11
+ const send = (id, method, params) => {
12
+ connection.send(
13
+ JSON.stringify({
14
+ jsonrpc: "2.0",
15
+ id,
16
+ method,
17
+ params
18
+ })
19
+ );
20
+ };
21
+ function onMessage(message) {
22
+ try {
23
+ let id, result, error, params, subscription;
24
+ const parsed = JSON.parse(message);
25
+ ({ id, result, error, params } = parsed);
26
+ if (id === null) throw new Error(params?.error?.message ?? "id null");
27
+ if (id != null) {
28
+ const cb = responses.get(id);
29
+ if (!cb) return;
30
+ responses.delete(id);
31
+ return error ? cb.onError(new RpcError(error)) : cb.onSuccess(result, (opaqueId, subscriber) => {
32
+ const subscriptionId2 = opaqueId;
33
+ subscriptions.subscribe(subscriptionId2, subscriber);
34
+ return () => {
35
+ subscriptions.unsubscribe(subscriptionId2);
36
+ };
37
+ });
38
+ }
39
+ ;
40
+ ({ subscription, result, error } = params);
41
+ if (!subscription || !error && !Object.hasOwn(params, "result")) throw 0;
42
+ const subscriptionId = subscription;
43
+ if (error) {
44
+ subscriptions.error(subscriptionId, new RpcError(error));
45
+ } else {
46
+ subscriptions.next(subscriptionId, result);
47
+ }
48
+ } catch (e) {
49
+ console.warn("Error parsing incomming message: " + message);
50
+ console.error(e);
51
+ }
52
+ }
53
+ connection = gProvider(onMessage);
54
+ const disconnect = () => {
55
+ connection?.disconnect();
56
+ connection = null;
57
+ subscriptions.errorAll(new DestroyedError());
58
+ responses.forEach((r) => r.onError(new DestroyedError()));
59
+ responses.clear();
60
+ };
61
+ let nextId = 1;
62
+ const request = (method, params, cb) => {
63
+ if (!connection) throw new Error("Not connected");
64
+ const id = `${clientId}-${nextId++}`;
65
+ if (cb) responses.set(id, cb);
66
+ send(id, method, params);
67
+ return () => {
68
+ responses.delete(id);
69
+ };
70
+ };
71
+ return {
72
+ request,
73
+ disconnect
74
+ };
75
+ };
76
+
77
+ export { createClient };
78
+ //# sourceMappingURL=createClient.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createClient.mjs","sources":["../../src/createClient.ts"],"sourcesContent":["import type {\n JsonRpcConnection,\n JsonRpcProvider,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { RpcError, IRpcError } from \"./RpcError\"\nimport { getSubscriptionsManager, Subscriber } from \"./subscriptions-manager\"\nimport { DestroyedError } from \"./DestroyedError\"\n\ntype UnsubscribeFn = () => void\nexport type FollowSubscriptionCb<T> = (\n subscriptionId: string,\n cb: Subscriber<T>,\n) => UnsubscribeFn\n\nexport type ClientRequestCb<T, TT> = {\n onSuccess: (result: T, followSubscription: FollowSubscriptionCb<TT>) => void\n onError: (e: Error) => void\n}\n\nexport type ClientRequest<T, TT> = (\n method: string,\n params: Array<any>,\n cb?: ClientRequestCb<T, TT>,\n) => UnsubscribeFn\n\nexport interface Client {\n disconnect: () => void\n request: ClientRequest<any, any>\n}\n\nlet nextClientId = 1\nexport const createClient = (gProvider: JsonRpcProvider): Client => {\n let clientId = nextClientId++\n const responses = new Map<string, ClientRequestCb<any, any>>()\n const subscriptions = getSubscriptionsManager()\n\n let connection: JsonRpcConnection | null = null\n\n const send = (\n id: string,\n method: string,\n params: Array<boolean | string | number | null>,\n ) => {\n connection!.send(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n }),\n )\n }\n\n function onMessage(message: string): void {\n try {\n let id: string,\n result,\n error: IRpcError | undefined,\n params: { subscription: any; result: any; error?: IRpcError },\n subscription: string\n\n const parsed = JSON.parse(message)\n ;({ id, result, error, params } = parsed)\n\n if (id === null) throw new Error(params?.error?.message ?? \"id null\")\n\n if (id != null) {\n const cb = responses.get(id)\n if (!cb) return\n\n responses.delete(id)\n\n return error\n ? cb.onError(new RpcError(error))\n : cb.onSuccess(result, (opaqueId, subscriber) => {\n const subscriptionId = opaqueId\n subscriptions.subscribe(subscriptionId, subscriber)\n return () => {\n subscriptions.unsubscribe(subscriptionId)\n }\n })\n }\n\n // at this point, it means that it should be a notification\n ;({ subscription, result, error } = params)\n if (!subscription || (!error && !Object.hasOwn(params, \"result\"))) throw 0\n\n const subscriptionId = subscription\n\n if (error) {\n subscriptions.error(subscriptionId, new RpcError(error!))\n } else {\n subscriptions.next(subscriptionId, result)\n }\n } catch (e) {\n console.warn(\"Error parsing incomming message: \" + message)\n console.error(e)\n }\n }\n connection = gProvider(onMessage)\n\n const disconnect = () => {\n connection?.disconnect()\n connection = null\n subscriptions.errorAll(new DestroyedError())\n responses.forEach((r) => r.onError(new DestroyedError()))\n responses.clear()\n }\n\n let nextId = 1\n const request = <T, TT>(\n method: string,\n params: Array<any>,\n cb?: ClientRequestCb<T, TT>,\n ): UnsubscribeFn => {\n if (!connection) throw new Error(\"Not connected\")\n const id = `${clientId}-${nextId++}`\n\n if (cb) responses.set(id, cb)\n send(id, method, params)\n\n return (): void => {\n responses.delete(id)\n }\n }\n\n return {\n request,\n disconnect,\n }\n}\n"],"names":["subscriptionId"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { RpcError } from './RpcError.mjs';
2
+ export { createClient } from './createClient.mjs';
3
+ export { DestroyedError } from './DestroyedError.mjs';
4
+ export { getSubscriptionsManager } from './subscriptions-manager.mjs';
5
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,32 @@
1
+ const getSubscriptionsManager = () => {
2
+ const subscriptions = /* @__PURE__ */ new Map();
3
+ return {
4
+ has: subscriptions.has.bind(subscriptions),
5
+ subscribe(id, subscriber) {
6
+ subscriptions.set(id, subscriber);
7
+ },
8
+ unsubscribe(id) {
9
+ subscriptions.delete(id);
10
+ },
11
+ next(id, data) {
12
+ subscriptions.get(id)?.next(data);
13
+ },
14
+ error(id, e) {
15
+ const subscriber = subscriptions.get(id);
16
+ if (subscriber) {
17
+ subscriptions.delete(id);
18
+ subscriber.error(e);
19
+ }
20
+ },
21
+ errorAll(e) {
22
+ const subscribers = [...subscriptions.values()];
23
+ subscriptions.clear();
24
+ subscribers.forEach((s) => {
25
+ s.error(e);
26
+ });
27
+ }
28
+ };
29
+ };
30
+
31
+ export { getSubscriptionsManager };
32
+ //# sourceMappingURL=subscriptions-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions-manager.mjs","sources":["../../src/subscriptions-manager.ts"],"sourcesContent":["export interface Subscriber<T> {\n next: (data: T) => void\n error: (e: Error) => void\n}\n\nexport const getSubscriptionsManager = <T>() => {\n const subscriptions = new Map<string, Subscriber<T>>()\n\n return {\n has: subscriptions.has.bind(subscriptions),\n subscribe(id: string, subscriber: Subscriber<T>) {\n subscriptions.set(id, subscriber)\n },\n unsubscribe(id: string) {\n subscriptions.delete(id)\n },\n next(id: string, data: T) {\n subscriptions.get(id)?.next(data)\n },\n error(id: string, e: Error) {\n const subscriber = subscriptions.get(id)\n if (subscriber) {\n subscriptions.delete(id)\n subscriber.error(e)\n }\n },\n errorAll(e: Error) {\n const subscribers = [...subscriptions.values()]\n subscriptions.clear()\n subscribers.forEach((s) => {\n s.error(e)\n })\n },\n }\n}\n\nexport type SubscriptionManager<T> = ReturnType<\n typeof getSubscriptionsManager<T>\n>\n"],"names":[],"mappings":"AAKO,MAAM,0BAA0B,MAAS;AAC9C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA2B;AAErD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAAA,IACzC,SAAA,CAAU,IAAY,UAAA,EAA2B;AAC/C,MAAA,aAAA,CAAc,GAAA,CAAI,IAAI,UAAU,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,YAAY,EAAA,EAAY;AACtB,MAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,IAAA,CAAK,IAAY,IAAA,EAAS;AACxB,MAAA,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,KAAA,CAAM,IAAY,CAAA,EAAU;AAC1B,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AACvC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AACvB,QAAA,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,SAAS,CAAA,EAAU;AACjB,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AACzB,QAAA,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,MACX,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,46 @@
1
+ import { JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
2
+
3
+ interface IRpcError {
4
+ code: number;
5
+ message: string;
6
+ data?: any;
7
+ }
8
+ declare class RpcError extends Error implements IRpcError {
9
+ code: number;
10
+ data: any;
11
+ constructor(e: IRpcError);
12
+ }
13
+
14
+ interface Subscriber<T> {
15
+ next: (data: T) => void;
16
+ error: (e: Error) => void;
17
+ }
18
+ declare const getSubscriptionsManager: <T>() => {
19
+ has: (key: string) => boolean;
20
+ subscribe(id: string, subscriber: Subscriber<T>): void;
21
+ unsubscribe(id: string): void;
22
+ next(id: string, data: T): void;
23
+ error(id: string, e: Error): void;
24
+ errorAll(e: Error): void;
25
+ };
26
+ type SubscriptionManager<T> = ReturnType<typeof getSubscriptionsManager<T>>;
27
+
28
+ type UnsubscribeFn = () => void;
29
+ type FollowSubscriptionCb<T> = (subscriptionId: string, cb: Subscriber<T>) => UnsubscribeFn;
30
+ type ClientRequestCb<T, TT> = {
31
+ onSuccess: (result: T, followSubscription: FollowSubscriptionCb<TT>) => void;
32
+ onError: (e: Error) => void;
33
+ };
34
+ type ClientRequest<T, TT> = (method: string, params: Array<any>, cb?: ClientRequestCb<T, TT>) => UnsubscribeFn;
35
+ interface Client {
36
+ disconnect: () => void;
37
+ request: ClientRequest<any, any>;
38
+ }
39
+ declare const createClient: (gProvider: JsonRpcProvider) => Client;
40
+
41
+ declare class DestroyedError extends Error {
42
+ constructor();
43
+ }
44
+
45
+ export { DestroyedError, RpcError, createClient, getSubscriptionsManager };
46
+ export type { Client, ClientRequest, ClientRequestCb, FollowSubscriptionCb, IRpcError, Subscriber, SubscriptionManager };
package/dist/index.js ADDED
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ class RpcError extends Error {
7
+ constructor(e) {
8
+ super(e.message);
9
+ __publicField(this, "code");
10
+ __publicField(this, "data");
11
+ this.code = e.code;
12
+ this.data = e.data;
13
+ this.name = "RpcError";
14
+ }
15
+ }
16
+
17
+ const getSubscriptionsManager = () => {
18
+ const subscriptions = /* @__PURE__ */ new Map();
19
+ return {
20
+ has: subscriptions.has.bind(subscriptions),
21
+ subscribe(id, subscriber) {
22
+ subscriptions.set(id, subscriber);
23
+ },
24
+ unsubscribe(id) {
25
+ subscriptions.delete(id);
26
+ },
27
+ next(id, data) {
28
+ subscriptions.get(id)?.next(data);
29
+ },
30
+ error(id, e) {
31
+ const subscriber = subscriptions.get(id);
32
+ if (subscriber) {
33
+ subscriptions.delete(id);
34
+ subscriber.error(e);
35
+ }
36
+ },
37
+ errorAll(e) {
38
+ const subscribers = [...subscriptions.values()];
39
+ subscriptions.clear();
40
+ subscribers.forEach((s) => {
41
+ s.error(e);
42
+ });
43
+ }
44
+ };
45
+ };
46
+
47
+ class DestroyedError extends Error {
48
+ constructor() {
49
+ super("Client destroyed");
50
+ this.name = "DestroyedError";
51
+ }
52
+ }
53
+
54
+ let nextClientId = 1;
55
+ const createClient = (gProvider) => {
56
+ let clientId = nextClientId++;
57
+ const responses = /* @__PURE__ */ new Map();
58
+ const subscriptions = getSubscriptionsManager();
59
+ let connection = null;
60
+ const send = (id, method, params) => {
61
+ connection.send(
62
+ JSON.stringify({
63
+ jsonrpc: "2.0",
64
+ id,
65
+ method,
66
+ params
67
+ })
68
+ );
69
+ };
70
+ function onMessage(message) {
71
+ try {
72
+ let id, result, error, params, subscription;
73
+ const parsed = JSON.parse(message);
74
+ ({ id, result, error, params } = parsed);
75
+ if (id === null) throw new Error(params?.error?.message ?? "id null");
76
+ if (id != null) {
77
+ const cb = responses.get(id);
78
+ if (!cb) return;
79
+ responses.delete(id);
80
+ return error ? cb.onError(new RpcError(error)) : cb.onSuccess(result, (opaqueId, subscriber) => {
81
+ const subscriptionId2 = opaqueId;
82
+ subscriptions.subscribe(subscriptionId2, subscriber);
83
+ return () => {
84
+ subscriptions.unsubscribe(subscriptionId2);
85
+ };
86
+ });
87
+ }
88
+ ;
89
+ ({ subscription, result, error } = params);
90
+ if (!subscription || !error && !Object.hasOwn(params, "result")) throw 0;
91
+ const subscriptionId = subscription;
92
+ if (error) {
93
+ subscriptions.error(subscriptionId, new RpcError(error));
94
+ } else {
95
+ subscriptions.next(subscriptionId, result);
96
+ }
97
+ } catch (e) {
98
+ console.warn("Error parsing incomming message: " + message);
99
+ console.error(e);
100
+ }
101
+ }
102
+ connection = gProvider(onMessage);
103
+ const disconnect = () => {
104
+ connection?.disconnect();
105
+ connection = null;
106
+ subscriptions.errorAll(new DestroyedError());
107
+ responses.forEach((r) => r.onError(new DestroyedError()));
108
+ responses.clear();
109
+ };
110
+ let nextId = 1;
111
+ const request = (method, params, cb) => {
112
+ if (!connection) throw new Error("Not connected");
113
+ const id = `${clientId}-${nextId++}`;
114
+ if (cb) responses.set(id, cb);
115
+ send(id, method, params);
116
+ return () => {
117
+ responses.delete(id);
118
+ };
119
+ };
120
+ return {
121
+ request,
122
+ disconnect
123
+ };
124
+ };
125
+
126
+ exports.DestroyedError = DestroyedError;
127
+ exports.RpcError = RpcError;
128
+ exports.createClient = createClient;
129
+ exports.getSubscriptionsManager = getSubscriptionsManager;
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/RpcError.ts","../src/subscriptions-manager.ts","../src/DestroyedError.ts","../src/createClient.ts"],"sourcesContent":["export interface IRpcError {\n code: number\n message: string\n data?: any\n}\n\nexport class RpcError extends Error implements IRpcError {\n code\n data\n constructor(e: IRpcError) {\n super(e.message)\n this.code = e.code\n this.data = e.data\n this.name = \"RpcError\"\n }\n}\n","export interface Subscriber<T> {\n next: (data: T) => void\n error: (e: Error) => void\n}\n\nexport const getSubscriptionsManager = <T>() => {\n const subscriptions = new Map<string, Subscriber<T>>()\n\n return {\n has: subscriptions.has.bind(subscriptions),\n subscribe(id: string, subscriber: Subscriber<T>) {\n subscriptions.set(id, subscriber)\n },\n unsubscribe(id: string) {\n subscriptions.delete(id)\n },\n next(id: string, data: T) {\n subscriptions.get(id)?.next(data)\n },\n error(id: string, e: Error) {\n const subscriber = subscriptions.get(id)\n if (subscriber) {\n subscriptions.delete(id)\n subscriber.error(e)\n }\n },\n errorAll(e: Error) {\n const subscribers = [...subscriptions.values()]\n subscriptions.clear()\n subscribers.forEach((s) => {\n s.error(e)\n })\n },\n }\n}\n\nexport type SubscriptionManager<T> = ReturnType<\n typeof getSubscriptionsManager<T>\n>\n","export class DestroyedError extends Error {\n constructor() {\n super(\"Client destroyed\")\n this.name = \"DestroyedError\"\n }\n}\n","import type {\n JsonRpcConnection,\n JsonRpcProvider,\n} from \"@polkadot-api/json-rpc-provider\"\nimport { RpcError, IRpcError } from \"./RpcError\"\nimport { getSubscriptionsManager, Subscriber } from \"./subscriptions-manager\"\nimport { DestroyedError } from \"./DestroyedError\"\n\ntype UnsubscribeFn = () => void\nexport type FollowSubscriptionCb<T> = (\n subscriptionId: string,\n cb: Subscriber<T>,\n) => UnsubscribeFn\n\nexport type ClientRequestCb<T, TT> = {\n onSuccess: (result: T, followSubscription: FollowSubscriptionCb<TT>) => void\n onError: (e: Error) => void\n}\n\nexport type ClientRequest<T, TT> = (\n method: string,\n params: Array<any>,\n cb?: ClientRequestCb<T, TT>,\n) => UnsubscribeFn\n\nexport interface Client {\n disconnect: () => void\n request: ClientRequest<any, any>\n}\n\nlet nextClientId = 1\nexport const createClient = (gProvider: JsonRpcProvider): Client => {\n let clientId = nextClientId++\n const responses = new Map<string, ClientRequestCb<any, any>>()\n const subscriptions = getSubscriptionsManager()\n\n let connection: JsonRpcConnection | null = null\n\n const send = (\n id: string,\n method: string,\n params: Array<boolean | string | number | null>,\n ) => {\n connection!.send(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n method,\n params,\n }),\n )\n }\n\n function onMessage(message: string): void {\n try {\n let id: string,\n result,\n error: IRpcError | undefined,\n params: { subscription: any; result: any; error?: IRpcError },\n subscription: string\n\n const parsed = JSON.parse(message)\n ;({ id, result, error, params } = parsed)\n\n if (id === null) throw new Error(params?.error?.message ?? \"id null\")\n\n if (id != null) {\n const cb = responses.get(id)\n if (!cb) return\n\n responses.delete(id)\n\n return error\n ? cb.onError(new RpcError(error))\n : cb.onSuccess(result, (opaqueId, subscriber) => {\n const subscriptionId = opaqueId\n subscriptions.subscribe(subscriptionId, subscriber)\n return () => {\n subscriptions.unsubscribe(subscriptionId)\n }\n })\n }\n\n // at this point, it means that it should be a notification\n ;({ subscription, result, error } = params)\n if (!subscription || (!error && !Object.hasOwn(params, \"result\"))) throw 0\n\n const subscriptionId = subscription\n\n if (error) {\n subscriptions.error(subscriptionId, new RpcError(error!))\n } else {\n subscriptions.next(subscriptionId, result)\n }\n } catch (e) {\n console.warn(\"Error parsing incomming message: \" + message)\n console.error(e)\n }\n }\n connection = gProvider(onMessage)\n\n const disconnect = () => {\n connection?.disconnect()\n connection = null\n subscriptions.errorAll(new DestroyedError())\n responses.forEach((r) => r.onError(new DestroyedError()))\n responses.clear()\n }\n\n let nextId = 1\n const request = <T, TT>(\n method: string,\n params: Array<any>,\n cb?: ClientRequestCb<T, TT>,\n ): UnsubscribeFn => {\n if (!connection) throw new Error(\"Not connected\")\n const id = `${clientId}-${nextId++}`\n\n if (cb) responses.set(id, cb)\n send(id, method, params)\n\n return (): void => {\n responses.delete(id)\n }\n }\n\n return {\n request,\n disconnect,\n }\n}\n"],"names":["subscriptionId"],"mappings":";;;;;AAMO,MAAM,iBAAiB,KAAA,CAA2B;AAAA,EAGvD,YAAY,CAAA,EAAc;AACxB,IAAA,KAAA,CAAM,EAAE,OAAO,CAAA;AAHjB,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAGE,IAAA,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AACd,IAAA,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AACF;;ACVO,MAAM,0BAA0B,MAAS;AAC9C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA2B;AAErD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,aAAa,CAAA;AAAA,IACzC,SAAA,CAAU,IAAY,UAAA,EAA2B;AAC/C,MAAA,aAAA,CAAc,GAAA,CAAI,IAAI,UAAU,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,YAAY,EAAA,EAAY;AACtB,MAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,IAAA,CAAK,IAAY,IAAA,EAAS;AACxB,MAAA,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,KAAA,CAAM,IAAY,CAAA,EAAU;AAC1B,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AACvC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AACvB,QAAA,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,SAAS,CAAA,EAAU;AACjB,MAAA,MAAM,WAAA,GAAc,CAAC,GAAG,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AACzB,QAAA,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,MACX,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;;AClCO,MAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,kBAAkB,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;;ACyBA,IAAI,YAAA,GAAe,CAAA;AACZ,MAAM,YAAA,GAAe,CAAC,SAAA,KAAuC;AAClE,EAAA,IAAI,QAAA,GAAW,YAAA,EAAA;AACf,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuC;AAC7D,EAAA,MAAM,gBAAgB,uBAAA,EAAwB;AAE9C,EAAA,IAAI,UAAA,GAAuC,IAAA;AAE3C,EAAA,MAAM,IAAA,GAAO,CACX,EAAA,EACA,MAAA,EACA,MAAA,KACG;AACH,IAAA,UAAA,CAAY,IAAA;AAAA,MACV,KAAK,SAAA,CAAU;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,EAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD;AAAA,KACH;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,UAAU,OAAA,EAAuB;AACxC,IAAA,IAAI;AACF,MAAA,IAAI,EAAA,EACF,MAAA,EACA,KAAA,EACA,MAAA,EACA,YAAA;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,MAAA,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,QAAO,GAAI,MAAA;AAElC,MAAA,IAAI,EAAA,KAAO,MAAM,MAAM,IAAI,MAAM,MAAA,EAAQ,KAAA,EAAO,WAAW,SAAS,CAAA;AAEpE,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,EAAA,GAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAC3B,QAAA,IAAI,CAAC,EAAA,EAAI;AAET,QAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAEnB,QAAA,OAAO,KAAA,GACH,EAAA,CAAG,OAAA,CAAQ,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA,GAC9B,EAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,CAAC,UAAU,UAAA,KAAe;AAC7C,UAAA,MAAMA,eAAAA,GAAiB,QAAA;AACvB,UAAA,aAAA,CAAc,SAAA,CAAUA,iBAAgB,UAAU,CAAA;AAClD,UAAA,OAAO,MAAM;AACX,YAAA,aAAA,CAAc,YAAYA,eAAc,CAAA;AAAA,UAC1C,CAAA;AAAA,QACF,CAAC,CAAA;AAAA,MACP;AAGA,MAAA;AAAC,MAAA,CAAC,EAAE,YAAA,EAAc,MAAA,EAAQ,KAAA,EAAM,GAAI,MAAA;AACpC,MAAA,IAAI,CAAC,YAAA,IAAiB,CAAC,KAAA,IAAS,CAAC,OAAO,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAA,EAAI,MAAM,CAAA;AAEzE,MAAA,MAAM,cAAA,GAAiB,YAAA;AAEvB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,aAAA,CAAc,KAAA,CAAM,cAAA,EAAgB,IAAI,QAAA,CAAS,KAAM,CAAC,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,MAC3C;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,OAAO,CAAA;AAC1D,MAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,UAAA,GAAa,UAAU,SAAS,CAAA;AAEhC,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,UAAA,EAAY,UAAA,EAAW;AACvB,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,aAAA,CAAc,QAAA,CAAS,IAAI,cAAA,EAAgB,CAAA;AAC3C,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,IAAI,cAAA,EAAgB,CAAC,CAAA;AACxD,IAAA,SAAA,CAAU,KAAA,EAAM;AAAA,EAClB,CAAA;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,OAAA,GAAU,CACd,MAAA,EACA,MAAA,EACA,EAAA,KACkB;AAClB,IAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,eAAe,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAA,EAAQ,CAAA,CAAA;AAElC,IAAA,IAAI,EAAA,EAAI,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,EAAA,EAAI,QAAQ,MAAM,CAAA;AAEvB,IAAA,OAAO,MAAY;AACjB,MAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,IACrB,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;;"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@polkadot-api/raw-client",
3
+ "version": "0.1.0",
4
+ "author": "Josep M Sobrepere (https://github.com/josepot)",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/polkadot-api/polkadot-api.git"
8
+ },
9
+ "license": "MIT",
10
+ "sideEffects": false,
11
+ "exports": {
12
+ ".": {
13
+ "node": {
14
+ "production": {
15
+ "import": "./dist/esm/index.mjs",
16
+ "require": "./dist/min/index.js",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "import": "./dist/esm/index.mjs",
20
+ "require": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ },
23
+ "module": "./dist/esm/index.mjs",
24
+ "import": "./dist/esm/index.mjs",
25
+ "require": "./dist/index.js",
26
+ "default": "./dist/index.js"
27
+ },
28
+ "./package.json": "./package.json"
29
+ },
30
+ "main": "./dist/index.js",
31
+ "module": "./dist/esm/index.mjs",
32
+ "browser": "./dist/esm/index.mjs",
33
+ "types": "./dist/index.d.ts",
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "scripts": {
38
+ "build-core": "tsc --noEmit && rollup -c ../../rollup.config.js",
39
+ "build": "pnpm build-core",
40
+ "test": "echo 'no tests'",
41
+ "coverage": "vitest run --coverage",
42
+ "lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
43
+ "format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
44
+ "prepack": "pnpm run build"
45
+ },
46
+ "dependencies": {
47
+ "@polkadot-api/json-rpc-provider": "workspace:*"
48
+ }
49
+ }