feat: quickjs plugin
This commit is contained in:
@@ -646,6 +646,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
|
|
||||||
const benchmark = Benchmark.measure();
|
const benchmark = Benchmark.measure();
|
||||||
if (!this.isRoot()) {
|
if (!this.isRoot()) {
|
||||||
|
// przekazać nasz gotowiec
|
||||||
cachedState = this.interactionState().getLessOrEqual(this.txId(), upToSortKey) as SortKeyCacheResult<
|
cachedState = this.interactionState().getLessOrEqual(this.txId(), upToSortKey) as SortKeyCacheResult<
|
||||||
EvalStateResult<State>
|
EvalStateResult<State>
|
||||||
>;
|
>;
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ export const knownWarpPlugins = [
|
|||||||
'deploy',
|
'deploy',
|
||||||
'contract-blacklist',
|
'contract-blacklist',
|
||||||
'vm2',
|
'vm2',
|
||||||
'vrf'
|
'vrf',
|
||||||
|
'quickjs'
|
||||||
] as const;
|
] as const;
|
||||||
type WarpPluginPartialType = `smartweave-extension-${string}`;
|
type WarpPluginPartialType = `smartweave-extension-${string}`;
|
||||||
export type WarpKnownPluginType = (typeof knownWarpPlugins)[number];
|
export type WarpKnownPluginType = (typeof knownWarpPlugins)[number];
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { isBrowser } from '../../../utils/utils';
|
|||||||
import { Buffer } from 'warp-isomorphic';
|
import { Buffer } from 'warp-isomorphic';
|
||||||
import { InteractionState } from '../../../contract/states/InteractionState';
|
import { InteractionState } from '../../../contract/states/InteractionState';
|
||||||
import { WarpLogger } from '../../../logging/WarpLogger';
|
import { WarpLogger } from '../../../logging/WarpLogger';
|
||||||
|
import { XOR } from 'utils/types/mutually-exclusive';
|
||||||
|
|
||||||
// 'require' to fix esbuild adding same lib in both cjs and esm format
|
// 'require' to fix esbuild adding same lib in both cjs and esm format
|
||||||
// https://github.com/evanw/esbuild/issues/1950
|
// https://github.com/evanw/esbuild/issues/1950
|
||||||
@@ -208,6 +209,14 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
|
|||||||
swGlobal: swGlobal,
|
swGlobal: swGlobal,
|
||||||
contractDefinition
|
contractDefinition
|
||||||
});
|
});
|
||||||
|
} else if (warp.hasPlugin('quickjs')) {
|
||||||
|
const quickJsPlugin = warp.loadPlugin<QuickJsPluginInput, HandlerApi<State>>('quickjs');
|
||||||
|
return await quickJsPlugin.process({
|
||||||
|
contractSource: contractDefinition.src,
|
||||||
|
evaluationOptions,
|
||||||
|
swGlobal: swGlobal,
|
||||||
|
contractDefinition
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
const contractFunction = new Function(normalizedSource);
|
const contractFunction = new Function(normalizedSource);
|
||||||
const handler = isBrowser()
|
const handler = isBrowser()
|
||||||
@@ -286,11 +295,11 @@ export interface HandlerApi<State> {
|
|||||||
export type HandlerResult<State, Result> = {
|
export type HandlerResult<State, Result> = {
|
||||||
result: Result;
|
result: Result;
|
||||||
state: State;
|
state: State;
|
||||||
event: InteractionCompleteEvent;
|
event?: InteractionCompleteEvent;
|
||||||
gasUsed?: number;
|
gasUsed?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type InteractionResult<State, Result> = HandlerResult<State, Result> & {
|
type WarpInteractionResult<State, Result> = HandlerResult<State, Result> & {
|
||||||
type: InteractionResultType;
|
type: InteractionResultType;
|
||||||
errorMessage?: string;
|
errorMessage?: string;
|
||||||
error?: unknown;
|
error?: unknown;
|
||||||
@@ -298,6 +307,25 @@ export type InteractionResult<State, Result> = HandlerResult<State, Result> & {
|
|||||||
originalErrorMessages?: Record<string, string>;
|
originalErrorMessages?: Record<string, string>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AoInteractionResult<Result> = {
|
||||||
|
Memory: string;
|
||||||
|
Error: string;
|
||||||
|
Messages: {
|
||||||
|
target: string;
|
||||||
|
data: string;
|
||||||
|
anchor: string;
|
||||||
|
tags: { name: string; value: string }[];
|
||||||
|
}[];
|
||||||
|
Spawns: {
|
||||||
|
data: string;
|
||||||
|
anchor: string;
|
||||||
|
tags: { name: string; value: string }[];
|
||||||
|
}[];
|
||||||
|
Output: Result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type InteractionResult<State, Result> = XOR<WarpInteractionResult<State, Result>, AoInteractionResult<Result>>;
|
||||||
|
|
||||||
export type InteractionType = 'view' | 'write';
|
export type InteractionType = 'view' | 'write';
|
||||||
|
|
||||||
export type ContractInteraction<Input> = {
|
export type ContractInteraction<Input> = {
|
||||||
@@ -330,3 +358,18 @@ export interface VM2PluginInput {
|
|||||||
logger: WarpLogger;
|
logger: WarpLogger;
|
||||||
contractDefinition: ContractDefinition<unknown>;
|
contractDefinition: ContractDefinition<unknown>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface QuickJsPluginInput {
|
||||||
|
contractSource: string;
|
||||||
|
evaluationOptions: EvaluationOptions;
|
||||||
|
swGlobal: SmartWeaveGlobal;
|
||||||
|
contractDefinition: ContractDefinition<unknown>;
|
||||||
|
wasmMemory?: WebAssembly.Memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QuickJsOptions {
|
||||||
|
memoryLimit?: number;
|
||||||
|
maxStackSize?: number;
|
||||||
|
interruptCycles?: number;
|
||||||
|
timeout?: number;
|
||||||
|
}
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ export * from './contract/Signature';
|
|||||||
export * from './contract/EvaluationOptionsEvaluator';
|
export * from './contract/EvaluationOptionsEvaluator';
|
||||||
export * from './contract/deploy/Source';
|
export * from './contract/deploy/Source';
|
||||||
export * from './contract/deploy/CreateContract';
|
export * from './contract/deploy/CreateContract';
|
||||||
|
export * from './contract/states/ContractInteractionState';
|
||||||
|
export * from './contract/states/InteractionState';
|
||||||
|
|
||||||
export * from './legacy/gqlResult';
|
export * from './legacy/gqlResult';
|
||||||
export * from './legacy/smartweave-global';
|
export * from './legacy/smartweave-global';
|
||||||
|
|||||||
2
src/utils/types/mutually-exclusive.ts
Normal file
2
src/utils/types/mutually-exclusive.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };
|
||||||
|
export type XOR<T, U> = T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
|
||||||
Reference in New Issue
Block a user