PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/ic0/src/canister
Просмотр файла: agentCanister.ts
import { Actor, ActorSubclass, HttpAgent, fetchCandid } from '@dfinity/agent';
import { IDL } from '@dfinity/candid';
import fetch from 'cross-fetch';
import { Canister } from '../types';
const didJsCache = new Map<string, string>();
export class AgentCanister implements Canister {
public readonly agent: HttpAgent;
public readonly id: string;
private _actor: ActorSubclass | undefined;
constructor(agent: HttpAgent, id: string) {
this.agent = agent;
this.id = id;
}
private async _fetchActor() {
if (this._actor) {
return this._actor;
}
let js = didJsCache.get(this.id);
if (!js) {
const source = await fetchCandid(this.id, this.agent);
// TODO: use local Candid UI canister
const didJsAgent = HttpAgent.createSync({
host: 'https://icp-api.io',
fetch,
}); // mainnet
const didJsCanisterId = 'a4gq6-oaaaa-aaaab-qaa4q-cai';
const didJsInterface: IDL.InterfaceFactory = ({ IDL }) =>
IDL.Service({
did_to_js: IDL.Func(
[IDL.Text],
[IDL.Opt(IDL.Text)],
['query'],
),
});
const didJs: ActorSubclass = Actor.createActor(didJsInterface, {
canisterId: didJsCanisterId,
agent: didJsAgent,
});
js = ((await didJs.did_to_js(source)) as [string])[0];
didJsCache.set(this.id, js);
}
const candid = await eval(
`import("data:text/javascript;charset=utf-8,${encodeURIComponent(
js,
)}")`,
);
const actor = Actor.createActor(candid.idlFactory, {
agent: this.agent,
canisterId: this.id,
});
this._actor = actor;
return actor;
}
async call(method: string, ...args: any[]): Promise<any> {
const actor = await this._fetchActor();
const result = await actor[method](...args);
return result;
}
}
export function agentCanister(agent: HttpAgent, id: string): AgentCanister {
return new AgentCanister(agent, id);
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!