@dfinity/pic 0.12.0-b0
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 +73 -0
- package/dist/error.d.ts +21 -0
- package/dist/error.js +55 -0
- package/dist/error.js.map +1 -0
- package/dist/http2-client.d.ts +27 -0
- package/dist/http2-client.js +137 -0
- package/dist/http2-client.js.map +1 -0
- package/dist/identity.d.ts +74 -0
- package/dist/identity.js +94 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/management-canister.d.ts +45 -0
- package/dist/management-canister.js +71 -0
- package/dist/management-canister.js.map +1 -0
- package/dist/pocket-ic-actor.d.ts +85 -0
- package/dist/pocket-ic-actor.js +58 -0
- package/dist/pocket-ic-actor.js.map +1 -0
- package/dist/pocket-ic-client-types.d.ts +372 -0
- package/dist/pocket-ic-client-types.js +395 -0
- package/dist/pocket-ic-client-types.js.map +1 -0
- package/dist/pocket-ic-client.d.ts +31 -0
- package/dist/pocket-ic-client.js +152 -0
- package/dist/pocket-ic-client.js.map +1 -0
- package/dist/pocket-ic-deferred-actor.d.ts +67 -0
- package/dist/pocket-ic-deferred-actor.js +44 -0
- package/dist/pocket-ic-deferred-actor.js.map +1 -0
- package/dist/pocket-ic-server-types.d.ts +13 -0
- package/dist/pocket-ic-server-types.js +3 -0
- package/dist/pocket-ic-server-types.js.map +1 -0
- package/dist/pocket-ic-server.d.ts +53 -0
- package/dist/pocket-ic-server.js +126 -0
- package/dist/pocket-ic-server.js.map +1 -0
- package/dist/pocket-ic-types.d.ts +679 -0
- package/dist/pocket-ic-types.js +72 -0
- package/dist/pocket-ic-types.js.map +1 -0
- package/dist/pocket-ic.d.ts +972 -0
- package/dist/pocket-ic.js +1248 -0
- package/dist/pocket-ic.js.map +1 -0
- package/dist/util/candid.d.ts +3 -0
- package/dist/util/candid.js +21 -0
- package/dist/util/candid.js.map +1 -0
- package/dist/util/encoding.d.ts +6 -0
- package/dist/util/encoding.js +24 -0
- package/dist/util/encoding.js.map +1 -0
- package/dist/util/fs.d.ts +4 -0
- package/dist/util/fs.js +28 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/index.d.ts +6 -0
- package/dist/util/index.js +23 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/is-nil.d.ts +2 -0
- package/dist/util/is-nil.js +11 -0
- package/dist/util/is-nil.js.map +1 -0
- package/dist/util/os.d.ts +4 -0
- package/dist/util/os.js +19 -0
- package/dist/util/os.js.map +1 -0
- package/dist/util/poll.d.ts +5 -0
- package/dist/util/poll.js +23 -0
- package/dist/util/poll.js.map +1 -0
- package/package.json +40 -0
- package/postinstall.mjs +25 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDeferredActorClass = createDeferredActorClass;
|
|
4
|
+
const candid_1 = require("@dfinity/candid");
|
|
5
|
+
const principal_1 = require("@dfinity/principal");
|
|
6
|
+
const util_1 = require("./util");
|
|
7
|
+
function createDeferredActorClass(interfaceFactory, canisterId, pocketIcClient) {
|
|
8
|
+
const service = interfaceFactory({ IDL: candid_1.IDL });
|
|
9
|
+
let sender = null;
|
|
10
|
+
function createDeferredActorMethod(method, func) {
|
|
11
|
+
return async function (...args) {
|
|
12
|
+
const arg = candid_1.IDL.encode(func.argTypes, args);
|
|
13
|
+
const sender = getSender();
|
|
14
|
+
const messageId = await pocketIcClient.submitCall({
|
|
15
|
+
canisterId,
|
|
16
|
+
sender,
|
|
17
|
+
method,
|
|
18
|
+
payload: new Uint8Array(arg),
|
|
19
|
+
});
|
|
20
|
+
return function () {
|
|
21
|
+
return new Promise(async (resolve) => {
|
|
22
|
+
const res = await pocketIcClient.awaitCall(messageId);
|
|
23
|
+
const decodedRes = (0, util_1.decodeCandid)(func.retTypes, res.body);
|
|
24
|
+
return resolve(decodedRes);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function getSender() {
|
|
30
|
+
return sender ?? principal_1.Principal.anonymous();
|
|
31
|
+
}
|
|
32
|
+
const DeferredActor = function () { };
|
|
33
|
+
DeferredActor.prototype.setPrincipal = function (newSender) {
|
|
34
|
+
sender = newSender;
|
|
35
|
+
};
|
|
36
|
+
DeferredActor.prototype.setIdentity = function (identity) {
|
|
37
|
+
sender = identity.getPrincipal();
|
|
38
|
+
};
|
|
39
|
+
service._fields.forEach(([methodName, func]) => {
|
|
40
|
+
DeferredActor.prototype[methodName] = createDeferredActorMethod(methodName, func);
|
|
41
|
+
});
|
|
42
|
+
return DeferredActor;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=pocket-ic-deferred-actor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocket-ic-deferred-actor.js","sourceRoot":"","sources":["../src/pocket-ic-deferred-actor.ts"],"names":[],"mappings":";;AA+EA,4DA0DC;AAzID,4CAAsC;AACtC,kDAA+C;AAI/C,iCAAsC;AA0EtC,SAAgB,wBAAwB,CAGtC,gBAAsC,EACtC,UAAqB,EACrB,cAA8B;IAE9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAH,YAAG,EAAE,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAqB,IAAI,CAAC;IAEpC,SAAS,yBAAyB,CAChC,MAAc,EACd,IAAmB;QAEnB,OAAO,KAAK,WAAW,GAAG,IAAI;YAC5B,MAAM,GAAG,GAAG,YAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAE3B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC;gBAChD,UAAU;gBACV,MAAM;gBACN,MAAM;gBACN,OAAO,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;aAC7B,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,IAAI,OAAO,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;oBACjC,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;oBACtD,MAAM,UAAU,GAAG,IAAA,mBAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEzD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,SAAS;QAChB,OAAO,MAAM,IAAI,qBAAS,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,cAAa,CAAC,CAAC;IAErC,aAAa,CAAC,SAAS,CAAC,YAAY,GAAG,UAAU,SAAoB;QACnE,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,aAAa,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,QAAkB;QAChE,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IACnC,CAAC,CAAC;IAEF,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;QAC7C,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,yBAAyB,CAC7D,UAAU,EACV,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,aAA0C,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for starting a PocketIC server.
|
|
3
|
+
*/
|
|
4
|
+
export interface StartServerOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Whether to pipe the runtimes's logs to the parent process's stdout.
|
|
7
|
+
*/
|
|
8
|
+
showRuntimeLogs?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Whether to pipe the canister logs to the parent process's stderr.
|
|
11
|
+
*/
|
|
12
|
+
showCanisterLogs?: boolean;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocket-ic-server-types.js","sourceRoot":"","sources":["../src/pocket-ic-server-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { StartServerOptions } from './pocket-ic-server-types';
|
|
2
|
+
/**
|
|
3
|
+
* This class represents the main PocketIC server.
|
|
4
|
+
* It is responsible for maintaining the lifecycle of the server process.
|
|
5
|
+
* See {@link PocketIc} for details on the client to use with this server.
|
|
6
|
+
*
|
|
7
|
+
* @category API
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
12
|
+
* import { _SERVICE, idlFactory } from '../declarations';
|
|
13
|
+
*
|
|
14
|
+
* const wasmPath = resolve('..', '..', 'canister.wasm');
|
|
15
|
+
*
|
|
16
|
+
* const picServer = await PocketIcServer.create();
|
|
17
|
+
* const pic = await PocketIc.create(picServer.getUrl());
|
|
18
|
+
*
|
|
19
|
+
* const fixture = await pic.setupCanister<_SERVICE>({ idlFactory, wasmPath });
|
|
20
|
+
* const { actor } = fixture;
|
|
21
|
+
*
|
|
22
|
+
* // perform tests...
|
|
23
|
+
*
|
|
24
|
+
* await pic.tearDown();
|
|
25
|
+
* await picServer.stop();
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class PocketIcServer {
|
|
29
|
+
private readonly serverProcess;
|
|
30
|
+
private readonly url;
|
|
31
|
+
private constructor();
|
|
32
|
+
/**
|
|
33
|
+
* Start a new PocketIC server.
|
|
34
|
+
*
|
|
35
|
+
* @param options Options for starting the server.
|
|
36
|
+
* @returns An instance of the PocketIC server.
|
|
37
|
+
*/
|
|
38
|
+
static start(options?: StartServerOptions): Promise<PocketIcServer>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the URL of the server.
|
|
41
|
+
*
|
|
42
|
+
* @returns The URL of the server.
|
|
43
|
+
*/
|
|
44
|
+
getUrl(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Stop the server.
|
|
47
|
+
*
|
|
48
|
+
* @returns A promise that resolves when the server has stopped.
|
|
49
|
+
*/
|
|
50
|
+
stop(): Promise<void>;
|
|
51
|
+
private static getBinPath;
|
|
52
|
+
private static assertBinExists;
|
|
53
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PocketIcServer = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const error_1 = require("./error");
|
|
8
|
+
const util_1 = require("./util");
|
|
9
|
+
const node_stream_1 = require("node:stream");
|
|
10
|
+
/**
|
|
11
|
+
* This class represents the main PocketIC server.
|
|
12
|
+
* It is responsible for maintaining the lifecycle of the server process.
|
|
13
|
+
* See {@link PocketIc} for details on the client to use with this server.
|
|
14
|
+
*
|
|
15
|
+
* @category API
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
20
|
+
* import { _SERVICE, idlFactory } from '../declarations';
|
|
21
|
+
*
|
|
22
|
+
* const wasmPath = resolve('..', '..', 'canister.wasm');
|
|
23
|
+
*
|
|
24
|
+
* const picServer = await PocketIcServer.create();
|
|
25
|
+
* const pic = await PocketIc.create(picServer.getUrl());
|
|
26
|
+
*
|
|
27
|
+
* const fixture = await pic.setupCanister<_SERVICE>({ idlFactory, wasmPath });
|
|
28
|
+
* const { actor } = fixture;
|
|
29
|
+
*
|
|
30
|
+
* // perform tests...
|
|
31
|
+
*
|
|
32
|
+
* await pic.tearDown();
|
|
33
|
+
* await picServer.stop();
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
class PocketIcServer {
|
|
37
|
+
serverProcess;
|
|
38
|
+
url;
|
|
39
|
+
constructor(serverProcess, portNumber) {
|
|
40
|
+
this.serverProcess = serverProcess;
|
|
41
|
+
this.url = `http://127.0.0.1:${portNumber}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Start a new PocketIC server.
|
|
45
|
+
*
|
|
46
|
+
* @param options Options for starting the server.
|
|
47
|
+
* @returns An instance of the PocketIC server.
|
|
48
|
+
*/
|
|
49
|
+
static async start(options = {}) {
|
|
50
|
+
const binPath = this.getBinPath();
|
|
51
|
+
await this.assertBinExists(binPath);
|
|
52
|
+
const pid = process.ppid;
|
|
53
|
+
const picFilePrefix = `pocket_ic_${pid}`;
|
|
54
|
+
const portFilePath = (0, util_1.tmpFile)(`${picFilePrefix}.port`);
|
|
55
|
+
const serverProcess = (0, node_child_process_1.spawn)(binPath, ['--port-file', portFilePath]);
|
|
56
|
+
if (options.showRuntimeLogs) {
|
|
57
|
+
serverProcess.stdout.pipe(process.stdout);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
serverProcess.stdout.pipe(new NullStream());
|
|
61
|
+
}
|
|
62
|
+
if (options.showCanisterLogs) {
|
|
63
|
+
serverProcess.stderr.pipe(process.stderr);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
serverProcess.stderr.pipe(new NullStream());
|
|
67
|
+
}
|
|
68
|
+
serverProcess.on('error', error => {
|
|
69
|
+
if ((0, util_1.isArm)() && (0, util_1.isDarwin)()) {
|
|
70
|
+
throw new error_1.BinStartMacOSArmError(error);
|
|
71
|
+
}
|
|
72
|
+
throw new error_1.BinStartError(error);
|
|
73
|
+
});
|
|
74
|
+
return await (0, util_1.poll)(async () => {
|
|
75
|
+
const portString = await (0, util_1.readFileAsString)(portFilePath);
|
|
76
|
+
const port = parseInt(portString);
|
|
77
|
+
if (isNaN(port)) {
|
|
78
|
+
throw new error_1.BinTimeoutError();
|
|
79
|
+
}
|
|
80
|
+
return new PocketIcServer(serverProcess, port);
|
|
81
|
+
}, { intervalMs: POLL_INTERVAL_MS, timeoutMs: POLL_TIMEOUT_MS });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the URL of the server.
|
|
85
|
+
*
|
|
86
|
+
* @returns The URL of the server.
|
|
87
|
+
*/
|
|
88
|
+
getUrl() {
|
|
89
|
+
return this.url;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Stop the server.
|
|
93
|
+
*
|
|
94
|
+
* @returns A promise that resolves when the server has stopped.
|
|
95
|
+
*/
|
|
96
|
+
async stop() {
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
this.serverProcess.on('exit', () => {
|
|
99
|
+
resolve();
|
|
100
|
+
});
|
|
101
|
+
this.serverProcess.on('error', error => {
|
|
102
|
+
reject(error);
|
|
103
|
+
});
|
|
104
|
+
this.serverProcess.kill();
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
static getBinPath() {
|
|
108
|
+
return (0, node_path_1.resolve)(__dirname, '..', 'pocket-ic');
|
|
109
|
+
}
|
|
110
|
+
static async assertBinExists(binPath) {
|
|
111
|
+
const binExists = await (0, util_1.exists)(binPath);
|
|
112
|
+
if (!binExists) {
|
|
113
|
+
throw new error_1.BinNotFoundError(binPath);
|
|
114
|
+
}
|
|
115
|
+
(0, node_fs_1.chmodSync)(binPath, 0o700);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.PocketIcServer = PocketIcServer;
|
|
119
|
+
const POLL_INTERVAL_MS = 20;
|
|
120
|
+
const POLL_TIMEOUT_MS = 30_000;
|
|
121
|
+
class NullStream extends node_stream_1.Writable {
|
|
122
|
+
_write(_chunk, _encoding, callback) {
|
|
123
|
+
callback();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=pocket-ic-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pocket-ic-server.js","sourceRoot":"","sources":["../src/pocket-ic-server.ts"],"names":[],"mappings":"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"}
|