@pezkuwi/api 16.5.5 → 16.5.6
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/LICENSE +201 -0
- package/README.md +12 -12
- package/augment.js +1 -0
- package/base/Decorate.js +752 -0
- package/base/Events.js +78 -0
- package/base/Getters.js +207 -0
- package/base/Init.js +400 -0
- package/base/find.js +7 -0
- package/{build/base → base}/index.d.ts +1 -1
- package/base/index.js +57 -0
- package/bundle-pezkuwi-api.js +26238 -0
- package/{src/bundle.ts → bundle.js} +0 -9
- package/cjs/augment.d.ts +1 -0
- package/cjs/augment.js +3 -0
- package/cjs/base/Decorate.d.ts +143 -0
- package/cjs/base/Decorate.js +756 -0
- package/cjs/base/Events.d.ts +67 -0
- package/cjs/base/Events.js +82 -0
- package/cjs/base/Getters.d.ts +163 -0
- package/cjs/base/Getters.js +211 -0
- package/cjs/base/Init.d.ts +44 -0
- package/cjs/base/Init.js +404 -0
- package/cjs/base/find.d.ts +3 -0
- package/cjs/base/find.js +11 -0
- package/cjs/base/index.d.ts +47 -0
- package/cjs/base/index.js +61 -0
- package/{src/base/types.ts → cjs/base/types.d.ts} +8 -12
- package/cjs/base/types.js +2 -0
- package/cjs/bundle.d.ts +7 -0
- package/cjs/bundle.js +17 -0
- package/cjs/index.js +5 -0
- package/cjs/package.json +3 -0
- package/cjs/packageDetect.d.ts +1 -0
- package/cjs/packageDetect.js +10 -0
- package/cjs/packageInfo.js +4 -0
- package/{build → cjs}/promise/Api.d.ts +2 -2
- package/cjs/promise/Api.js +195 -0
- package/cjs/promise/Combinator.js +72 -0
- package/cjs/promise/decorateMethod.js +75 -0
- package/cjs/promise/index.js +7 -0
- package/cjs/promise/types.js +2 -0
- package/{build → cjs}/rx/Api.d.ts +2 -2
- package/cjs/rx/Api.js +173 -0
- package/cjs/rx/decorateMethod.js +6 -0
- package/cjs/rx/index.js +7 -0
- package/cjs/submittable/Result.js +84 -0
- package/cjs/submittable/createClass.js +277 -0
- package/cjs/submittable/createSubmittable.js +8 -0
- package/cjs/submittable/index.js +7 -0
- package/cjs/submittable/types.js +2 -0
- package/cjs/types/calls.js +4 -0
- package/cjs/types/consts.js +4 -0
- package/cjs/types/errors.js +4 -0
- package/cjs/types/events.js +4 -0
- package/cjs/types/index.js +13 -0
- package/cjs/types/storage.js +4 -0
- package/cjs/types/submittable.js +4 -0
- package/cjs/util/augmentObject.js +84 -0
- package/cjs/util/decorate.js +17 -0
- package/cjs/util/filterEvents.js +25 -0
- package/cjs/util/index.js +11 -0
- package/cjs/util/isKeyringPair.js +7 -0
- package/cjs/util/logging.js +5 -0
- package/cjs/util/validate.js +26 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +588 -22
- package/packageDetect.d.ts +1 -0
- package/{src/packageDetect.ts → packageDetect.js} +0 -8
- package/packageInfo.d.ts +6 -0
- package/packageInfo.js +1 -0
- package/promise/Api.d.ts +158 -0
- package/promise/Api.js +191 -0
- package/promise/Combinator.d.ts +12 -0
- package/promise/Combinator.js +68 -0
- package/promise/decorateMethod.d.ts +14 -0
- package/promise/decorateMethod.js +71 -0
- package/promise/index.d.ts +2 -0
- package/promise/index.js +2 -0
- package/{src/promise/types.ts → promise/types.d.ts} +0 -4
- package/promise/types.js +1 -0
- package/rx/Api.d.ts +155 -0
- package/{src/rx/Api.ts → rx/Api.js} +67 -84
- package/rx/decorateMethod.d.ts +3 -0
- package/rx/decorateMethod.js +3 -0
- package/rx/index.d.ts +2 -0
- package/rx/index.js +2 -0
- package/submittable/Result.d.ts +31 -0
- package/submittable/Result.js +80 -0
- package/submittable/createClass.d.ts +12 -0
- package/submittable/createClass.js +274 -0
- package/submittable/createSubmittable.d.ts +8 -0
- package/submittable/createSubmittable.js +5 -0
- package/{src/submittable/index.ts → submittable/index.d.ts} +0 -3
- package/submittable/index.js +2 -0
- package/{src/submittable/types.ts → submittable/types.d.ts} +0 -3
- package/submittable/types.js +1 -0
- package/types/calls.d.ts +1 -0
- package/types/calls.js +1 -0
- package/types/consts.d.ts +1 -0
- package/types/consts.js +1 -0
- package/types/errors.d.ts +1 -0
- package/types/errors.js +1 -0
- package/types/events.d.ts +1 -0
- package/types/events.js +1 -0
- package/types/index.d.ts +114 -0
- package/types/index.js +8 -0
- package/types/storage.d.ts +1 -0
- package/types/storage.js +1 -0
- package/types/submittable.d.ts +1 -0
- package/types/submittable.js +1 -0
- package/util/augmentObject.d.ts +9 -0
- package/util/augmentObject.js +81 -0
- package/util/decorate.d.ts +16 -0
- package/util/decorate.js +14 -0
- package/util/filterEvents.d.ts +6 -0
- package/util/filterEvents.js +22 -0
- package/{src/util/index.ts → util/index.d.ts} +0 -6
- package/util/index.js +4 -0
- package/util/isKeyringPair.d.ts +3 -0
- package/util/isKeyringPair.js +4 -0
- package/util/logging.d.ts +1 -0
- package/util/logging.js +2 -0
- package/util/validate.d.ts +3 -0
- package/util/validate.js +23 -0
- package/src/augment.ts +0 -4
- package/src/base/Decorate.ts +0 -1103
- package/src/base/Events.ts +0 -91
- package/src/base/Getters.ts +0 -245
- package/src/base/Init.ts +0 -525
- package/src/base/find.ts +0 -14
- package/src/base/index.ts +0 -85
- package/src/checkTypes.manual.ts +0 -323
- package/src/index.ts +0 -6
- package/src/mod.ts +0 -4
- package/src/packageInfo.ts +0 -6
- package/src/promise/Api.ts +0 -214
- package/src/promise/Combinator.ts +0 -91
- package/src/promise/Combinators.spec.ts +0 -109
- package/src/promise/decorateMethod.ts +0 -118
- package/src/promise/index.spec.ts +0 -167
- package/src/promise/index.ts +0 -5
- package/src/rx/decorateMethod.ts +0 -9
- package/src/rx/index.ts +0 -5
- package/src/submittable/Result.ts +0 -111
- package/src/submittable/createClass.ts +0 -438
- package/src/submittable/createSubmittable.ts +0 -19
- package/src/test/SingleAccountSigner.ts +0 -53
- package/src/test/index.ts +0 -5
- package/src/test/logEvents.ts +0 -24
- package/src/types/calls.ts +0 -4
- package/src/types/consts.ts +0 -4
- package/src/types/errors.ts +0 -4
- package/src/types/events.ts +0 -4
- package/src/types/index.ts +0 -137
- package/src/types/storage.ts +0 -4
- package/src/types/submittable.ts +0 -4
- package/src/util/augmentObject.spec.ts +0 -54
- package/src/util/augmentObject.ts +0 -112
- package/src/util/decorate.ts +0 -43
- package/src/util/filterEvents.ts +0 -34
- package/src/util/isKeyringPair.ts +0 -11
- package/src/util/logging.ts +0 -6
- package/src/util/validate.spec.ts +0 -72
- package/src/util/validate.ts +0 -36
- package/tsconfig.build.json +0 -25
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.spec.json +0 -26
- /package/{build/augment.d.ts → augment.d.ts} +0 -0
- /package/{build/base → base}/Decorate.d.ts +0 -0
- /package/{build/base → base}/Events.d.ts +0 -0
- /package/{build/base → base}/Getters.d.ts +0 -0
- /package/{build/base → base}/Init.d.ts +0 -0
- /package/{build/base → base}/find.d.ts +0 -0
- /package/{build/base → base}/types.d.ts +0 -0
- /package/{build/packageDetect.d.ts → base/types.js} +0 -0
- /package/{build/bundle.d.ts → bundle.d.ts} +0 -0
- /package/{build → cjs}/index.d.ts +0 -0
- /package/{build → cjs}/packageInfo.d.ts +0 -0
- /package/{build → cjs}/promise/Combinator.d.ts +0 -0
- /package/{build → cjs}/promise/decorateMethod.d.ts +0 -0
- /package/{build → cjs}/promise/index.d.ts +0 -0
- /package/{build → cjs}/promise/types.d.ts +0 -0
- /package/{build → cjs}/rx/decorateMethod.d.ts +0 -0
- /package/{build → cjs}/rx/index.d.ts +0 -0
- /package/{build → cjs}/submittable/Result.d.ts +0 -0
- /package/{build → cjs}/submittable/createClass.d.ts +0 -0
- /package/{build → cjs}/submittable/createSubmittable.d.ts +0 -0
- /package/{build → cjs}/submittable/index.d.ts +0 -0
- /package/{build → cjs}/submittable/types.d.ts +0 -0
- /package/{build → cjs}/types/calls.d.ts +0 -0
- /package/{build → cjs}/types/consts.d.ts +0 -0
- /package/{build → cjs}/types/errors.d.ts +0 -0
- /package/{build → cjs}/types/events.d.ts +0 -0
- /package/{build → cjs}/types/index.d.ts +0 -0
- /package/{build → cjs}/types/storage.d.ts +0 -0
- /package/{build → cjs}/types/submittable.d.ts +0 -0
- /package/{build → cjs}/util/augmentObject.d.ts +0 -0
- /package/{build → cjs}/util/decorate.d.ts +0 -0
- /package/{build → cjs}/util/filterEvents.d.ts +0 -0
- /package/{build → cjs}/util/index.d.ts +0 -0
- /package/{build → cjs}/util/isKeyringPair.d.ts +0 -0
- /package/{build → cjs}/util/logging.d.ts +0 -0
- /package/{build → cjs}/util/validate.d.ts +0 -0
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
// Copyright 2017-2025 @polkadot/api authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
/// <reference types="@pezkuwi/dev-test/globals.d.ts" />
|
|
5
|
-
|
|
6
|
-
import type { UnsubscribePromise } from '../types/index.js';
|
|
7
|
-
|
|
8
|
-
import { Combinator } from './Combinator.js';
|
|
9
|
-
|
|
10
|
-
describe('Combinator', (): void => {
|
|
11
|
-
let fns: ((value: any) => void)[] = [];
|
|
12
|
-
|
|
13
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
14
|
-
const storeFn = async (cb: (value: any) => void): UnsubscribePromise => {
|
|
15
|
-
fns.push(cb);
|
|
16
|
-
|
|
17
|
-
return (): void => undefined;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
beforeEach((): void => {
|
|
21
|
-
fns = [];
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('triggers on all values', async (): Promise<void> => {
|
|
25
|
-
await new Promise<boolean>((resolve) => {
|
|
26
|
-
let count = 0;
|
|
27
|
-
const combinator = new Combinator(
|
|
28
|
-
[storeFn],
|
|
29
|
-
(value: any[]): void => {
|
|
30
|
-
expect(value[0]).toEqual(`test${count}`);
|
|
31
|
-
|
|
32
|
-
count++;
|
|
33
|
-
|
|
34
|
-
if (count === 3) {
|
|
35
|
-
resolve(true);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
fns[0]('test0');
|
|
41
|
-
fns[0]('test1');
|
|
42
|
-
fns[0]('test2');
|
|
43
|
-
|
|
44
|
-
expect(combinator).toBeDefined();
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('combines values from 2 sources, firing when it has all results', async (): Promise<void> => {
|
|
49
|
-
await new Promise<boolean>((resolve) => {
|
|
50
|
-
const combinator = new Combinator(
|
|
51
|
-
[storeFn, storeFn],
|
|
52
|
-
(value: any[]): void => {
|
|
53
|
-
expect(value).toEqual(['test0', 'test1']);
|
|
54
|
-
|
|
55
|
-
resolve(true);
|
|
56
|
-
}
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
fns[0]('test0');
|
|
60
|
-
fns[1]('test1');
|
|
61
|
-
|
|
62
|
-
expect(combinator).toBeDefined();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('combines values from 2 sources, allowing multiple updates', async (): Promise<void> => {
|
|
67
|
-
await new Promise<boolean>((resolve) => {
|
|
68
|
-
let count = 0;
|
|
69
|
-
const combinator = new Combinator(
|
|
70
|
-
[storeFn, storeFn],
|
|
71
|
-
(value: any[]): void => {
|
|
72
|
-
expect(value).toEqual(
|
|
73
|
-
count === 0
|
|
74
|
-
? ['test0', 'test1']
|
|
75
|
-
: ['test2', 'test1']);
|
|
76
|
-
|
|
77
|
-
count++;
|
|
78
|
-
|
|
79
|
-
if (count === 2) {
|
|
80
|
-
resolve(true);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
fns[0]('test0');
|
|
86
|
-
fns[1]('test1');
|
|
87
|
-
fns[0]('test2');
|
|
88
|
-
|
|
89
|
-
expect(combinator).toBeDefined();
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// eslint-disable-next-line jest/expect-expect
|
|
94
|
-
it('unsubscribes as required', async (): Promise<void> => {
|
|
95
|
-
await new Promise<void>((resolve) => {
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
97
|
-
const mocker = () => Promise.resolve(resolve);
|
|
98
|
-
const combinator = new Combinator([
|
|
99
|
-
mocker,
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
101
|
-
async (): UnsubscribePromise => (): void => undefined
|
|
102
|
-
], (_: any[]): void => {
|
|
103
|
-
// ignore
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
combinator.unsubscribe();
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
});
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
// Copyright 2017-2025 @polkadot/api authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { Observable, Subscription } from 'rxjs';
|
|
5
|
-
import type { Callback, Codec } from '@pezkuwi/types/types';
|
|
6
|
-
import type { DecorateFn, DecorateMethodOptions, ObsInnerType, StorageEntryPromiseOverloads, UnsubscribePromise, VoidFn } from '../types/index.js';
|
|
7
|
-
|
|
8
|
-
import { catchError, EMPTY, tap } from 'rxjs';
|
|
9
|
-
|
|
10
|
-
import { isFunction, nextTick } from '@pezkuwi/util';
|
|
11
|
-
|
|
12
|
-
interface Tracker<T> {
|
|
13
|
-
reject: (value: Error) => Observable<never>;
|
|
14
|
-
resolve: (value: T) => void;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type CodecReturnType<T extends (...args: unknown[]) => Observable<Codec>> =
|
|
18
|
-
T extends (...args: any) => infer R
|
|
19
|
-
? R extends Observable<Codec>
|
|
20
|
-
? ObsInnerType<R>
|
|
21
|
-
: never
|
|
22
|
-
: never;
|
|
23
|
-
|
|
24
|
-
// a Promise completion tracker, wrapping an isComplete variable that ensures
|
|
25
|
-
// that the promise only resolves once
|
|
26
|
-
export function promiseTracker<T> (resolve: (value: T) => void, reject: (value: Error) => void): Tracker<T> {
|
|
27
|
-
let isCompleted = false;
|
|
28
|
-
|
|
29
|
-
return {
|
|
30
|
-
reject: (error: Error): Observable<never> => {
|
|
31
|
-
if (!isCompleted) {
|
|
32
|
-
isCompleted = true;
|
|
33
|
-
|
|
34
|
-
reject(error);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return EMPTY;
|
|
38
|
-
},
|
|
39
|
-
resolve: (value: T): void => {
|
|
40
|
-
if (!isCompleted) {
|
|
41
|
-
isCompleted = true;
|
|
42
|
-
|
|
43
|
-
resolve(value);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// extract the arguments and callback params from a value array possibly containing a callback
|
|
50
|
-
function extractArgs (args: unknown[], needsCallback: boolean): [unknown[], Callback<Codec> | undefined] {
|
|
51
|
-
const actualArgs = args.slice();
|
|
52
|
-
|
|
53
|
-
// If the last arg is a function, we pop it, put it into callback.
|
|
54
|
-
// actualArgs will then hold the actual arguments to be passed to `method`
|
|
55
|
-
const callback = (args.length && isFunction(args[args.length - 1]))
|
|
56
|
-
? actualArgs.pop() as Callback<Codec>
|
|
57
|
-
: undefined;
|
|
58
|
-
|
|
59
|
-
// When we need a subscription, ensure that a valid callback is actually passed
|
|
60
|
-
if (needsCallback && !isFunction(callback)) {
|
|
61
|
-
throw new Error('Expected a callback to be passed with subscriptions');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return [actualArgs, callback];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Decorate a call for a single-shot result - retrieve and then immediate unsubscribe
|
|
68
|
-
function decorateCall<M extends DecorateFn<CodecReturnType<M>>> (method: M, args: unknown[]): Promise<CodecReturnType<M>> {
|
|
69
|
-
return new Promise((resolve, reject): void => {
|
|
70
|
-
// single result tracker - either reject with Error or resolve with Codec result
|
|
71
|
-
const tracker = promiseTracker(resolve, reject);
|
|
72
|
-
|
|
73
|
-
// encoding errors reject immediately, any result unsubscribes and resolves
|
|
74
|
-
const subscription: Subscription = method(...args)
|
|
75
|
-
.pipe(
|
|
76
|
-
catchError((error: Error) => tracker.reject(error))
|
|
77
|
-
)
|
|
78
|
-
.subscribe((result): void => {
|
|
79
|
-
tracker.resolve(result);
|
|
80
|
-
|
|
81
|
-
nextTick(() => subscription.unsubscribe());
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Decorate a subscription where we have a result callback specified
|
|
87
|
-
function decorateSubscribe<M extends DecorateFn<CodecReturnType<M>>> (method: M, args: unknown[], resultCb: Callback<Codec>): UnsubscribePromise {
|
|
88
|
-
return new Promise<VoidFn>((resolve, reject): void => {
|
|
89
|
-
// either reject with error or resolve with unsubscribe callback
|
|
90
|
-
const tracker = promiseTracker(resolve, reject);
|
|
91
|
-
|
|
92
|
-
// errors reject immediately, the first result resolves with an unsubscribe promise, all results via callback
|
|
93
|
-
const subscription: Subscription = method(...args)
|
|
94
|
-
.pipe(
|
|
95
|
-
catchError((error: Error) => tracker.reject(error)),
|
|
96
|
-
tap(() => tracker.resolve(() => subscription.unsubscribe()))
|
|
97
|
-
)
|
|
98
|
-
.subscribe((result): void => {
|
|
99
|
-
// queue result (back of queue to clear current)
|
|
100
|
-
nextTick(() => resultCb(result));
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @description Decorate method for ApiPromise, where the results are converted to the Promise equivalent
|
|
107
|
-
*/
|
|
108
|
-
export function toPromiseMethod<M extends DecorateFn<CodecReturnType<M>>> (method: M, options?: DecorateMethodOptions): StorageEntryPromiseOverloads {
|
|
109
|
-
const needsCallback = !!(options?.methodName && options.methodName.includes('subscribe'));
|
|
110
|
-
|
|
111
|
-
return function (...args: unknown[]): Promise<CodecReturnType<M>> | UnsubscribePromise {
|
|
112
|
-
const [actualArgs, resultCb] = extractArgs(args, needsCallback);
|
|
113
|
-
|
|
114
|
-
return resultCb
|
|
115
|
-
? decorateSubscribe(method, actualArgs, resultCb)
|
|
116
|
-
: decorateCall((options?.overrideNoSub as M) || method, actualArgs);
|
|
117
|
-
} as StorageEntryPromiseOverloads;
|
|
118
|
-
}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
// Copyright 2017-2025 @polkadot/api authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
/// <reference types="@pezkuwi/dev-test/globals.d.ts" />
|
|
5
|
-
|
|
6
|
-
import type { HexString } from '@pezkuwi/util/types';
|
|
7
|
-
import type { SubmittableExtrinsic } from '../types/index.js';
|
|
8
|
-
|
|
9
|
-
import { createPair } from '@pezkuwi/keyring/pair';
|
|
10
|
-
import { createTestKeyring } from '@pezkuwi/keyring/testing';
|
|
11
|
-
import { MockProvider } from '@pezkuwi/rpc-provider/mock';
|
|
12
|
-
import { TypeRegistry } from '@pezkuwi/types';
|
|
13
|
-
import { hexToU8a } from '@pezkuwi/util';
|
|
14
|
-
|
|
15
|
-
import { SingleAccountSigner } from '../test/index.js';
|
|
16
|
-
import { ApiPromise } from './index.js';
|
|
17
|
-
|
|
18
|
-
const TRANSFER_SIG = '0xbb861f9c905d860d303101dfd23a6042251721ca65fb1a58e317d628f08484767a3604afeaede64a4116d08daae3c285ea2ea97c8b6c7b3548e90df327c4e60c';
|
|
19
|
-
|
|
20
|
-
describe('ApiPromise', (): void => {
|
|
21
|
-
const registry = new TypeRegistry();
|
|
22
|
-
const keyring = createTestKeyring({ type: 'ed25519' });
|
|
23
|
-
const aliceEd = keyring.addPair(
|
|
24
|
-
createPair({ toSS58: keyring.encodeAddress, type: 'ed25519' }, {
|
|
25
|
-
publicKey: hexToU8a('0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee'),
|
|
26
|
-
secretKey: hexToU8a('0xabf8e5bdbe30c65656c0a3cbd181ff8a56294a69dfedd27982aace4a7690911588dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee')
|
|
27
|
-
})
|
|
28
|
-
);
|
|
29
|
-
let provider: MockProvider;
|
|
30
|
-
|
|
31
|
-
async function createTransfer (): Promise<{ api: ApiPromise; transfer: SubmittableExtrinsic<'promise'> }> {
|
|
32
|
-
provider.subscriptions.state_subscribeStorage.lastValue = {
|
|
33
|
-
changes: [
|
|
34
|
-
[
|
|
35
|
-
'0x26aa394eea5630e07c48ae0c9558cef79c2f82b23e5fd031fb54c292794b4cc4d560eb8d00e57357cf76492334e43bb2ecaa9f28df6a8c4426d7b6090f7ad3c9',
|
|
36
|
-
'0x00'
|
|
37
|
-
]
|
|
38
|
-
]
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const signer = new SingleAccountSigner(registry, aliceEd);
|
|
42
|
-
const api = await ApiPromise.create({ provider, registry, signer, throwOnConnect: true });
|
|
43
|
-
const transfer = api.tx.balances.transferAllowDeath(keyring.getPair('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e').address, 321564789876512345n);
|
|
44
|
-
|
|
45
|
-
return { api, transfer: await transfer.signAsync(aliceEd.address, {}) };
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
beforeEach((): void => {
|
|
49
|
-
provider = new MockProvider(registry);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
afterEach(async () => {
|
|
53
|
-
await provider.disconnect();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
describe('initialization', (): void => {
|
|
57
|
-
it('Create API instance with metadata map and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => {
|
|
58
|
-
const rpcData = await provider.send<HexString>('state_getMetadata', []);
|
|
59
|
-
const genesisHash = registry.createType('Hash', await provider.send('chain_getBlockHash', [])).toHex();
|
|
60
|
-
const specVersion = 0;
|
|
61
|
-
const api = await ApiPromise.create({ metadata: { [`${genesisHash}-${specVersion}`]: rpcData }, provider, registry, throwOnConnect: true });
|
|
62
|
-
|
|
63
|
-
expect(api.genesisHash).toBeDefined();
|
|
64
|
-
expect(api.runtimeMetadata).toBeDefined();
|
|
65
|
-
expect(api.runtimeVersion).toBeDefined();
|
|
66
|
-
expect(api.rpc).toBeDefined();
|
|
67
|
-
expect(api.query).toBeDefined();
|
|
68
|
-
expect(api.tx).toBeDefined();
|
|
69
|
-
expect(api.derive).toBeDefined();
|
|
70
|
-
|
|
71
|
-
await api.disconnect();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('Create API instance without metadata and makes the runtime, rpc, state & extrinsics available', async (): Promise<void> => {
|
|
75
|
-
const metadata = {};
|
|
76
|
-
const api = await ApiPromise.create({ metadata, provider, registry, throwOnConnect: true });
|
|
77
|
-
|
|
78
|
-
expect(api.genesisHash).toBeDefined();
|
|
79
|
-
expect(api.runtimeMetadata).toBeDefined();
|
|
80
|
-
expect(api.runtimeVersion).toBeDefined();
|
|
81
|
-
expect(api.rpc).toBeDefined();
|
|
82
|
-
expect(api.query).toBeDefined();
|
|
83
|
-
expect(api.tx).toBeDefined();
|
|
84
|
-
expect(api.derive).toBeDefined();
|
|
85
|
-
|
|
86
|
-
await api.disconnect();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// eslint-disable-next-line jest/expect-expect
|
|
90
|
-
it('Create API instance will error on failure to await ready', async (): Promise<void> => {
|
|
91
|
-
class ErrorApiPromise extends ApiPromise {
|
|
92
|
-
constructor () {
|
|
93
|
-
super({ provider });
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
protected override _loadMeta (): Promise<boolean> {
|
|
97
|
-
throw new Error('Simulate failure to load meta');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
const api = await ErrorApiPromise.create({ provider, throwOnConnect: true });
|
|
103
|
-
|
|
104
|
-
await api.disconnect();
|
|
105
|
-
|
|
106
|
-
throw new Error('Expected an error but none occurred.');
|
|
107
|
-
} catch {
|
|
108
|
-
// Pass
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe('api.sign', (): void => {
|
|
114
|
-
const ADDR = '5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu';
|
|
115
|
-
const TEST = { data: '0x0102030405060708090a0b0c0d0e0f112233445566778899aabbccddeeff' };
|
|
116
|
-
const SIG = '0x659effefbbe5ab4d7136ebb5084b959eb424e32b862307371be4721ac2c46334245af4f1476c36c5e5aff04396c2fdd2ce561ec90382821d4aa071b559b1db0f';
|
|
117
|
-
|
|
118
|
-
it('signs data using a specified keyring', async (): Promise<void> => {
|
|
119
|
-
const api = await ApiPromise.create({ provider, registry, throwOnConnect: true });
|
|
120
|
-
const sig = await api.sign(aliceEd, TEST);
|
|
121
|
-
|
|
122
|
-
expect(sig).toEqual(SIG);
|
|
123
|
-
|
|
124
|
-
await api.disconnect();
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('signs data using an external signer', async (): Promise<void> => {
|
|
128
|
-
const api = await ApiPromise.create({ provider, registry, signer: new SingleAccountSigner(registry, aliceEd), throwOnConnect: true });
|
|
129
|
-
const sig = await api.sign(ADDR, TEST);
|
|
130
|
-
|
|
131
|
-
expect(sig).toEqual(SIG);
|
|
132
|
-
|
|
133
|
-
await api.disconnect();
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
describe('decorator.signAsync', (): void => {
|
|
138
|
-
it('signs a transfer using an external signer', async (): Promise<void> => {
|
|
139
|
-
const { api, transfer } = await createTransfer();
|
|
140
|
-
|
|
141
|
-
expect(transfer.signature.toHex()).toEqual(TRANSFER_SIG);
|
|
142
|
-
|
|
143
|
-
await api.disconnect();
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('api.tx(...)', (): void => {
|
|
148
|
-
it('allows construction from existing extrinsic', async (): Promise<void> => {
|
|
149
|
-
const { api, transfer } = await createTransfer();
|
|
150
|
-
|
|
151
|
-
expect(api.tx(transfer.toHex()).signature.toHex()).toEqual(TRANSFER_SIG);
|
|
152
|
-
expect(api.tx(transfer).signature.toHex()).toEqual(TRANSFER_SIG);
|
|
153
|
-
|
|
154
|
-
await api.disconnect();
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
describe('api.rpc(...)', (): void => {
|
|
159
|
-
it('allows sending rpc call', async (): Promise<void> => {
|
|
160
|
-
const { api } = await createTransfer();
|
|
161
|
-
|
|
162
|
-
expect(await api.rpc('dev_echo', 'hello', 'world')).toEqual(['hello', 'world']);
|
|
163
|
-
|
|
164
|
-
await api.disconnect();
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
});
|
package/src/promise/index.ts
DELETED
package/src/rx/decorateMethod.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// Copyright 2017-2025 @polkadot/api authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { Codec } from '@pezkuwi/types/types';
|
|
5
|
-
import type { DecorateFn } from '../types/index.js';
|
|
6
|
-
|
|
7
|
-
export function toRxMethod <M extends DecorateFn<Codec>> (method: M): M {
|
|
8
|
-
return method;
|
|
9
|
-
}
|
package/src/rx/index.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
// Copyright 2017-2025 @polkadot/api authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
import type { BlockNumber, DispatchError, DispatchInfo, EventRecord, ExtrinsicStatus, Hash } from '@pezkuwi/types/interfaces';
|
|
5
|
-
import type { AnyJson, ISubmittableResult } from '@pezkuwi/types/types';
|
|
6
|
-
import type { SubmittableResultValue } from './types.js';
|
|
7
|
-
|
|
8
|
-
const recordIdentity = (record: EventRecord) => record;
|
|
9
|
-
|
|
10
|
-
function filterAndApply <T> (events: EventRecord[], section: string, methods: string[], onFound: (record: EventRecord) => T): T[] {
|
|
11
|
-
return events
|
|
12
|
-
.filter(({ event }) =>
|
|
13
|
-
section === event.section &&
|
|
14
|
-
methods.includes(event.method)
|
|
15
|
-
)
|
|
16
|
-
.map((record) => onFound(record));
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function getDispatchError ({ event: { data: [dispatchError] } }: EventRecord): DispatchError {
|
|
20
|
-
return dispatchError as DispatchError;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function getDispatchInfo ({ event: { data, method } }: EventRecord): DispatchInfo {
|
|
24
|
-
return method === 'ExtrinsicSuccess'
|
|
25
|
-
? data[0] as DispatchInfo
|
|
26
|
-
: data[1] as DispatchInfo;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function extractError (events: EventRecord[] = []): DispatchError | undefined {
|
|
30
|
-
return filterAndApply(events, 'system', ['ExtrinsicFailed'], getDispatchError)[0];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function extractInfo (events: EventRecord[] = []): DispatchInfo | undefined {
|
|
34
|
-
return filterAndApply(events, 'system', ['ExtrinsicFailed', 'ExtrinsicSuccess'], getDispatchInfo)[0];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class SubmittableResult implements ISubmittableResult {
|
|
38
|
-
readonly dispatchError?: DispatchError | undefined;
|
|
39
|
-
|
|
40
|
-
readonly dispatchInfo?: DispatchInfo | undefined;
|
|
41
|
-
|
|
42
|
-
readonly internalError?: Error | undefined;
|
|
43
|
-
|
|
44
|
-
readonly events: EventRecord[];
|
|
45
|
-
|
|
46
|
-
readonly status: ExtrinsicStatus;
|
|
47
|
-
|
|
48
|
-
readonly txHash: Hash;
|
|
49
|
-
|
|
50
|
-
readonly txIndex?: number | undefined;
|
|
51
|
-
|
|
52
|
-
readonly blockNumber?: BlockNumber | undefined;
|
|
53
|
-
|
|
54
|
-
constructor ({ blockNumber, dispatchError, dispatchInfo, events, internalError, status, txHash, txIndex }: SubmittableResultValue) {
|
|
55
|
-
this.dispatchError = dispatchError || extractError(events);
|
|
56
|
-
this.dispatchInfo = dispatchInfo || extractInfo(events);
|
|
57
|
-
this.events = events || [];
|
|
58
|
-
this.internalError = internalError;
|
|
59
|
-
this.status = status;
|
|
60
|
-
this.txHash = txHash;
|
|
61
|
-
this.txIndex = txIndex;
|
|
62
|
-
this.blockNumber = blockNumber;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public get isCompleted (): boolean {
|
|
66
|
-
return this.isError || this.status.isInBlock || this.status.isFinalized;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
public get isError (): boolean {
|
|
70
|
-
return this.status.isDropped || this.status.isFinalityTimeout || this.status.isInvalid || this.status.isUsurped;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public get isFinalized (): boolean {
|
|
74
|
-
return this.status.isFinalized;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
public get isInBlock (): boolean {
|
|
78
|
-
return this.status.isInBlock;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
public get isWarning (): boolean {
|
|
82
|
-
return this.status.isRetracted;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* @description Filters EventRecords for the specified method & section (there could be multiple)
|
|
87
|
-
*/
|
|
88
|
-
public filterRecords (section: string, method: string | string[]): EventRecord[] {
|
|
89
|
-
return filterAndApply(this.events, section, Array.isArray(method) ? method : [method], recordIdentity);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* @description Finds an EventRecord for the specified method & section
|
|
94
|
-
*/
|
|
95
|
-
public findRecord (section: string, method: string | string[]): EventRecord | undefined {
|
|
96
|
-
return this.filterRecords(section, method)[0];
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* @description Creates a human representation of the output
|
|
101
|
-
*/
|
|
102
|
-
public toHuman (isExtended?: boolean): AnyJson {
|
|
103
|
-
return {
|
|
104
|
-
dispatchError: this.dispatchError?.toHuman(),
|
|
105
|
-
dispatchInfo: this.dispatchInfo?.toHuman(),
|
|
106
|
-
events: this.events.map((e) => e.toHuman(isExtended)),
|
|
107
|
-
internalError: this.internalError?.message.toString(),
|
|
108
|
-
status: this.status.toHuman(isExtended)
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
}
|