Skip to content
This repository was archived by the owner on Apr 13, 2025. It is now read-only.

DBus service #256

Merged
merged 7 commits into from
Oct 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions nodecg-io-dbus/extension/dbusClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { DBusConfig } from "./index";
import * as dbus from "dbus-next";
import { MessageBus, ProxyObject, ClientInterface, Variant } from "dbus-next";

export class DBusClient {
public readonly session: MessageBus;
public readonly system: MessageBus;

constructor(config: DBusConfig) {
this.session = dbus.sessionBus(config);
this.system = dbus.systemBus();
}

public async proxy<T>(config: DBusProxyConfig<T>): Promise<T> {
const proxy = await (config.system ? this.system : this.session).getProxyObject(config.iface, config.path);
return config.create(this, proxy);
}

static createClient(config: DBusConfig): DBusClient {
return new DBusClient(config);
}
}

// Required, so we don't have circular imports.
export interface DBusProxyConfig<T> {
iface: string;
path: string;
system: boolean;
create(client: DBusClient, proxy: ProxyObject): T;
}

export class DBusObject {
protected readonly client: DBusClient;
protected readonly proxy: ProxyObject;
private readonly properties: RatBagPropertyInterface;

protected constructor(client: DBusClient, proxy: ProxyObject) {
this.client = client;
this.proxy = proxy;
this.properties = proxy.getInterface("org.freedesktop.DBus.Properties") as RatBagPropertyInterface;
}

async getProperty(iface: string, name: string): Promise<Variant> {
return await this.properties.Get(iface, name);
}

async setProperty(iface: string, name: string, value: Variant): Promise<void> {
return await this.properties.Set(iface, name, value);
}
}

type RatBagPropertyInterface = ClientInterface & {
Get(iface: string, path: string): Promise<Variant>;
Set(iface: string, path: string, value: Variant): Promise<void>;
};
38 changes: 38 additions & 0 deletions nodecg-io-dbus/extension/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { NodeCG } from "nodecg-types/types/server";
import { Result, emptySuccess, success, ServiceBundle } from "nodecg-io-core";
import { DBusClient } from "./dbusClient";
import * as dbus from "dbus-next";

export interface DBusConfig {
busAddress?: string;
}

export * from "./dbusClient";

module.exports = (nodecg: NodeCG) => {
new DBusService(nodecg, "dbus", __dirname, "../schema.json").register();
};

class DBusService extends ServiceBundle<DBusConfig, DBusClient> {
async validateConfig(config: DBusConfig): Promise<Result<void>> {
dbus.sessionBus(config);
return emptySuccess();
}

async createClient(config: DBusConfig): Promise<Result<DBusClient>> {
const client = DBusClient.createClient(config);
this.nodecg.log.info("Successfully created dbus client.");
return success(client);
}

stopClient(client: DBusClient): void {
client.session.disconnect();
client.system.disconnect();
this.nodecg.log.info("Successfully stopped dbus client.");
}

removeHandlers(client: DBusClient): void {
client.session.removeAllListeners();
client.system.removeAllListeners();
}
}
Loading