Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions packages/extension/src/iframe.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { isVatCommand, VatSupervisor } from '@ocap/kernel';
import type { VatCommand, VatCommandReply } from '@ocap/kernel';
import { makeSQLKVStore } from '@ocap/store/sqlite/wasm';
import {
MessagePortDuplexStream,
receiveMessagePort,
Expand Down Expand Up @@ -29,6 +28,5 @@ async function main(): Promise<void> {
new VatSupervisor({
id: vatId,
commandStream,
makeKVStore: makeSQLKVStore,
});
}
28 changes: 18 additions & 10 deletions packages/extension/src/kernel-integration/command-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { assert } from '@metamask/superstruct';
import type { Infer, Struct } from '@metamask/superstruct';
import type { Json } from '@metamask/utils';
import type { Kernel } from '@ocap/kernel';
import type { KVStore } from '@ocap/store';
import type { KernelDatabase } from '@ocap/store';

import type { KernelControlMethod } from './handlers/index.ts';
import type { KernelCommandPayloadStructs } from './messages.ts';
Expand All @@ -25,20 +25,28 @@ export type CommandHandler<Method extends KernelControlMethod> = {
* Implementation of the command.
*
* @param kernel - The kernel instance.
* @param kvStore - The KV store instance.
* @param kernelDatabase - The kernel database instance.
* @param params - The parameters.
* @returns The result of the command.
*/
implementation: (
kernel: Kernel,
kvStore: KVStore,
kernelDatabase: KernelDatabase,
params: CommandParams[Method],
) => Promise<Json>;
};

export type Middleware = (
next: (kernel: Kernel, kvStore: KVStore, params: unknown) => Promise<Json>,
) => (kernel: Kernel, kvStore: KVStore, params: unknown) => Promise<Json>;
next: (
kernel: Kernel,
kernelDatabase: KernelDatabase,
params: unknown,
) => Promise<Json>,
) => (
kernel: Kernel,
kernelDatabase: KernelDatabase,
params: unknown,
) => Promise<Json>;

/**
* A registry for kernel commands.
Expand Down Expand Up @@ -77,14 +85,14 @@ export class KernelCommandRegistry {
* Execute a command.
*
* @param kernel - The kernel.
* @param kvStore - The KV store.
* @param kernelDatabase - The kernel database.
* @param method - The method name.
* @param params - The parameters.
* @returns The result.
*/
async execute<Method extends KernelControlMethod>(
kernel: Kernel,
kvStore: KVStore,
kernelDatabase: KernelDatabase,
method: Method,
params: CommandParams[Method],
): Promise<Json> {
Expand All @@ -95,18 +103,18 @@ export class KernelCommandRegistry {

let chain = async (
k: Kernel,
kv: KVStore,
kdb: KernelDatabase,
param: unknown,
): Promise<Json> => {
assert(param, handler.schema);
return handler.implementation(k, kv, param);
return handler.implementation(k, kdb, param);
};

// Apply middlewares in reverse order
for (const middleware of [...this.#middlewares].reverse()) {
chain = middleware(chain);
}

return chain(kernel, kvStore, params);
return chain(kernel, kernelDatabase, params);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Kernel, KernelCommand, VatId, VatConfig } from '@ocap/kernel';
import type { KVStore } from '@ocap/store';
import type { KernelDatabase } from '@ocap/store';
import { setupOcapKernelMock } from '@ocap/test-utils';
import { describe, it, expect, vi, beforeEach } from 'vitest';

Expand All @@ -17,20 +17,23 @@ const { setMockBehavior, resetMocks } = setupOcapKernelMock();

describe('handlePanelMessage', () => {
let mockKernel: Kernel;
let mockKVStore: KVStore;
let mockKernelDatabase: KernelDatabase;

beforeEach(() => {
vi.resetModules();
resetMocks();

mockKVStore = {
get: vi.fn(),
getRequired: vi.fn(),
getNextKey: vi.fn(),
set: vi.fn(),
delete: vi.fn(),
mockKernelDatabase = {
kernelKVStore: {
get: vi.fn(),
getRequired: vi.fn(),
getNextKey: vi.fn(),
set: vi.fn(),
delete: vi.fn(),
},
clear: vi.fn(),
executeQuery: vi.fn(),
makeVatStore: vi.fn(),
};

// Create mock kernel
Expand Down Expand Up @@ -74,7 +77,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -104,7 +107,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -132,7 +135,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -160,7 +163,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -188,7 +191,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand All @@ -214,7 +217,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -242,7 +245,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -289,7 +292,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -324,7 +327,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -355,7 +358,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand All @@ -382,7 +385,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -410,7 +413,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand All @@ -426,7 +429,7 @@ describe('handlePanelMessage', () => {

const response2 = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand All @@ -453,7 +456,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down Expand Up @@ -481,7 +484,7 @@ describe('handlePanelMessage', () => {

const response = await handlePanelMessage(
mockKernel,
mockKVStore,
mockKernelDatabase,
message,
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Kernel } from '@ocap/kernel';
import type { KVStore } from '@ocap/store';
import type { KernelDatabase } from '@ocap/store';
import { makeLogger } from '@ocap/utils';

import { KernelCommandRegistry } from './command-registry.ts';
Expand All @@ -23,19 +23,24 @@ handlers.forEach((handler) =>
* Handles a message from the panel.
*
* @param kernel - The kernel instance.
* @param kvStore - The KV store instance.
* @param kernelDatabase - The kernel database instance.
* @param message - The message to handle.
* @returns The reply to the message.
*/
export async function handlePanelMessage(
kernel: Kernel,
kvStore: KVStore,
kernelDatabase: KernelDatabase,
message: KernelControlCommand,
): Promise<KernelControlReply> {
const { method, params } = message.payload;

try {
const result = await registry.execute(kernel, kvStore, method, params);
const result = await registry.execute(
kernel,
kernelDatabase,
method,
params,
);

return {
id: message.id,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Kernel } from '@ocap/kernel';
import type { KVStore } from '@ocap/store';
import type { KernelDatabase } from '@ocap/store';
import { describe, it, expect, vi } from 'vitest';

import { clearStateHandler } from './clear-state.ts';
Expand All @@ -9,7 +9,7 @@ describe('clearStateHandler', () => {
reset: vi.fn().mockResolvedValue(undefined),
} as unknown as Kernel;

const mockKVStore = {} as unknown as KVStore;
const mockKernelDatabase = {} as unknown as KernelDatabase;

it('should have the correct method', () => {
expect(clearStateHandler.method).toBe('clearState');
Expand All @@ -22,7 +22,7 @@ describe('clearStateHandler', () => {
it('should call kernel.reset() and return null', async () => {
const result = await clearStateHandler.implementation(
mockKernel,
mockKVStore,
mockKernelDatabase,
null,
);
expect(mockKernel.reset).toHaveBeenCalledOnce();
Expand All @@ -33,7 +33,7 @@ describe('clearStateHandler', () => {
const error = new Error('Reset failed');
vi.mocked(mockKernel.reset).mockRejectedValueOnce(error);
await expect(
clearStateHandler.implementation(mockKernel, mockKVStore, null),
clearStateHandler.implementation(mockKernel, mockKernelDatabase, null),
).rejects.toThrow(error);
});
});
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { Kernel } from '@ocap/kernel';
import type { KVStore } from '@ocap/store';
import type { KernelDatabase } from '@ocap/store';
import { describe, it, expect, vi } from 'vitest';

import { executeDBQueryHandler } from './execute-db-query.ts';

describe('executeDBQueryHandler', () => {
const mockKVStore = {
const mockKernelDatabase = {
executeQuery: vi.fn(() => 'test'),
} as unknown as KVStore;
} as unknown as KernelDatabase;

const mockKernel = {} as unknown as Kernel;

Expand All @@ -19,19 +19,23 @@ describe('executeDBQueryHandler', () => {
const params = { sql: 'SELECT * FROM test' };
const result = await executeDBQueryHandler.implementation(
mockKernel,
mockKVStore,
mockKernelDatabase,
params,
);
expect(mockKVStore.executeQuery).toHaveBeenCalledWith(params.sql);
expect(mockKernelDatabase.executeQuery).toHaveBeenCalledWith(params.sql);
expect(result).toBe('test');
});

it('should propagate errors from executeQuery', async () => {
const error = new Error('Query failed');
vi.mocked(mockKVStore.executeQuery).mockRejectedValueOnce(error);
vi.mocked(mockKernelDatabase.executeQuery).mockRejectedValueOnce(error);
const params = { sql: 'SELECT * FROM test' };
await expect(
executeDBQueryHandler.implementation(mockKernel, mockKVStore, params),
executeDBQueryHandler.implementation(
mockKernel,
mockKernelDatabase,
params,
),
).rejects.toThrow(error);
});
});
Loading