@tanislav000/bluez
Version:
Bluez5 D-Bus bindings for easy to use bluetooth access in Node.js
211 lines • 6.81 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LooselyTypedEmitter = exports.TypedEmitter = exports.unwrapDbusSignature = exports.unwrapDbusVariantAll = exports.unwrapDbusVariantArray = exports.unwrapDbusVariantObject = exports.unwrapDbusVariant = exports.wrapDbusSignature = exports.wrapDbusVariantArray = exports.wrapDbusVariantObject = exports.wrapDbusVariant = exports.detectDbusType = void 0;
const DBus = __importStar(require("dbus-next"));
const events_1 = require("events");
function getDbusArrayTypes(arr) {
return arr
.map(detectDbusType)
.sort()
.filter((value, index, self) => self.indexOf(value) === index);
}
function detectDbusType(v) {
switch (typeof v) {
case "bigint":
return "x";
case "string":
return "s";
case "boolean":
return "b";
case "number":
if (Number.isInteger(v))
return "i";
else
return "d";
case "object":
if (Buffer.isBuffer(v)) {
return "ay";
}
if (Array.isArray(v)) {
if (v.length === 0)
return "av";
const types = getDbusArrayTypes(v);
if (types.length === 1) {
return "a" + types[0];
}
return "av";
}
if (v.constructor === DBus.Variant) {
return "v";
}
return "a{sv}";
default:
throw new Error("Could not detect signature for value of type " + typeof v);
}
}
exports.detectDbusType = detectDbusType;
/**
* This will create `v` signature
* @param obj
*/
function wrapDbusVariant(obj, type) {
const detectedType = detectDbusType(obj);
if (detectedType === "v")
return obj;
if (!type)
type = detectedType;
if (type[0] === "a" && type.includes("v")) {
// recurse
if (Array.isArray(obj)) {
return new DBus.Variant(type, wrapDbusVariantArray(obj));
}
return new DBus.Variant(type, wrapDbusVariantObject(obj));
}
return new DBus.Variant(type, obj);
}
exports.wrapDbusVariant = wrapDbusVariant;
/**
* This will create `a{sv}` signature
* @param obj
*/
function wrapDbusVariantObject(obj, signatures) {
const res = {};
for (const key in obj) {
const type = signatures === undefined ? undefined : signatures[key];
res[key] = wrapDbusVariant(obj[key], type);
}
return res;
}
exports.wrapDbusVariantObject = wrapDbusVariantObject;
/**
* This will create `av` signature
* @param obj
*/
function wrapDbusVariantArray(obj, signatures) {
return obj.map((v, i) => {
const type = signatures === undefined ? undefined : signatures[i];
return wrapDbusVariant(v, type);
});
}
exports.wrapDbusVariantArray = wrapDbusVariantArray;
function wrapDbusSignature(obj, type) {
if (type === "v")
return wrapDbusVariant(obj);
if (type === "av")
return wrapDbusVariantArray(obj);
if (type === "a{sv}")
return wrapDbusVariantObject(obj);
if (type === "ay") {
if (Buffer.isBuffer(obj)) {
return obj.toJSON().data;
}
return obj;
}
if (type.includes("v")) {
// TODO: other variant type
console.warn("Unhandled Variant Type: %s. Please report this the Bluez library", type);
}
return obj;
}
exports.wrapDbusSignature = wrapDbusSignature;
/**
* This unwarps `v` signatures
* @param obj
*/
function unwrapDbusVariant(obj) {
if (obj.signature === "ay") {
return Buffer.from(obj.value);
}
if (obj.signature.includes("v")) {
// recurse
if (Array.isArray(obj.value)) {
return unwrapDbusVariantArray(obj.value);
}
if (obj.value.constructor === DBus.Variant) {
return unwrapDbusVariant(obj.value);
}
return unwrapDbusVariantObject(obj.value);
}
return obj.value;
}
exports.unwrapDbusVariant = unwrapDbusVariant;
/**
* This unwraps `a{sv}` signatures
* @param obj
*/
function unwrapDbusVariantObject(obj) {
const res = Object.assign({}, obj); // clone object structure
for (const [k, v] of Object.entries(obj)) {
res[k] = unwrapDbusVariant(v);
}
return res;
}
exports.unwrapDbusVariantObject = unwrapDbusVariantObject;
/**
* This unwraps `av` signatures
* @param obj
*/
function unwrapDbusVariantArray(obj) {
return obj.map(unwrapDbusVariant);
}
exports.unwrapDbusVariantArray = unwrapDbusVariantArray;
/** This unwraps anything */
function unwrapDbusVariantAll(obj) {
if (typeof obj !== "object" || obj === null)
return obj;
if (obj.constructor === DBus.Variant)
return unwrapDbusVariant(obj);
if (Array.isArray(obj)) {
return obj.map(unwrapDbusVariantAll);
}
// otherwise its an object
const res = Object.assign({}, obj); // clone object structure
for (const key in obj) {
res[key] = unwrapDbusVariantAll(obj[key]);
}
return res;
}
exports.unwrapDbusVariantAll = unwrapDbusVariantAll;
function unwrapDbusSignature(type) {
if (type.includes("v"))
return unwrapDbusVariantAll;
if (type === "ay") {
return function (obj) {
return Buffer.from(obj);
};
}
if (type.includes("ay")) {
// TODO: directly extract Buffer at index
return unwrapDbusVariantAll;
}
return function (obj) {
return obj;
};
}
exports.unwrapDbusSignature = unwrapDbusSignature;
exports.TypedEmitter = events_1.EventEmitter;
exports.LooselyTypedEmitter = events_1.EventEmitter;
//# sourceMappingURL=utilts.js.map