@dfinity/pic 0.17.2 → 0.19.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/dist/error.d.ts +18 -3
- package/dist/error.js +27 -7
- package/dist/error.js.map +1 -1
- package/dist/http2-client.d.ts +1 -0
- package/dist/http2-client.js +28 -19
- package/dist/http2-client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/management-canister.d.ts +57 -0
- package/dist/management-canister.js +84 -0
- package/dist/management-canister.js.map +1 -1
- package/dist/pocket-ic-client-types.d.ts +30 -4
- package/dist/pocket-ic-client-types.js +1 -1
- package/dist/pocket-ic-client-types.js.map +1 -1
- package/dist/pocket-ic-client.d.ts +9 -1
- package/dist/pocket-ic-client.js +42 -5
- package/dist/pocket-ic-client.js.map +1 -1
- package/dist/pocket-ic-server.js +7 -1
- package/dist/pocket-ic-server.js.map +1 -1
- package/dist/pocket-ic-types.d.ts +91 -0
- package/dist/pocket-ic-types.js.map +1 -1
- package/dist/pocket-ic.d.ts +102 -1
- package/dist/pocket-ic.js +235 -0
- package/dist/pocket-ic.js.map +1 -1
- package/dist/util/index.d.ts +1 -0
- package/dist/util/index.js +1 -0
- package/dist/util/index.js.map +1 -1
- package/dist/util/poll.js +5 -2
- package/dist/util/poll.js.map +1 -1
- package/dist/util/wasm.d.ts +2 -0
- package/dist/util/wasm.js +19 -0
- package/dist/util/wasm.js.map +1 -0
- package/package.json +2 -2
- package/postinstall.mjs +1 -1
package/dist/pocket-ic-client.js
CHANGED
|
@@ -10,10 +10,15 @@ const AWAIT_INGRESS_STATUS_ROUNDS = 100;
|
|
|
10
10
|
class PocketIcClient {
|
|
11
11
|
serverClient;
|
|
12
12
|
instancePath;
|
|
13
|
+
instanceId;
|
|
14
|
+
ingressMaxRetries;
|
|
13
15
|
isInstanceDeleted = false;
|
|
14
|
-
|
|
16
|
+
httpGatewayInstanceId = null;
|
|
17
|
+
constructor(serverClient, instancePath, instanceId, ingressMaxRetries) {
|
|
15
18
|
this.serverClient = serverClient;
|
|
16
19
|
this.instancePath = instancePath;
|
|
20
|
+
this.instanceId = instanceId;
|
|
21
|
+
this.ingressMaxRetries = ingressMaxRetries;
|
|
17
22
|
}
|
|
18
23
|
static async create(url, req) {
|
|
19
24
|
const processingTimeoutMs = req?.processingTimeoutMs ?? PROCESSING_TIME_VALUE_MS;
|
|
@@ -27,7 +32,8 @@ class PocketIcClient {
|
|
|
27
32
|
throw new Error(res.Error.message);
|
|
28
33
|
}
|
|
29
34
|
const instanceId = res.Created.instance_id;
|
|
30
|
-
|
|
35
|
+
const ingressMaxRetries = req?.ingressMaxRetries ?? AWAIT_INGRESS_STATUS_ROUNDS;
|
|
36
|
+
return new PocketIcClient(serverClient, `/instances/${instanceId}`, instanceId, ingressMaxRetries);
|
|
31
37
|
}
|
|
32
38
|
async deleteInstance() {
|
|
33
39
|
this.assertInstanceNotDeleted();
|
|
@@ -139,7 +145,7 @@ class PocketIcClient {
|
|
|
139
145
|
const res = await this.post('/read/ingress_status', (0, pocket_ic_client_types_1.encodeIngressStatusRequest)(req));
|
|
140
146
|
return (0, pocket_ic_client_types_1.decodeIngressStatusResponse)(res);
|
|
141
147
|
}
|
|
142
|
-
async awaitCall(
|
|
148
|
+
async awaitCall(req) {
|
|
143
149
|
this.assertInstanceNotDeleted();
|
|
144
150
|
const encodedReq = {
|
|
145
151
|
messageId: (0, pocket_ic_client_types_1.encodeAwaitCanisterCallRequest)(req),
|
|
@@ -147,14 +153,45 @@ class PocketIcClient {
|
|
|
147
153
|
// the `ingressStatus` method is not exposed publicly, so it is safe to assume that the caller is the same as the one who made the call
|
|
148
154
|
caller: undefined,
|
|
149
155
|
};
|
|
150
|
-
for (let i = 0; i <
|
|
156
|
+
for (let i = 0; i < this.ingressMaxRetries; i++) {
|
|
151
157
|
await this.tick();
|
|
152
158
|
const result = await this.ingressStatus(encodedReq);
|
|
153
159
|
if ((0, util_1.isNotNil)(result)) {
|
|
154
160
|
return result;
|
|
155
161
|
}
|
|
156
162
|
}
|
|
157
|
-
throw new Error(`PocketIC did not complete the update call within ${
|
|
163
|
+
throw new Error(`PocketIC did not complete the update call within ${this.ingressMaxRetries} rounds`);
|
|
164
|
+
}
|
|
165
|
+
async autoProgress() {
|
|
166
|
+
await this.post('/auto_progress', {
|
|
167
|
+
artificial_delay_ms: 0,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
async autoProgressEnabled() {
|
|
171
|
+
return await this.get('/auto_progress');
|
|
172
|
+
}
|
|
173
|
+
async stopProgress() {
|
|
174
|
+
await this.post('/stop_progress', {});
|
|
175
|
+
}
|
|
176
|
+
async startHttpGateway() {
|
|
177
|
+
const res = await this.serverClient.jsonPost({
|
|
178
|
+
path: '/http_gateway',
|
|
179
|
+
body: { forward_to: { PocketIcInstance: this.instanceId } },
|
|
180
|
+
});
|
|
181
|
+
if ('Error' in res) {
|
|
182
|
+
throw new Error(res.Error.message);
|
|
183
|
+
}
|
|
184
|
+
this.httpGatewayInstanceId = res.Created.instance_id;
|
|
185
|
+
return res.Created.port;
|
|
186
|
+
}
|
|
187
|
+
async stopHttpGateway() {
|
|
188
|
+
if ((0, util_1.isNil)(this.httpGatewayInstanceId)) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
await this.serverClient.jsonPost({
|
|
192
|
+
path: `/http_gateway/${this.httpGatewayInstanceId}/stop`,
|
|
193
|
+
});
|
|
194
|
+
this.httpGatewayInstanceId = null;
|
|
158
195
|
}
|
|
159
196
|
async post(endpoint, body, responseJsonParser) {
|
|
160
197
|
return await this.serverClient.jsonPost({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pocket-ic-client.js","sourceRoot":"","sources":["../src/pocket-ic-client.ts"],"names":[],"mappings":";;;AAAA,uDAA6C;AAC7C,iDAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"pocket-ic-client.js","sourceRoot":"","sources":["../src/pocket-ic-client.ts"],"names":[],"mappings":"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"}
|
package/dist/pocket-ic-server.js
CHANGED
|
@@ -72,7 +72,13 @@ class PocketIcServer {
|
|
|
72
72
|
throw new error_1.BinStartError(error);
|
|
73
73
|
});
|
|
74
74
|
return await (0, util_1.poll)(async () => {
|
|
75
|
-
const portString = await (0, util_1.readFileAsString)(portFilePath)
|
|
75
|
+
const portString = await (0, util_1.readFileAsString)(portFilePath).catch((err) => {
|
|
76
|
+
if (err instanceof Error &&
|
|
77
|
+
err.code === 'ENOENT') {
|
|
78
|
+
throw new error_1.BinTimeoutError();
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
});
|
|
76
82
|
const port = parseInt(portString);
|
|
77
83
|
if (isNaN(port)) {
|
|
78
84
|
throw new error_1.BinTimeoutError();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pocket-ic-server.js","sourceRoot":"","sources":["../src/pocket-ic-server.ts"],"names":[],"mappings":";;;AAAA,2DAAyD;AACzD,yCAAoC;AACpC,qCAAoC;AACpC,mCAKiB;AACjB,iCAOgB;AAEhB,6CAAuC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAa,cAAc;IAIN;IAHF,GAAG,CAAS;IAE7B,YACmB,aAA2B,EAC5C,UAAkB;QADD,kBAAa,GAAb,aAAa,CAAc;QAG5C,IAAI,CAAC,GAAG,GAAG,oBAAoB,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,KAAK,CACvB,UAA8B,EAAE;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,MAAM,aAAa,GAAG,aAAa,GAAG,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,IAAA,cAAO,EAAC,GAAG,aAAa,OAAO,CAAC,CAAC;QAEtD,MAAM,aAAa,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;QAEpE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YAChC,IAAI,IAAA,YAAK,GAAE,IAAI,IAAA,eAAQ,GAAE,EAAE,CAAC;gBAC1B,MAAM,IAAI,6BAAqB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,IAAI,qBAAa,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,IAAA,WAAI,EACf,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,IAAA,uBAAgB,EAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pocket-ic-server.js","sourceRoot":"","sources":["../src/pocket-ic-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,10 @@ export interface CreateInstanceOptions {
|
|
|
54
54
|
* How long the PocketIC client should wait for a response from the server.
|
|
55
55
|
*/
|
|
56
56
|
processingTimeoutMs?: number;
|
|
57
|
+
/**
|
|
58
|
+
* How many IngressStatusRounds all IC update calls should wait, till we get a timeout.
|
|
59
|
+
*/
|
|
60
|
+
ingressMaxRetries?: number;
|
|
57
61
|
/**
|
|
58
62
|
* Determines what non-mainnet features should be
|
|
59
63
|
* enabled for the PocketIC instance.
|
|
@@ -586,6 +590,93 @@ export interface UpdateCanisterSettingsOptions extends Partial<CanisterSettings>
|
|
|
586
590
|
*/
|
|
587
591
|
sender?: Principal;
|
|
588
592
|
}
|
|
593
|
+
/**
|
|
594
|
+
* Options for querying the status of a given canister.
|
|
595
|
+
*
|
|
596
|
+
* @category Types
|
|
597
|
+
* @see [Principal](https://js.icp.build/core/latest/libs/principal/api/classes/principal/)
|
|
598
|
+
*/
|
|
599
|
+
export interface CanisterStatusOptions {
|
|
600
|
+
/**
|
|
601
|
+
* The Principal of the canister to query the status of.
|
|
602
|
+
*/
|
|
603
|
+
canisterId: Principal;
|
|
604
|
+
/**
|
|
605
|
+
* The Principal to send the request as.
|
|
606
|
+
* Defaults to the anonymous principal.
|
|
607
|
+
*/
|
|
608
|
+
sender?: Principal;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* The status of a canister.
|
|
612
|
+
*
|
|
613
|
+
* @category Types
|
|
614
|
+
*/
|
|
615
|
+
export type CanisterStatus = {
|
|
616
|
+
running: null;
|
|
617
|
+
} | {
|
|
618
|
+
stopping: null;
|
|
619
|
+
} | {
|
|
620
|
+
stopped: null;
|
|
621
|
+
};
|
|
622
|
+
/**
|
|
623
|
+
* Query statistics for a canister.
|
|
624
|
+
*
|
|
625
|
+
* @category Types
|
|
626
|
+
*/
|
|
627
|
+
export interface CanisterQueryStats {
|
|
628
|
+
numCallsTotal: bigint;
|
|
629
|
+
numInstructionsTotal: bigint;
|
|
630
|
+
requestPayloadBytesTotal: bigint;
|
|
631
|
+
responsePayloadBytesTotal: bigint;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* The result of querying the status of a canister.
|
|
635
|
+
* Matches the IC management canister `canister_status` response.
|
|
636
|
+
*
|
|
637
|
+
* @category Types
|
|
638
|
+
* @see [Principal](https://js.icp.build/core/latest/libs/principal/api/classes/principal/)
|
|
639
|
+
*/
|
|
640
|
+
export interface CanisterStatusResult {
|
|
641
|
+
/**
|
|
642
|
+
* The current status of the canister.
|
|
643
|
+
*/
|
|
644
|
+
status: CanisterStatus;
|
|
645
|
+
/**
|
|
646
|
+
* The definite settings of the canister.
|
|
647
|
+
*/
|
|
648
|
+
settings: {
|
|
649
|
+
controllers: Principal[];
|
|
650
|
+
computeAllocation: bigint;
|
|
651
|
+
memoryAllocation: bigint;
|
|
652
|
+
freezingThreshold: bigint;
|
|
653
|
+
reservedCyclesLimit: bigint;
|
|
654
|
+
};
|
|
655
|
+
/**
|
|
656
|
+
* The SHA-256 hash of the installed WASM module, if any.
|
|
657
|
+
*/
|
|
658
|
+
moduleHash: Uint8Array | null;
|
|
659
|
+
/**
|
|
660
|
+
* The total memory size of the canister in bytes.
|
|
661
|
+
*/
|
|
662
|
+
memorySize: bigint;
|
|
663
|
+
/**
|
|
664
|
+
* The current cycle balance of the canister.
|
|
665
|
+
*/
|
|
666
|
+
cycles: bigint;
|
|
667
|
+
/**
|
|
668
|
+
* The reserved cycles of the canister.
|
|
669
|
+
*/
|
|
670
|
+
reservedCycles: bigint;
|
|
671
|
+
/**
|
|
672
|
+
* The amount of cycles burned per day when idle.
|
|
673
|
+
*/
|
|
674
|
+
idleCyclesBurnedPerDay: bigint;
|
|
675
|
+
/**
|
|
676
|
+
* Query call statistics for the canister.
|
|
677
|
+
*/
|
|
678
|
+
queryStats: CanisterQueryStats;
|
|
679
|
+
}
|
|
589
680
|
/**
|
|
590
681
|
* Options for making a query call to a given canister.
|
|
591
682
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pocket-ic-types.js","sourceRoot":"","sources":["../src/pocket-ic-types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pocket-ic-types.js","sourceRoot":"","sources":["../src/pocket-ic-types.ts"],"names":[],"mappings":";;;AA0OA;;GAEG;AACH,IAAY,eAWX;AAXD,WAAY,eAAe;IACzB;;OAEG;IACH,8BAAW,CAAA;IAEX;;;OAGG;IACH,wCAAqB,CAAA;AACvB,CAAC,EAXW,eAAe,+BAAf,eAAe,QAW1B;AAED;;GAEG;AACH,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,sCAAqB,CAAA;IACrB,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAyBD;;GAEG;AACH,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B;;OAEG;IACH,oDAA+B,CAAA;AACjC,CAAC,EALW,iBAAiB,iCAAjB,iBAAiB,QAK5B;AA6ED;;GAEG;AACH,IAAY,UAmCX;AAnCD,WAAY,UAAU;IACpB;;OAEG;IACH,yCAA2B,CAAA;IAE3B;;OAEG;IACH,iCAAmB,CAAA;IAEnB;;OAEG;IACH,qCAAuB,CAAA;IAEvB;;OAEG;IACH,qCAAuB,CAAA;IAEvB;;OAEG;IACH,yBAAW,CAAA;IAEX;;OAEG;IACH,yBAAW,CAAA;IAEX;;OAEG;IACH,+BAAiB,CAAA;AACnB,CAAC,EAnCW,UAAU,0BAAV,UAAU,QAmCrB;AAigBD;;GAEG;AACH,IAAY,kBAeX;AAfD,WAAY,kBAAkB;IAC5B;;OAEG;IACH,iCAAW,CAAA;IAEX;;OAEG;IACH,mCAAa,CAAA;IAEb;;OAEG;IACH,mCAAa,CAAA;AACf,CAAC,EAfW,kBAAkB,kCAAlB,kBAAkB,QAe7B;AAiFD,2BAA2B"}
|
package/dist/pocket-ic.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Principal } from '@icp-sdk/core/principal';
|
|
2
2
|
import { IDL } from '@icp-sdk/core/candid';
|
|
3
3
|
import { ActorInterface, Actor } from './pocket-ic-actor';
|
|
4
|
-
import { CanisterFixture, CreateCanisterOptions, CreateInstanceOptions, InstallCodeOptions, ReinstallCodeOptions, SetupCanisterOptions, UpgradeCanisterOptions, SubnetTopology, UpdateCanisterSettingsOptions, StartCanisterOptions, StopCanisterOptions, QueryCallOptions, UpdateCallOptions, PendingHttpsOutcall, MockPendingHttpsOutcallOptions } from './pocket-ic-types';
|
|
4
|
+
import { CanisterFixture, CreateCanisterOptions, CreateInstanceOptions, InstallCodeOptions, ReinstallCodeOptions, SetupCanisterOptions, UpgradeCanisterOptions, SubnetTopology, UpdateCanisterSettingsOptions, StartCanisterOptions, StopCanisterOptions, QueryCallOptions, UpdateCallOptions, PendingHttpsOutcall, MockPendingHttpsOutcallOptions, CanisterStatusOptions, CanisterStatusResult } from './pocket-ic-types';
|
|
5
5
|
import { DeferredActor } from './pocket-ic-deferred-actor';
|
|
6
6
|
/**
|
|
7
7
|
* This class represents the main PocketIC client.
|
|
@@ -53,6 +53,7 @@ import { DeferredActor } from './pocket-ic-deferred-actor';
|
|
|
53
53
|
*/
|
|
54
54
|
export declare class PocketIc {
|
|
55
55
|
private readonly client;
|
|
56
|
+
private httpGatewayPort;
|
|
56
57
|
private constructor();
|
|
57
58
|
/**
|
|
58
59
|
* Creates a PocketIC instance.
|
|
@@ -294,6 +295,31 @@ export declare class PocketIc {
|
|
|
294
295
|
* ```
|
|
295
296
|
*/
|
|
296
297
|
updateCanisterSettings({ canisterId, computeAllocation, controllers, freezingThreshold, memoryAllocation, reservedCyclesLimit, sender, }: UpdateCanisterSettingsOptions): Promise<void>;
|
|
298
|
+
/**
|
|
299
|
+
* Returns the status of the given canister.
|
|
300
|
+
*
|
|
301
|
+
* @param options Options for querying the canister status, see {@link CanisterStatusOptions}.
|
|
302
|
+
* @returns The canister status, see {@link CanisterStatusResult}.
|
|
303
|
+
*
|
|
304
|
+
* @see [Principal](https://js.icp.build/core/latest/libs/principal/api/classes/principal/)
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* ```ts
|
|
308
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
309
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
310
|
+
*
|
|
311
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
312
|
+
*
|
|
313
|
+
* const picServer = await PocketIcServer.start();
|
|
314
|
+
* const pic = await PocketIc.create(picServer.getUrl());
|
|
315
|
+
*
|
|
316
|
+
* const status = await pic.canisterStatus({ canisterId });
|
|
317
|
+
*
|
|
318
|
+
* await pic.tearDown();
|
|
319
|
+
* await picServer.stop();
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
canisterStatus({ canisterId, sender, }: CanisterStatusOptions): Promise<CanisterStatusResult>;
|
|
297
323
|
/**
|
|
298
324
|
* Creates an {@link Actor} for the given canister.
|
|
299
325
|
* An {@link Actor} is a typesafe class that implements the Candid interface of a canister.
|
|
@@ -997,4 +1023,79 @@ export declare class PocketIc {
|
|
|
997
1023
|
* ```
|
|
998
1024
|
*/
|
|
999
1025
|
mockPendingHttpsOutcall({ requestId, response, subnetId, additionalResponses, }: MockPendingHttpsOutcallOptions): Promise<void>;
|
|
1026
|
+
/**
|
|
1027
|
+
* Make the PocketIC instance live by enabling auto progress and starting the HTTP Gateway.
|
|
1028
|
+
* If the server is already live, this method will return the HTTP Gateway URL.
|
|
1029
|
+
* The PocketIC instance must be created with at least an NNS subnet in
|
|
1030
|
+
* order for `fetchRootKey` to work correctly.
|
|
1031
|
+
*
|
|
1032
|
+
* @example
|
|
1033
|
+
* ```ts
|
|
1034
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
1035
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
1036
|
+
* import { resolve } from 'node:path';
|
|
1037
|
+
*
|
|
1038
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
1039
|
+
* const wasm = resolve('..', '..', 'canister.wasm');
|
|
1040
|
+
*
|
|
1041
|
+
* const picServer = await PocketIcServer.start();
|
|
1042
|
+
* const pic = await PocketIc.create(picServer.getUrl(), {
|
|
1043
|
+
* nns: { state: { type: SubnetStateType.New } },
|
|
1044
|
+
* application: [{ state: { type: SubnetStateType.New } }],
|
|
1045
|
+
* });
|
|
1046
|
+
*
|
|
1047
|
+
* const canister = await pic.installCode({ canisterId, wasm });
|
|
1048
|
+
* await pic.installCode({ canisterId, wasm });
|
|
1049
|
+
*
|
|
1050
|
+
* const httpGatewayUrl = await pic.makeLive();
|
|
1051
|
+
* const agent = await HttpAgent.create({
|
|
1052
|
+
* host: httpGatewayUrl,
|
|
1053
|
+
* shouldFetchRootKey: true,
|
|
1054
|
+
* });
|
|
1055
|
+
* const actor = Actor.createActor(idlFactory, { agent, canisterId });
|
|
1056
|
+
*
|
|
1057
|
+
* await pic.stopLive();
|
|
1058
|
+
* await pic.tearDown();
|
|
1059
|
+
* await picServer.stop();
|
|
1060
|
+
* ```
|
|
1061
|
+
*
|
|
1062
|
+
* @returns The HTTP Gateway port.
|
|
1063
|
+
*/
|
|
1064
|
+
makeLive(): Promise<number>;
|
|
1065
|
+
/**
|
|
1066
|
+
* Disables auto progress and stops the HTTP Gateway for the PocketIC instance.
|
|
1067
|
+
*
|
|
1068
|
+
*
|
|
1069
|
+
* @example
|
|
1070
|
+
* ```ts
|
|
1071
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
1072
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
1073
|
+
* import { resolve } from 'node:path';
|
|
1074
|
+
*
|
|
1075
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
1076
|
+
* const wasm = resolve('..', '..', 'canister.wasm');
|
|
1077
|
+
*
|
|
1078
|
+
* const picServer = await PocketIcServer.start();
|
|
1079
|
+
* const pic = await PocketIc.create(picServer.getUrl(), {
|
|
1080
|
+
* nns: { state: { type: SubnetStateType.New } },
|
|
1081
|
+
* application: [{ state: { type: SubnetStateType.New } }],
|
|
1082
|
+
* });
|
|
1083
|
+
*
|
|
1084
|
+
* const canister = await pic.installCode({ canisterId, wasm });
|
|
1085
|
+
* await pic.installCode({ canisterId, wasm });
|
|
1086
|
+
*
|
|
1087
|
+
* const httpGatewayUrl = await pic.makeLive();
|
|
1088
|
+
* const agent = await HttpAgent.create({
|
|
1089
|
+
* host: httpGatewayUrl,
|
|
1090
|
+
* shouldFetchRootKey: true,
|
|
1091
|
+
* });
|
|
1092
|
+
* const actor = Actor.createActor(idlFactory, { agent, canisterId });
|
|
1093
|
+
*
|
|
1094
|
+
* await pic.stopLive();
|
|
1095
|
+
* await pic.tearDown();
|
|
1096
|
+
* await picServer.stop();
|
|
1097
|
+
* ```
|
|
1098
|
+
*/
|
|
1099
|
+
stopLive(): Promise<void>;
|
|
1100
|
+
private installCodeChunked;
|
|
1000
1101
|
}
|
package/dist/pocket-ic.js
CHANGED
|
@@ -9,6 +9,12 @@ const pocket_ic_types_1 = require("./pocket-ic-types");
|
|
|
9
9
|
const management_canister_1 = require("./management-canister");
|
|
10
10
|
const pocket_ic_deferred_actor_1 = require("./pocket-ic-deferred-actor");
|
|
11
11
|
const NANOS_PER_MILLISECOND = BigInt(1_000_000);
|
|
12
|
+
// The IC ingress message limit is 2 MB, but that covers the entire message
|
|
13
|
+
// envelope (signature, delegations, Candid overhead, etc.).
|
|
14
|
+
// We use 1.85 MB to match dfx's conservative threshold.
|
|
15
|
+
const MAX_INSTALL_CODE_PAYLOAD_SIZE = 1_850_000;
|
|
16
|
+
const WASM_CHUNK_SIZE = 1_000_000;
|
|
17
|
+
const CHUNK_UPLOAD_BATCH_SIZE = 12;
|
|
12
18
|
/**
|
|
13
19
|
* This class represents the main PocketIC client.
|
|
14
20
|
* It is responsible for interacting with the PocketIC server via the REST API.
|
|
@@ -59,6 +65,7 @@ const NANOS_PER_MILLISECOND = BigInt(1_000_000);
|
|
|
59
65
|
*/
|
|
60
66
|
class PocketIc {
|
|
61
67
|
client;
|
|
68
|
+
httpGatewayPort = null;
|
|
62
69
|
constructor(client) {
|
|
63
70
|
this.client = client;
|
|
64
71
|
}
|
|
@@ -294,6 +301,16 @@ class PocketIc {
|
|
|
294
301
|
if (typeof wasm === 'string') {
|
|
295
302
|
wasm = await (0, util_1.readFileAsBytes)(wasm);
|
|
296
303
|
}
|
|
304
|
+
if (wasm.byteLength + arg.byteLength > MAX_INSTALL_CODE_PAYLOAD_SIZE) {
|
|
305
|
+
return this.installCodeChunked({
|
|
306
|
+
wasm,
|
|
307
|
+
arg,
|
|
308
|
+
canisterId,
|
|
309
|
+
mode: { install: null },
|
|
310
|
+
sender,
|
|
311
|
+
targetSubnetId,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
297
314
|
const payload = (0, management_canister_1.encodeInstallCodeRequest)({
|
|
298
315
|
arg: new Uint8Array(arg),
|
|
299
316
|
canister_id: canisterId,
|
|
@@ -346,6 +363,15 @@ class PocketIc {
|
|
|
346
363
|
if (typeof wasm === 'string') {
|
|
347
364
|
wasm = await (0, util_1.readFileAsBytes)(wasm);
|
|
348
365
|
}
|
|
366
|
+
if (wasm.byteLength + arg.byteLength > MAX_INSTALL_CODE_PAYLOAD_SIZE) {
|
|
367
|
+
return this.installCodeChunked({
|
|
368
|
+
wasm,
|
|
369
|
+
arg,
|
|
370
|
+
canisterId,
|
|
371
|
+
mode: { reinstall: null },
|
|
372
|
+
sender,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
349
375
|
const payload = (0, management_canister_1.encodeInstallCodeRequest)({
|
|
350
376
|
arg: new Uint8Array(arg),
|
|
351
377
|
canister_id: canisterId,
|
|
@@ -393,6 +419,15 @@ class PocketIc {
|
|
|
393
419
|
if (typeof wasm === 'string') {
|
|
394
420
|
wasm = await (0, util_1.readFileAsBytes)(wasm);
|
|
395
421
|
}
|
|
422
|
+
if (wasm.byteLength + arg.byteLength > MAX_INSTALL_CODE_PAYLOAD_SIZE) {
|
|
423
|
+
return this.installCodeChunked({
|
|
424
|
+
wasm,
|
|
425
|
+
arg,
|
|
426
|
+
canisterId,
|
|
427
|
+
mode: { upgrade: (0, util_1.optional)(upgradeModeOptions) },
|
|
428
|
+
sender,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
396
431
|
const payload = (0, management_canister_1.encodeInstallCodeRequest)({
|
|
397
432
|
arg: new Uint8Array(arg),
|
|
398
433
|
canister_id: canisterId,
|
|
@@ -452,6 +487,63 @@ class PocketIc {
|
|
|
452
487
|
payload,
|
|
453
488
|
});
|
|
454
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* Returns the status of the given canister.
|
|
492
|
+
*
|
|
493
|
+
* @param options Options for querying the canister status, see {@link CanisterStatusOptions}.
|
|
494
|
+
* @returns The canister status, see {@link CanisterStatusResult}.
|
|
495
|
+
*
|
|
496
|
+
* @see [Principal](https://js.icp.build/core/latest/libs/principal/api/classes/principal/)
|
|
497
|
+
*
|
|
498
|
+
* @example
|
|
499
|
+
* ```ts
|
|
500
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
501
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
502
|
+
*
|
|
503
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
504
|
+
*
|
|
505
|
+
* const picServer = await PocketIcServer.start();
|
|
506
|
+
* const pic = await PocketIc.create(picServer.getUrl());
|
|
507
|
+
*
|
|
508
|
+
* const status = await pic.canisterStatus({ canisterId });
|
|
509
|
+
*
|
|
510
|
+
* await pic.tearDown();
|
|
511
|
+
* await picServer.stop();
|
|
512
|
+
* ```
|
|
513
|
+
*/
|
|
514
|
+
async canisterStatus({ canisterId, sender = principal_1.Principal.anonymous(), }) {
|
|
515
|
+
const payload = (0, management_canister_1.encodeCanisterStatusRequest)({
|
|
516
|
+
canister_id: canisterId,
|
|
517
|
+
});
|
|
518
|
+
const res = await this.client.updateCall({
|
|
519
|
+
canisterId: management_canister_1.MANAGEMENT_CANISTER_ID,
|
|
520
|
+
sender,
|
|
521
|
+
method: 'canister_status',
|
|
522
|
+
payload,
|
|
523
|
+
});
|
|
524
|
+
const response = (0, management_canister_1.decodeCanisterStatusResponse)(res.body);
|
|
525
|
+
return {
|
|
526
|
+
status: response.status,
|
|
527
|
+
settings: {
|
|
528
|
+
controllers: response.settings.controllers,
|
|
529
|
+
computeAllocation: response.settings.compute_allocation,
|
|
530
|
+
memoryAllocation: response.settings.memory_allocation,
|
|
531
|
+
freezingThreshold: response.settings.freezing_threshold,
|
|
532
|
+
reservedCyclesLimit: response.settings.reserved_cycles_limit,
|
|
533
|
+
},
|
|
534
|
+
moduleHash: response.module_hash[0] ?? null,
|
|
535
|
+
memorySize: response.memory_size,
|
|
536
|
+
cycles: response.cycles,
|
|
537
|
+
reservedCycles: response.reserved_cycles,
|
|
538
|
+
idleCyclesBurnedPerDay: response.idle_cycles_burned_per_day,
|
|
539
|
+
queryStats: {
|
|
540
|
+
numCallsTotal: response.query_stats.num_calls_total,
|
|
541
|
+
numInstructionsTotal: response.query_stats.num_instructions_total,
|
|
542
|
+
requestPayloadBytesTotal: response.query_stats.request_payload_bytes_total,
|
|
543
|
+
responsePayloadBytesTotal: response.query_stats.response_payload_bytes_total,
|
|
544
|
+
},
|
|
545
|
+
};
|
|
546
|
+
}
|
|
455
547
|
/**
|
|
456
548
|
* Creates an {@link Actor} for the given canister.
|
|
457
549
|
* An {@link Actor} is a typesafe class that implements the Candid interface of a canister.
|
|
@@ -1276,6 +1368,149 @@ class PocketIc {
|
|
|
1276
1368
|
additionalResponses,
|
|
1277
1369
|
});
|
|
1278
1370
|
}
|
|
1371
|
+
/**
|
|
1372
|
+
* Make the PocketIC instance live by enabling auto progress and starting the HTTP Gateway.
|
|
1373
|
+
* If the server is already live, this method will return the HTTP Gateway URL.
|
|
1374
|
+
* The PocketIC instance must be created with at least an NNS subnet in
|
|
1375
|
+
* order for `fetchRootKey` to work correctly.
|
|
1376
|
+
*
|
|
1377
|
+
* @example
|
|
1378
|
+
* ```ts
|
|
1379
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
1380
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
1381
|
+
* import { resolve } from 'node:path';
|
|
1382
|
+
*
|
|
1383
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
1384
|
+
* const wasm = resolve('..', '..', 'canister.wasm');
|
|
1385
|
+
*
|
|
1386
|
+
* const picServer = await PocketIcServer.start();
|
|
1387
|
+
* const pic = await PocketIc.create(picServer.getUrl(), {
|
|
1388
|
+
* nns: { state: { type: SubnetStateType.New } },
|
|
1389
|
+
* application: [{ state: { type: SubnetStateType.New } }],
|
|
1390
|
+
* });
|
|
1391
|
+
*
|
|
1392
|
+
* const canister = await pic.installCode({ canisterId, wasm });
|
|
1393
|
+
* await pic.installCode({ canisterId, wasm });
|
|
1394
|
+
*
|
|
1395
|
+
* const httpGatewayUrl = await pic.makeLive();
|
|
1396
|
+
* const agent = await HttpAgent.create({
|
|
1397
|
+
* host: httpGatewayUrl,
|
|
1398
|
+
* shouldFetchRootKey: true,
|
|
1399
|
+
* });
|
|
1400
|
+
* const actor = Actor.createActor(idlFactory, { agent, canisterId });
|
|
1401
|
+
*
|
|
1402
|
+
* await pic.stopLive();
|
|
1403
|
+
* await pic.tearDown();
|
|
1404
|
+
* await picServer.stop();
|
|
1405
|
+
* ```
|
|
1406
|
+
*
|
|
1407
|
+
* @returns The HTTP Gateway port.
|
|
1408
|
+
*/
|
|
1409
|
+
async makeLive() {
|
|
1410
|
+
const isLive = await this.client.autoProgressEnabled();
|
|
1411
|
+
if (isLive) {
|
|
1412
|
+
if ((0, util_1.isNil)(this.httpGatewayPort)) {
|
|
1413
|
+
throw new Error('Inconsistent state, PocketIC server is live but no HTTP Gateway URL is known');
|
|
1414
|
+
}
|
|
1415
|
+
return this.httpGatewayPort;
|
|
1416
|
+
}
|
|
1417
|
+
await this.client.autoProgress();
|
|
1418
|
+
this.httpGatewayPort = await this.client.startHttpGateway();
|
|
1419
|
+
return this.httpGatewayPort;
|
|
1420
|
+
}
|
|
1421
|
+
/**
|
|
1422
|
+
* Disables auto progress and stops the HTTP Gateway for the PocketIC instance.
|
|
1423
|
+
*
|
|
1424
|
+
*
|
|
1425
|
+
* @example
|
|
1426
|
+
* ```ts
|
|
1427
|
+
* import { Principal } from '@icp-sdk/core/principal';
|
|
1428
|
+
* import { PocketIc, PocketIcServer } from '@dfinity/pic';
|
|
1429
|
+
* import { resolve } from 'node:path';
|
|
1430
|
+
*
|
|
1431
|
+
* const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
|
|
1432
|
+
* const wasm = resolve('..', '..', 'canister.wasm');
|
|
1433
|
+
*
|
|
1434
|
+
* const picServer = await PocketIcServer.start();
|
|
1435
|
+
* const pic = await PocketIc.create(picServer.getUrl(), {
|
|
1436
|
+
* nns: { state: { type: SubnetStateType.New } },
|
|
1437
|
+
* application: [{ state: { type: SubnetStateType.New } }],
|
|
1438
|
+
* });
|
|
1439
|
+
*
|
|
1440
|
+
* const canister = await pic.installCode({ canisterId, wasm });
|
|
1441
|
+
* await pic.installCode({ canisterId, wasm });
|
|
1442
|
+
*
|
|
1443
|
+
* const httpGatewayUrl = await pic.makeLive();
|
|
1444
|
+
* const agent = await HttpAgent.create({
|
|
1445
|
+
* host: httpGatewayUrl,
|
|
1446
|
+
* shouldFetchRootKey: true,
|
|
1447
|
+
* });
|
|
1448
|
+
* const actor = Actor.createActor(idlFactory, { agent, canisterId });
|
|
1449
|
+
*
|
|
1450
|
+
* await pic.stopLive();
|
|
1451
|
+
* await pic.tearDown();
|
|
1452
|
+
* await picServer.stop();
|
|
1453
|
+
* ```
|
|
1454
|
+
*/
|
|
1455
|
+
async stopLive() {
|
|
1456
|
+
this.httpGatewayPort = null;
|
|
1457
|
+
await this.client.stopHttpGateway();
|
|
1458
|
+
await this.client.stopProgress();
|
|
1459
|
+
}
|
|
1460
|
+
async installCodeChunked({ wasm, arg, canisterId, mode, sender, targetSubnetId, }) {
|
|
1461
|
+
const effectivePrincipal = targetSubnetId
|
|
1462
|
+
? { subnetId: targetSubnetId }
|
|
1463
|
+
: { canisterId };
|
|
1464
|
+
const clearChunkStoreRequestPayload = (0, management_canister_1.encodeClearChunkStoreRequest)({
|
|
1465
|
+
canister_id: canisterId,
|
|
1466
|
+
});
|
|
1467
|
+
// 1. Clear existing chunk store
|
|
1468
|
+
await this.client.updateCall({
|
|
1469
|
+
canisterId: management_canister_1.MANAGEMENT_CANISTER_ID,
|
|
1470
|
+
sender,
|
|
1471
|
+
method: 'clear_chunk_store',
|
|
1472
|
+
payload: clearChunkStoreRequestPayload,
|
|
1473
|
+
effectivePrincipal,
|
|
1474
|
+
});
|
|
1475
|
+
// 2. Split WASM into chunks and upload in parallel batches
|
|
1476
|
+
const chunks = (0, util_1.splitIntoChunks)(wasm, WASM_CHUNK_SIZE);
|
|
1477
|
+
const chunkHashes = [];
|
|
1478
|
+
for (let i = 0; i < chunks.length; i += CHUNK_UPLOAD_BATCH_SIZE) {
|
|
1479
|
+
const batch = chunks.slice(i, i + CHUNK_UPLOAD_BATCH_SIZE);
|
|
1480
|
+
const chunkHashResponses = await Promise.all(batch.map(async (chunk) => {
|
|
1481
|
+
const uploadChunkRequestPayload = (0, management_canister_1.encodeUploadChunkRequest)({
|
|
1482
|
+
canister_id: canisterId,
|
|
1483
|
+
chunk,
|
|
1484
|
+
});
|
|
1485
|
+
const response = await this.client.updateCall({
|
|
1486
|
+
canisterId: management_canister_1.MANAGEMENT_CANISTER_ID,
|
|
1487
|
+
sender,
|
|
1488
|
+
method: 'upload_chunk',
|
|
1489
|
+
payload: uploadChunkRequestPayload,
|
|
1490
|
+
effectivePrincipal,
|
|
1491
|
+
});
|
|
1492
|
+
return (0, management_canister_1.decodeUploadChunkResponse)(response.body);
|
|
1493
|
+
}));
|
|
1494
|
+
chunkHashes.push(...chunkHashResponses);
|
|
1495
|
+
}
|
|
1496
|
+
// 3. Install the chunked code
|
|
1497
|
+
const installChunkedCodePayload = (0, management_canister_1.encodeInstallChunkedCodeRequest)({
|
|
1498
|
+
mode,
|
|
1499
|
+
target_canister: canisterId,
|
|
1500
|
+
store_canister: [],
|
|
1501
|
+
chunk_hashes_list: chunkHashes,
|
|
1502
|
+
wasm_module_hash: (0, util_1.sha256)(wasm),
|
|
1503
|
+
arg,
|
|
1504
|
+
sender_canister_version: [],
|
|
1505
|
+
});
|
|
1506
|
+
await this.client.updateCall({
|
|
1507
|
+
canisterId: management_canister_1.MANAGEMENT_CANISTER_ID,
|
|
1508
|
+
sender,
|
|
1509
|
+
method: 'install_chunked_code',
|
|
1510
|
+
payload: installChunkedCodePayload,
|
|
1511
|
+
effectivePrincipal,
|
|
1512
|
+
});
|
|
1513
|
+
}
|
|
1279
1514
|
}
|
|
1280
1515
|
exports.PocketIc = PocketIc;
|
|
1281
1516
|
//# sourceMappingURL=pocket-ic.js.map
|