All files / nodejs/src/kernel make-kernel.ts

100% Statements 5/5
85.71% Branches 6/7
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                                                                                                    1x 1x           1x     1x               1x    
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 {
  IOChannelFactory,
  SystemSubclusterConfig,
} from '@metamask/ocap-kernel';
 
import { NodejsPlatformServices } from './PlatformServices.ts';
import { makeIOChannelFactory } 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.ioChannelFactory - Optional factory for creating IO channels.
 * @param options.systemSubclusters - Optional system subcluster configurations.
 * @returns The kernel and its database.
 */
export async function makeKernel({
  workerFilePath,
  resetStorage = false,
  dbFilename,
  logger,
  keySeed,
  ioChannelFactory,
  systemSubclusters,
}: {
  workerFilePath?: string;
  resetStorage?: boolean;
  dbFilename?: string;
  logger?: Logger;
  keySeed?: string | undefined;
  ioChannelFactory?: IOChannelFactory;
  systemSubclusters?: SystemSubclusterConfig[];
}): 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,
    ioChannelFactory: ioChannelFactory ?? makeIOChannelFactory(),
    ...(systemSubclusters ? { systemSubclusters } : {}),
  });
 
  return { kernel, kernelDatabase };
}