Skip to content

Services ​

Services are singletons that provide reusable functionality (loading, materials, camera, selection, etc.) and live for the viewer lifetime. Plugins consume them through the ServiceRegistry.

Usage ​

ts
import type { IService, ServiceContext, ServiceStatus } from "@optellix/xviewr-sdk";

const loader = viewer.getService("loader");
if (loader) {
  // call loader-specific methods
}

Custom services follow the same contract as built-ins.

ts
class MyService implements IService {
  readonly name = "my-service";
  readonly version = "1.0.0";
  readonly dependencies = ["material"];

  private status: ServiceStatus = ServiceStatus.Uninitialized;

  async init(ctx: ServiceContext): Promise<void> {
    this.status = ServiceStatus.Ready;
  }

  async destroy(): Promise<void> {
    this.status = ServiceStatus.Destroyed;
  }

  getStatus(): ServiceStatus {
    return this.status;
  }
}

viewer.registerService(new MyService());
await viewer.serviceRegistry.initialize("my-service");

IService ​

MemberTypeDescription
namestringUnique service identifier. Used for lookup.
versionstringSemver.
dependenciesstring[]Names of services that must initialize first.
init(context)Promise<void>Initialize internal state. Called once.
destroy()Promise<void>Release all resources.
getStatus()ServiceStatusCurrent lifecycle state.

ServiceContext ​

Passed to init.

FieldTypeDescription
viewerIViewerThe viewer.
eventBusIEventBusShared event bus.
configManagerIConfigManagerConfig access.
loggerILogger | undefinedOptional logger.

ServiceStatus ​

ts
enum ServiceStatus {
  Uninitialized = "uninitialized",
  Initializing = "initializing",
  Ready = "ready",
  Error = "error",
  Destroyed = "destroyed",
}

ILogger ​

ts
interface ILogger {
  debug(message: string, ...args: any[]): void;
  info(message: string, ...args: any[]): void;
  warn(message: string, ...args: any[]): void;
  error(message: string, ...args: any[]): void;
}

IServiceRegistry ​

Accessible as viewer.serviceRegistry.

MethodReturnsDescription
register(service)voidRegister a service instance.
registerService(name, factory)Promise<void>Register and construct lazily from an async factory.
unregister(name)booleanRemove a registered service.
get<T>(name)T | nullLook up a service. Returns null if missing.
has(name)booleanExistence check.
getStatus(name)ServiceStatusCurrent status.
list()ServiceInfo[]All registered services with dependency info.
initialize(name)Promise<void>Initialize a service (resolves dependencies first).
initializeAll()Promise<void>Initialize every registered service in dependency order.
destroy(name)Promise<void>Destroy a single service.
destroyAll()Promise<void>Destroy every service. Called from viewer.dispose().

ServiceInfo ​

ts
interface ServiceInfo {
  name: string;
  version: string;
  status: ServiceStatus;
  dependencies: string[];
  dependents: string[];
}

Service lifecycle events ​

Emitted on the event bus: service:registered, service:initializing, service:initialized, service:destroyed, service:error.

Notes ​

  • getService and registerService on ViewerCore are wrappers around the registry.
  • Built-in services (camera, loader, material, rendering, environment, grid, lod, selection, measurement, etc.) are registered automatically. A subset is initialized eagerly during ready(). The rest initialize on demand when looked up via initialize.

XViewr SDK and xConvert CLI documentation.