# @e-mc/core

> Core modules for E-mc.

Latest version **0.14.6** (published 2026-08-30) · BSD-3-Clause license · 0 weekly downloads

## Install

```sh
npm install @e-mc/core
pnpm add @e-mc/core
yarn add @e-mc/core
bun add @e-mc/core
```

## Health

**Score 60/100 (C)** — status: active.

Positive: has types; no vulnerabilities; recently updated; high maintenance score.

Warnings: low downloads; no esm support; pre 1.0.

## Facts

| | |
|---|---|
| Version | 0.14.6 |
| Published | 2026-08-30 |
| First published | 2023-03-03 |
| Weekly downloads | 0 |
| License | BSD-3-Clause |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 4 |
| Unpacked size | 93 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | An Pham |
| Maintainers | anpham6 |
| Keywords | squared |

## Links

- npm: https://www.npmjs.com/package/@e-mc/core
- Repository: https://github.com/anpham6/e-mc
- Homepage: https://github.com/anpham6/e-mc#readme
- Issues: https://github.com/anpham6/e-mc/issues
- npm.io page: https://npm.io/package/@e-mc/core

## Dependencies (4)

- [ipaddr.js](https://npm.io/package/ipaddr.js.md) ^2.5.0
- [picomatch](https://npm.io/package/picomatch.md) ^4.0.5
- [@e-mc/types](https://npm.io/package/@e-mc/types.md) 0.14.6
- [@e-mc/module](https://npm.io/package/@e-mc/module.md) 0.14.6

## Recent versions

- 0.14.6 (latest) — 2026-08-30
- 0.13.12 (T0Y0T1_YEN_B1N1N1_2022) — 2026-08-30
- 0.12.18 (T0Y0T1_YEN_B1N1N1_2021) — 2026-08-30
- 0.11.19 (T0Y0T1_YEN_B1N1N1_2020) — 2026-08-30
- 0.10.22 (forever99999999) — 2026-08-25
- 0.9.30 (succ0000000) — 2026-08-25
- 0.8.31 (succ000000) — 2026-08-25
- 0.7.25 (succ00000) — 2026-08-25
- 0.6.21 (succ0000) — 2026-08-25
- 0.5.23 (succ000) — 2026-08-25
- 0.13.11 (102_428_201) — 2026-07-06
- 0.12.17 (42_7) — 2026-07-06
- 0.11.18 (42_6) — 2026-07-06
- 0.10.21 (42_5) — 2026-07-06
- 0.9.29 (42_4) — 2026-07-06
- … 214 more at https://npm.io/package/@e-mc/core/versions

## README

# @e-mc/core

* NodeJS 20 (Minimum 18)
* ES2022

## General Usage

* [Read the Docs](https://e-mc.readthedocs.io)

## Interface

* [View Source](https://www.unpkg.com/@e-mc/types@0.14.6/lib/index.d.ts)

```typescript
import type { DataSource, LogStatus, WorkerAction } from "./squared";

import type { IHost, IModule, ModuleConstructor } from "./index";
import type { AddEventListenerOptions, CacheOptions, HostInitConfig, JoinQueueOptions, PermissionReadWrite, ResumeThreadOptions, StoreResultOptions, ThreadCountStat, WorkerChannelError, WorkerChannelResponse } from "./core";
import type { QueryResult, TimeoutAction } from "./db";
import type { LogState, StatusType } from "./logger";
import type { Settings } from "./node";
import type { ClientDbSettings, ClientModule, ClientSettings, DbCacheValue, DbCoerceSettings, DbCoerceValue, DbSourceOptions } from "./settings";

import type { Transferable, Worker, WorkerOptions } from "node:worker_threads";

import type * as EventEmitter from "node:events";

interface IHost extends IModule {
    restartable: boolean;
    readonly modules: Set<IModule>;
    readonly subProcesses: Set<IModule>;
    readonly startTime: number;
    using(...items: unknown[] | [boolean, ...unknown[]]): this;
    contains(item: unknown, condition?: (...args: any[]) => boolean): boolean;
    find(name: string): IModule | undefined;
    findAll(name: string): IModule[];
    willLog(name: string): boolean;
    ignoreLog(values: boolean | string | string[]): void;
    collectLog(level?: boolean): LogStatus<StatusType>[];
    pauseLog(type?: string): void;
    resumeLog(type?: string): void;
    hasLog(type: string): boolean;
    delayMessage(...args: unknown[]): void;
    willAbort(value: string | IModule): boolean;
    loadModule(name: string, ...args: any[]): IModule | null;
    retain(process: IModule): void;
    release(process: IModule, log?: boolean): boolean;
    restart(...args: unknown[]): void;
    joinQueue(options?: JoinQueueOptions): boolean;
    updateProgress(name: string, ...args: unknown[]): void;
    resumeThread?(options: ResumeThreadOptions): void;
    set host(value);
    get host(): null;
    get config(): Readonly<HostInitConfig>;
    get username(): string;
    get ipV4(): string;
    get ipV6(): string;
    set done(value);
    get done(): boolean;
    get queued(): boolean;
    get logState(): LogState;
    get errorCount(): number;
}

interface HostConstructor extends ModuleConstructor {
    loadSettings(settings: Settings, password?: string): boolean;
    loadSettings(settings: Settings, permission?: PermissionReadWrite, password?: string): boolean;
    isPermission(value: unknown): value is IPermission;
    createPermission(all?: boolean, freeze?: boolean): IPermission;
    kill(username: string, all: true): number;
    kill(username: string, pid: number | number[]): number;
    kill(username: string, iv: BinaryLike, all: true): number;
    kill(username: string, iv: BinaryLike, pid: number | number[]): number;
    getThreadCount(full: true): ThreadCountStat;
    getThreadCount(username: string, iv?: BinaryLike): ThreadCountStat;
    getThreadCount(username?: string | boolean, iv?: BinaryLike): number;
    parseIp(value: unknown, kind?: "ipv4" | "ipv6"): string;
    getPermissionFromSettings(freeze?: boolean): IPermission;
    readonly prototype: IHost;
    new(config?: HostInitConfig): IHost;
}

interface IClient extends IModule<IHost> {
    module: ClientModule;
    init(...args: unknown[]): this;
    getUserSettings(): unknown;
    extensionsOf(type?: string, cache?: boolean): Function[];
    get settings(): ClientSettings;
    set cacheDir(value: string);
    get cacheDir(): string;
    set extensions(values: unknown[]);
    get extensions(): ((...args: unknown[]) => unknown)[];
}

interface ClientConstructor extends ModuleConstructor {
    readonly prototype: IClient;
    new(module?: ClientModule): IClient;
}

interface IClientDb extends IClient<IHost, ClientModule<ClientDbSettings>> {
    database: DataSource[];
    cacheExpires: number;
    add(item: DataSource, state?: number): void;
    hasCache(source: string, sessionKey?: string): boolean;
    hasCoerce(source: string, component: keyof DbCoerceSettings, uuidKey: string | undefined): boolean;
    hasCoerce(source: string, component: keyof DbCoerceSettings, credential?: unknown): boolean;
    getQueryResult(source: string, credential: unknown, queryString: string, options: CacheOptions): QueryResult | undefined;
    getQueryResult(source: string, credential: unknown, queryString: string, renewCache: boolean): QueryResult | undefined;
    getQueryResult(source: string, credential: unknown, queryString: string, sessionKey?: string, renewCache?: boolean): QueryResult | undefined;
    setQueryResult(source: string, credential: unknown, queryString: string, result: unknown, options: CacheOptions): QueryResult;
    setQueryResult(source: string, credential: unknown, queryString: string, result: unknown, sessionKey?: string): QueryResult;
    getCacheResult(source: string, credential: unknown, queryString: string, cacheValue: CacheOptions, ignoreCache?: unknown): QueryResult | undefined;
    applyState(items: DataSource | DataSource[], value: number, as?: boolean): void;
    commit(items?: DataSource[]): Promise<boolean>;
    valueOfKey(credential: unknown, name: keyof DbSourceOptions, component?: string): unknown;
    settingsOf(source: string, name: keyof DbSourceOptions, component?: string): unknown;
    settingsKey(uuidKey: string, name: keyof DbSourceOptions, component?: string): unknown;
    get pending(): DataSource[];
    get committed(): DataSource[];
    get failed(): DataSource[];
}

interface ClientDbConstructor extends ClientConstructor<IHost, ClientModule> {
    STORE_RESULT_PARTITION_SIZE: number;
    STORE_RESULT_PARTITION_MULT: number;
    STORE_RESULT_KEY_SEPARATOR: string;
    readonly TRANSACTION_ACTIVE: number;
    readonly TRANSACTION_PARTIAL: number;
    readonly TRANSACTION_COMMIT: number;
    readonly TRANSACTION_TERMINATE: number;
    readonly TRANSACTION_ABORT: number;
    readonly TRANSACTION_FAIL: number;
    readonly HASH_ALGORITHM: string | undefined;
    loadSettings(settings: Pick<Settings, "process" | "memory">, password?: string): boolean;
    getTimeout(value: number | string | TimeoutAction | undefined): number;
    convertTime(value: number | string): number;
    findResult(source: string, credential: unknown, queryString: string, timeout: number, renewCache: boolean): QueryResult | undefined;
    findResult(source: string, credential: unknown, queryString: string, timeout: number, sessionKey?: string, renewCache?: boolean): QueryResult | undefined;
    storeResult(source: string, credential: unknown, queryString: string, result: QueryResult, options: StoreResultOptions): QueryResult;
    /** @deprecated */
    storeResult(source: string, credential: unknown, queryString: string, result: QueryResult, sessionKey: string, sessionExpires: number): QueryResult;
    storeResult(source: string, credential: unknown, queryString: string, result: QueryResult, cache: DbCacheValue): QueryResult;
    storeResult(source: string, credential: unknown, queryString: string, result: QueryResult, cache: DbCacheValue | undefined, options: Omit<StoreResultOptions, "cache">): QueryResult;
    keyForResult(...items: unknown[]): string;
    findSession(source: string, user: string, key: string): unknown;
    storeSession(source: string, user: string, key: string, result: unknown, expires?: number): void;
    purgeResult(prefix?: string, lru?: boolean | number): Promise<number>;
    extractUUID(credential: unknown): string;
    setPoolConfig(value: unknown): void;
    getPoolConfig(source: string): unknown;
    keyOfResult(source: string, credential: unknown, uuidOnly?: boolean): string;
    readonly prototype: IClientDb;
    new(module?: ClientModule, database?: DataSource[]): IClientDb;
}

interface IWorkerGroup {
    [Symbol.iterator](): IteratorObject<IWorkerChannel, BuiltinIteratorReturn>;
    add(name: string, item: IWorkerChannel, priority?: number): this;
    get(name: string, force?: boolean | number): IWorkerChannel | undefined;
    delete(name: string | IWorkerChannel): boolean;
    free(count?: number): number;
    print(format: "stats" | "errors"): void;
    clear(): void;
    set max(value);
    get max(): number;
    get workers(): IWorkerChannel[];
    get pending(): number;
    get available(): number;
    get errors(): WorkerChannelError[];
    get size(): number;
    get sizeOf(): number;
}

interface WorkerGroupConstructor {
    checkTimeout(value: number, active?: boolean): number;
    readonly prototype: IWorkerGroup;
    new(max?: number, locked?: boolean): IWorkerGroup;
}

interface IWorkerChannel extends EventEmitter {
    [Symbol.iterator](): IteratorObject<Worker, BuiltinIteratorReturn>;
    sendObject(data: unknown, transferList?: Transferable[], callback?: WorkerChannelResponse<unknown>, ...returnArgs: unknown[]): Worker;
    sendBuffer(data: Buffer | SharedArrayBuffer, callback: WorkerChannelResponse<unknown>, ...returnArgs: unknown[]): Worker | null;
    sendBuffer(data: Buffer, shared?: boolean, callback?: WorkerChannelResponse<unknown>, ...returnArgs: unknown[]): Worker | null;
    send(data: unknown, transferList?: Transferable[]): Promise<unknown>;
    drop(count?: number): Promise<number>;
    join(group: IWorkerGroup, label?: string): void;
    quit(): void;
    kill(count?: number): Promise<number>;
    lock(): void;
    isEmpty(): boolean;
    set min(value);
    get min(): number;
    set max(value);
    get max(): number;
    set timeoutMs(value);
    get timeoutMs(): number;
    get filename(): string;
    get workers(): Worker[];
    get detached(): boolean;
    get lastAccessed(): Date;
    get timesAccessed(): number;
    get frequencyAccessed(): number;
    get pending(): number;
    get available(): number;
    get size(): number;

    /* EventEmitter */
    on(event: "error" | "messageerror" | "abort", listener: (err: Error) => void): this;
    on(event: "exit", listener: (exitCode: number) => void): this;
    on(event: "online", listener: () => void): this;
    on(event: "message", listener: (value: any) => void): this;
    on(event: "data", listener: (data: unknown) => void): this;
    on(event: "pass", listener: (data: unknown, transferList: Transferable[] | undefined) => void): this;
    once(event: "error" | "messageerror" | "abort", listener: (err: Error) => void): this;
    once(event: "exit", listener: (exitCode: number) => void): this;
    once(event: "online", listener: () => void): this;
    once(event: "message", listener: (value: any) => void): this;
    once(event: "data", listener: (data: unknown) => void): this;
    once(event: "pass", listener: (data: unknown, transferList: Transferable[] | undefined) => void): this;
}

interface WorkerChannelConstructor {
    create(filename: string, name: string): IWorkerChannel;
    create(filename: string, options?: WorkerOptions, name?: string): IWorkerChannel;
    hasPermission(options?: WorkerAction): boolean;
    readonly prototype: IWorkerChannel;
    new(filename: string, max?: number, timeoutMs?: number): IWorkerChannel;
}

interface IAbortComponent extends AbortController {
    reset(): void;
    get aborted(): boolean;
}

interface AbortComponentConstructor {
    attach(instance: IAbortComponent, signal: AbortSignal, options?: AddEventListenerOptions): void;
    detach(instance: IAbortComponent, signal: AbortSignal): void;
    readonly prototype: IAbortComponent;
    new(): IAbortComponent;
}

interface IPermission {
    setDiskRead(enabled: boolean): void;
    setDiskRead(pathname?: string | string[], enabled?: boolean): void;
    setDiskWrite(enabled: boolean): void;
    setDiskWrite(pathname?: string | string[], enabled?: boolean): void;
    setUNCRead(enabled: boolean): void;
    setUNCRead(pathname?: string | string[], enabled?: boolean): void;
    setUNCWrite(enabled: boolean): void;
    setUNCWrite(pathname?: string | string[], enabled?: boolean): void;
    getDiskRead(): string | string[];
    getDiskWrite(): string | string[];
    getUNCRead(): string | string[];
    getUNCWrite(): string | string[];
    hasDiskRead(pathname: string): boolean;
    hasDiskWrite(pathname: string): boolean;
    hasUNCRead(pathname: string): boolean;
    hasUNCWrite(pathname: string): boolean;
    get diskRead(): boolean;
    get diskWrite(): boolean;
    get uncRead(): boolean;
    get uncWrite(): boolean;
}
```

## Settings

```typescript
import type { ExecOptions } from "./settings";

import type { MinimatchOptions } from "minimatch";
import type { PicomatchOptions } from "picomatch";

interface ProcessModule {
    thread?: {
        admin: {
            users?: string[];
            private?: boolean;
        };
        queue?: {
            limit?: number;
            expires?: number | string;
            priority: {
                bypass?: number;
                min?: number;
                max?: number;
            };
        };
        workers?: {
            channel?: { min?: number; max?: number; expires?: number | string };
        };
        limit?: number;
        expires?: number | string;
    };
}

interface PermissionModule {
    disk_read?: string | string[];
    disk_write?: string | string[];
    unc_read?: string | string[];
    unc_write?: string | string[];
    settings?: {
        broadcast_id?: string | string[];
        picomatch?: PicomatchOptions | null;
        minimatch?: MinimatchOptions | null;
    };
}
```

### Example usage

```javascript
const { Host } = require("@e-mc/core");

Host.loadSettings({ // Global
    process: {
        thread: { limit: 8 }
    },
    permission: {
        disk_read: ["**/*"],
        disk_write: ["/tmp/**"]
    }
});
```

NOTE: **@e-mc/core** is mostly a collection of abstract base classes which cannot be instantiated. **Host** is more commonly called through [@e-mc/file-manager](https://www.npmjs.com/package/@e-mc/file-manager).

## References

- https://www.unpkg.com/@e-mc/types@0.14.6/lib/squared.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/core.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/db.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/dom.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/logger.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/node.d.ts
- https://www.unpkg.com/@e-mc/types@0.14.6/lib/settings.d.ts

* https://www.npmjs.com/package/@types/node
* https://www.npmjs.com/package/@types/picomatch
* https://www.npmjs.com/package/minimatch

## LICENSE

BSD 3-Clause

---
_Source: https://npm.io/package/@e-mc/core · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
