Core Examples
Use these snippets as a starting point when building custom clients, overriding connection behaviour, and standardising event handling.
BaseSocketClient
import { BaseSocketClient } from '@twin.org/api-core';
class NotificationsSocketClient extends BaseSocketClient {
public constructor() {
super('NotificationsSocketClient', { endpoint: 'wss://api.example.org' }, 'notifications');
}
public async handleConnected(): Promise<void> {
this.sendEvent('subscribe', { channel: 'orders' });
}
public handleError(error: unknown): void {
console.log(error); // Error: network timeout
}
public connect(): boolean {
return this.socketConnect();
}
public disconnect(): void {
this.socketDisconnect();
}
public connected(): boolean {
return this.isConnected();
}
public subscribeOrders(): void {
this.onEvent('order.updated', async payload => {
const body = payload.body as { orderId: string };
console.log(body.orderId); // ord-123
});
}
}
const socketClient = new NotificationsSocketClient();
socketClient.subscribeOrders();
socketClient.connect();
console.log(socketClient.connected()); // true
socketClient.disconnect();
import { BaseSocketClient } from '@twin.org/api-core';
class MetricsSocketClient extends BaseSocketClient {
public constructor() {
super('MetricsSocketClient', { endpoint: 'wss://api.example.org' }, 'metrics');
}
public async handleConnected(): Promise<void> {
this.sendEvent('ping', { ts: Date.now() });
}
public handleError(error: unknown): void {
console.log(error); // Error: socket closed
}
public publishPing(): void {
this.sendEvent('ping', {
body: {
ts: Date.now()
}
});
}
public clearTelemetryHandlers(): void {
this.offEvent('telemetry');
}
}
const metrics = new MetricsSocketClient();
metrics.publishPing();
metrics.clearTelemetryHandlers();
BaseRestClient
import { BaseRestClient } from '@twin.org/api-core';
class CatalogueRestClient extends BaseRestClient {
public constructor() {
super('CatalogueRestClient', { endpoint: 'https://api.example.org' }, 'catalogue');
}
public async list(): Promise<string[]> {
return this.fetch('/items', 'get');
}
public endpoint(): string {
return this.getEndpointWithPrefix();
}
}
const catalogue = new CatalogueRestClient();
const items = await catalogue.list();
console.log(items.length); // 3
console.log(catalogue.endpoint()); // https://api.example.org/catalogue