103 lines
2.2 KiB
JavaScript
Executable File
103 lines
2.2 KiB
JavaScript
Executable File
// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect
|
|
//
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
import * as atspi from './atspi.js';
|
|
import * as clipboard from './clipboard.js';
|
|
import * as contacts from './contacts.js';
|
|
import * as input from './input.js';
|
|
import * as mpris from './mpris.js';
|
|
import * as notification from './notification.js';
|
|
import * as pulseaudio from './pulseaudio.js';
|
|
import * as session from './session.js';
|
|
import * as sound from './sound.js';
|
|
import * as upower from './upower.js';
|
|
import * as ydotool from './ydotool.js';
|
|
|
|
export const functionOverrides = {};
|
|
|
|
const components = {
|
|
atspi,
|
|
clipboard,
|
|
contacts,
|
|
input,
|
|
mpris,
|
|
notification,
|
|
pulseaudio,
|
|
session,
|
|
sound,
|
|
upower,
|
|
ydotool,
|
|
};
|
|
|
|
/*
|
|
* Singleton Tracker
|
|
*/
|
|
const Default = new Map();
|
|
|
|
|
|
/**
|
|
* Acquire a reference to a component. Calls to this function should always be
|
|
* followed by a call to `release()`.
|
|
*
|
|
* @param {string} name - The module name
|
|
* @return {*} The default instance of a component
|
|
*/
|
|
export function acquire(name) {
|
|
if (functionOverrides.acquire)
|
|
return functionOverrides.acquire(name);
|
|
|
|
let component;
|
|
|
|
try {
|
|
let info = Default.get(name);
|
|
|
|
if (info === undefined) {
|
|
const module = components[name];
|
|
|
|
info = {
|
|
instance: new module.default(),
|
|
refcount: 0,
|
|
};
|
|
|
|
Default.set(name, info);
|
|
}
|
|
|
|
info.refcount++;
|
|
component = info.instance;
|
|
} catch (e) {
|
|
debug(e, name);
|
|
}
|
|
|
|
return component;
|
|
}
|
|
|
|
|
|
/**
|
|
* Release a reference on a component. If the caller was the last reference
|
|
* holder, the component will be freed.
|
|
*
|
|
* @param {string} name - The module name
|
|
* @return {null} A %null value, useful for overriding a traced variable
|
|
*/
|
|
export function release(name) {
|
|
if (functionOverrides.release)
|
|
return functionOverrides.release(name);
|
|
|
|
try {
|
|
const info = Default.get(name);
|
|
|
|
if (info.refcount === 1) {
|
|
info.instance.destroy();
|
|
Default.delete(name);
|
|
}
|
|
|
|
info.refcount--;
|
|
} catch (e) {
|
|
debug(e, name);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|