All files / kernel-node-runtime/src/kernel make-kernel.ts

100% Statements 5/5
88.88% Branches 8/9
100% Functions 1/1
100% Lines 5/5

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77                                                                                                              3x 3x           3x     3x                 3x    
import type { KernelDatabase } from '@metamask/kernel-store';
import { makeSQLKernelDatabase } from '@metamask/kernel-store/sqlite/nodejs';
import { Logger } from '@metamask/logger';
import { Kernel } from '@metamask/ocap-kernel';
import type {
  IOListenerFactory,
  OnRunLoopFailure,
  SystemSubclusterConfig,
} from '@metamask/ocap-kernel';
 
import { NodejsPlatformServices } from './PlatformServices.ts';
import { makeIOListenerFactory } from '../io/index.ts';
 
/**
 * Result of {@link makeKernel}.
 */
export type MakeKernelResult = {
  kernel: Kernel;
  kernelDatabase: KernelDatabase;
};
 
/**
 * The main function for the kernel worker.
 *
 * @param options - The options for the kernel.
 * @param options.workerFilePath - The path to a file defining each vat worker's routine.
 * @param options.resetStorage - If true, clear kernel storage as part of setting up the kernel.
 * @param options.dbFilename - The filename of the SQLite database file.
 * @param options.logger - The logger to use for the kernel.
 * @param options.keySeed - Optional seed for libp2p key generation.
 * @param options.ioListenerFactory - Optional factory for creating IO listeners.
 * @param options.systemSubclusters - Optional system subcluster configurations.
 * @param options.onRunLoopFailure - Optional handler called if the kernel's run
 * loop dies, after which the kernel must be restarted.
 * @returns The kernel and its database.
 */
export async function makeKernel({
  workerFilePath,
  resetStorage = false,
  dbFilename,
  logger,
  keySeed,
  ioListenerFactory,
  systemSubclusters,
  onRunLoopFailure,
}: {
  workerFilePath?: string;
  resetStorage?: boolean;
  dbFilename?: string;
  logger?: Logger;
  keySeed?: string | undefined;
  ioListenerFactory?: IOListenerFactory;
  systemSubclusters?: SystemSubclusterConfig[];
  onRunLoopFailure?: OnRunLoopFailure;
}): Promise<MakeKernelResult> {
  const rootLogger = logger ?? new Logger('kernel-worker');
  const platformServicesClient = new NodejsPlatformServices({
    workerFilePath,
    logger: rootLogger.subLogger({ tags: ['platform-services-manager'] }),
  });
 
  // Initialize kernel store.
  const kernelDatabase = await makeSQLKernelDatabase({ dbFilename });
 
  // Create and start kernel.
  const kernel = await Kernel.make(platformServicesClient, kernelDatabase, {
    resetStorage,
    logger: rootLogger.subLogger({ tags: ['kernel'] }),
    keySeed,
    ioListenerFactory: ioListenerFactory ?? makeIOListenerFactory(),
    ...(systemSubclusters ? { systemSubclusters } : {}),
    ...(onRunLoopFailure ? { onRunLoopFailure } : {}),
  });
 
  return { kernel, kernelDatabase };
}