103 lines
2.2 KiB
JavaScript
Raw Normal View History

2024-07-08 22:46:35 +02:00
// 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;
}