Shouqun / node-dbus

dbus module for node
MIT License
150 stars 70 forks source link

node-dbus

node-dbus is a D-Bus binding for Node.js.

Build Status license GitHub contributors GitHub last commit npm

Installation

$ npm install dbus

How To Build

To build, do: node-gyp configure build or npm install.

Migrating to version 1.0

The API changed between version 0.2.21 and version 1.0.0. See migrating for information on how to migrate your application to the new API.

Dependencies

General

MacOS with MacPorts/HomeBrew

Getting Started

Best way to get started is by looking at the examples. After the build:

  1. Navigate to path/to/dbus/examples folder
  2. Run node service.js &
  3. Run node hello.js

Work your way through other examples to explore supported functionality.

Note on systems without X11

If no X server is running, the module fails when attempting to obtain a D-Bus connection at DBus.getBus(). This can be remedied by setting two environment variables manually (the actual bus address might be different):

process.env.DISPLAY = ':0';
process.env.DBUS_SESSION_BUS_ADDRESS = 'unix:path=/run/dbus/system_bus_socket';

API

DBus

The root object of this module.

DBus.getBus(busName)

Connect to a bus. busName must be either "system" to connect to the system bus or "session" to connect to the session bus.

Returns a Bus.

var bus = DBus.getBus('session');

DBus.registerService(busName, serviceName)

Register a service on a specific bus. This allows the caller to create a DBus service.

busName must be either "system" to create the service on the system bus, or "session" to create the service on the session bus. Note: the system bus often has security requirements that need to be met before the service can be registered.

Returns a Service.

var service = DBus.registerService('session', 'com.example.Library');

DEPRECATED new DBus()

Create a new DBus instance.

var DBus = require('dbus')
var dbus = new DBus()

DEPRECATED DBus.prototype.getBus(busName)

Use DBus.getBus(busName).

DEPRECATED DBus.prototype.registerService(busName, serviceName)

Use DBus.registerService(busName, serviceName)

Bus

An active connection to one of DBus' buses.

Bus.prototype.getInterface(serviceName, objectPath, interfaceName, callback)

Get an existing object's interface from a well-known service.

Once retrieved, callback will be called with either an error or with an Interface.

bus.getInterface('com.example.Library', '/com/example/Library/authors/DAdams', 'com.example.Library.Author1', function(err, interface) {
    if (err) {
        ...
    }

    // Do something with the interface
});

Bus.prototype.disconnect()

Disconnect from DBus. This disconnection makes it so that Node isn't kept running based on this active connection. It also makes this bus, and all of its children (interfaces that have been retrieved, etc.) unusable.

Interface

Interface.prototype.getProperty(propertyName, callback)

Get the value of a property.

Once retrieved callback will be called with either an error or with the value of the property.

interface.getProperty('Name', function(err, name) {
});

Interface.prototype.setProperty(propertyName, value, callback)

Set the value of a property.

Once set callback will be called with either an error or nothing.

interface.setProperty('Name', 'Douglas Adams', function(err) {
});

Interface.prototype.getProperties(callback)

Get the value of all of the properties of the interface.

Once retrieved callback will be called with either an error or with an object where the keys are the names of the properties, and the values are the values of those properties.

interface.getProperties(function(err, properties) {
    console.log(properties.Name);
});

Interface.prototype[methodName](...args, [options], callback)

Call a method on the interface.

Once executed, callback will be called with either an error or with the result of the method call.

interface.AddBook("The Hitchhiker's Guide to the Galaxy", { timeout: 1000 }, function(err, result) {
})

Service

A dbus service created by the application.

Service.prototype.createObject(objectPath)

Create an object that is exposed over DBus.

Returns a ServiceObject.

var object = service.createObject('/com/example/Library/authors/DAdams');

Service.prototype.removeObject(object)

Remove (or unexpose) an object that has been created.

service.removeObject(object);

Service.prototype.disconnect()

Disconnect from DBus. This disconnection makes it so that Node isn't kept running based on this active connection. It also disconnects all of the objects created by this service.

ServiceObject

An object that is exposed over DBus.

ServiceObject.prototype.createInterface(interfaceName)

Create an interface on an object.

Returns a ServiceInterface.

var interface = object.createInterface('com.example.Library.Author1');

ServiceInterface

An interface for an object that is exposed over DBus.

ServiceInterface.prototype.addMethod(method, opts, handler)

Add a method that can be called over DBus.

interface.addMethod('AddBook', {
    in: [DBus.Define(String), DBus.Define(Number)],
    out: [DBus.Define(Number)]
}, function(name, quality, callback) {
    doSomeAsyncOperation(name, quality, function(err, result) {
        if (err) {
            return callback(err);
        }

        callback(result);
    });
});

ServiceInterface.prototype.addProperty(name, opts)

Add a property that can be get, and/or optionally set, over DBus.

interface.addProperty('BooksWritten', {
  type: DBus.Define(Number),
  getter: function(callback) {
    getNumberOfBooksForAuthor(function(err, bookCount) {
      if(err) {
        return callback(err);
      }
      callback(bookCount);
    });
  }
}

var name = 'Douglas Adams';
interface.addProperty('Name', {
  type: Dbus.Define(String),
  getter: function(callback) {
    callback(name);
  }
  setter: function(value, done) {
    name = value;
    done();
  }
}

ServiceInterface.prototype.addSignal(name, opts)

Create a DBus signal.

interface.addSignal('bookCreated', {
  types: [DBus.Define(Object)]
});

ServiceInterface.prototype.emitSignal(name, ...values)

Emit a signal

interface.emit('bookCreated', { name: "The Hitchhiker's Guide to the Galaxy" })

ServiceInterface.prototype.update()

Save interface updates after making changes. After changes to the interface are made (via addMethod, addProperty, and addSignal), update must be called to ensure that other DBus clients can see the changes that were made.

DBus.Error

A DBus-specific error

new DBus.Error(name, message)

Create a new error. The name must be a valid error name.

throw new DBus.Error('com.example.Library.Error.BookExistsError', 'The book already exists');

dbusError.dbusName

The DBus Error name of the error. When a DBus.Error is created, its message is set to the human-readable error message. The dbusName property is set to the name (according to the DBus Spec).

License

(The MIT License)

Copyright (c) 2013

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.