pic-js-mops
Version:
An Internet Computer Protocol canister testing library for TypeScript and JavaScript.
55 lines • 2 kB
JavaScript
import { IDL } from '@icp-sdk/core/candid';
import { Principal } from '@icp-sdk/core/principal';
import { decodeCandid } from './util/index.js';
export function createActorClass(interfaceFactory, canisterId, pocketIcClient) {
const service = interfaceFactory({ IDL });
let sender = null;
function createActorMethod(methodName, func) {
if (func.annotations.includes('query') ||
func.annotations.includes('composite_query')) {
return createQueryMethod(methodName, func);
}
return createCallMethod(methodName, func);
}
function getSender() {
return sender ?? Principal.anonymous();
}
function createQueryMethod(method, func) {
return async function (...args) {
const arg = IDL.encode(func.argTypes, args);
const sender = getSender();
const res = await pocketIcClient.queryCall({
canisterId,
sender,
method,
payload: new Uint8Array(arg),
});
return decodeCandid(func.retTypes, res.body);
};
}
function createCallMethod(method, func) {
return async function (...args) {
const arg = IDL.encode(func.argTypes, args);
const sender = getSender();
const res = await pocketIcClient.updateCall({
canisterId,
sender,
method,
payload: new Uint8Array(arg),
});
return decodeCandid(func.retTypes, res.body);
};
}
function Actor() { }
Actor.prototype.setPrincipal = function (newSender) {
sender = newSender;
};
Actor.prototype.setIdentity = function (identity) {
sender = identity.getPrincipal();
};
service._fields.forEach(([methodName, func]) => {
Actor.prototype[methodName] = createActorMethod(methodName, func);
});
return Actor;
}
//# sourceMappingURL=pocket-ic-actor.js.map