@arifwidianto/rpc-agent
Version:
RPC Agent for both client and server, extends more methods easily
125 lines • 6.42 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.loadExtensions = void 0;
const node_fs_1 = __importStar(require("node:fs"));
const path = __importStar(require("node:path"));
const logger_1 = require("./logger");
async function loadExtensions(extensionPath = undefined) {
const extensions = new Map();
const isUserDevelopment = process.argv.some((arg) => arg.includes("ts-node"));
const isDevelopment = __filename.endsWith(".ts");
const extensionsDirBase = path.join(__dirname, "../../", isDevelopment ? "src" : "dist", "rpcs");
const extensionsDirUser = extensionPath ? path.join(process.cwd(), extensionPath || "rpcs") : undefined;
logger_1.logger.debug(`Loading extensions from ${extensionsDirBase}`, { isDevelopment });
logger_1.logger.debug(`Loading extensions from ${extensionsDirUser}`, { isDevelopment });
try {
const entriesBase = await node_fs_1.promises.readdir(extensionsDirBase, { withFileTypes: true });
const entriesUser = extensionsDirUser ? await node_fs_1.promises.readdir(extensionsDirUser, { withFileTypes: true }) : [];
const entries = [...entriesBase, ...entriesUser];
for (const entry of entries) {
if (!entry.isDirectory())
continue;
const extensionPath = entriesBase.find((e) => e.name === entry.name)?.name
? path.join(extensionsDirBase, entry.name)
: extensionsDirUser
? path.join(extensionsDirUser, entry.name)
: undefined;
const baseFileExtension = isDevelopment ? ".ts" : ".js";
const userFileExtension = isUserDevelopment ? ".ts" : ".js";
const baseIndexFile = path.join(extensionPath || `${__dirname}/../../`, `index${baseFileExtension}`);
const userIndexFile = extensionsDirUser
? path.join(extensionPath?.includes(extensionsDirUser)
? extensionPath
: path.resolve(process.cwd(), extensionsDirUser || ""), `index${userFileExtension}`)
: undefined;
const indexFile = entriesBase.find((e) => e.name === entry.name)?.name ? baseIndexFile : userIndexFile;
logger_1.logger.debug(`Checking extension file: ${indexFile}`);
if (!indexFile || !node_fs_1.default.existsSync(indexFile)) {
logger_1.logger.warning(`No index file found in extension: ${entry.name}`);
continue;
}
try {
await node_fs_1.promises.access(indexFile);
let ExtensionModule;
try {
ExtensionModule = await Promise.resolve(`${indexFile}`).then(s => __importStar(require(s)));
}
catch (importError) {
logger_1.logger.error(`Failed to import extension ${entry.name}:`, {
error: importError instanceof Error ? importError.message : String(importError),
stack: importError instanceof Error ? importError.stack : undefined,
path: indexFile,
});
continue;
}
const ExtensionClass = ExtensionModule.default;
if (!ExtensionClass) {
logger_1.logger.warning(`No default export found in extension: ${entry.name}`);
continue;
}
let extension;
try {
extension = new ExtensionClass();
}
catch (constructError) {
logger_1.logger.error(`Failed to instantiate extension ${entry.name}:`, {
error: constructError instanceof Error ? constructError.message : String(constructError),
stack: constructError instanceof Error ? constructError.stack : undefined,
});
continue;
}
if (!extension.name || !extension.methods) {
logger_1.logger.warning(`Invalid extension format: ${entry.name}`);
continue;
}
if (typeof extension.methods !== "object") {
logger_1.logger.warning(`Invalid methods format in extension: ${entry.name}`);
continue;
}
logger_1.logger.info(`Successfully loaded extension: ${entry.name}`);
extensions.set(entry.name, extension);
}
catch (error) {
logger_1.logger.error(`Failed to load extension ${entry.name}:`, {
error: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined,
path: indexFile,
});
}
}
return extensions;
}
catch (error) {
logger_1.logger.error("Failed to read extensions directory:", {
error: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined,
paths: { base: extensionsDirBase, user: extensionsDirUser },
});
return new Map();
}
}
exports.loadExtensions = loadExtensions;
//# sourceMappingURL=extension-loader.js.map