z-ipc
Version:
Z-IPC is an easy-to-use, extensible and fully type-safe IPC solution for JavaScript environments.
192 lines (184 loc) • 4.87 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
RpcError: () => RpcError,
createClient: () => createClient,
createErrorResponse: () => createErrorResponse,
createOkResponse: () => createOkResponse,
createServer: () => createServer,
defineAdapter: () => defineAdapter,
defineEvent: () => defineEvent,
defineMethod: () => defineMethod
});
module.exports = __toCommonJS(index_exports);
// src/core/adapter.ts
function defineAdapter(adapter) {
return adapter;
}
// src/core/rpc-error.ts
var RpcError = class extends Error {
constructor(message, remoteStack) {
super(message);
this.remoteStack = remoteStack;
}
};
// src/core/client.ts
function createClient(adapter) {
const eventListeners = /* @__PURE__ */ new Map();
adapter.subscribe((message) => {
if (message.kind !== "event") return;
const listeners = eventListeners.get(message.name);
if (!listeners) return;
for (const listener of listeners) {
listener(message.payload);
}
});
return {
protocol: void 0,
call: (method, ...args) => {
const id = Math.random();
return new Promise((resolve, reject) => {
const responseListener = (response) => {
if (response.kind !== "rpc-response") return;
if (response.id !== id) return;
adapter.unsubscribe(responseListener);
if (response.result.error) {
reject(
new RpcError(
response.result.message,
response.result.stack
)
);
} else {
resolve(response.result.value);
}
};
adapter.subscribe(responseListener);
adapter.publish({
kind: "rpc-request",
id,
method,
args
});
});
},
subscribe: (event, listener) => {
if (!eventListeners.has(event)) {
eventListeners.set(event, /* @__PURE__ */ new Set());
}
const listeners = eventListeners.get(event);
listeners.add(listener);
},
unsubscribe: (event, listener) => {
if (!eventListeners.has(event)) {
return;
}
const listeners = eventListeners.get(event);
listeners.delete(listener);
if (listeners.size === 0) {
eventListeners.delete(event);
}
}
};
}
// src/core/message.ts
function createOkResponse(id, value) {
return {
kind: "rpc-response",
id,
result: {
error: false,
value
}
};
}
function createErrorResponse(id, error) {
return {
kind: "rpc-response",
id,
result: {
error: true,
message: error.message,
stack: error.stack ?? "???"
}
};
}
// src/core/protocol.ts
function defineMethod(handler) {
return {
kind: "method",
handler
};
}
function defineEvent() {
return {
kind: "event"
};
}
// src/core/server.ts
function createServer(adapter, protocol) {
adapter.subscribe(async (message) => {
if (message.kind !== "rpc-request") {
return;
}
const method = protocol[message.method];
if (!method || method.kind !== "method") {
adapter.publish(
createErrorResponse(message.id, new TypeError("Unknown method"))
);
return;
}
try {
const result = await method.handler(...message.args);
adapter.publish(createOkResponse(message.id, result));
} catch (error) {
console.error(error);
if (error instanceof Error) {
adapter.publish(createErrorResponse(message.id, error));
} else {
adapter.publish(
createErrorResponse(message.id, new Error("Unknown error"))
);
}
}
});
return {
protocol,
emit: (event, payload) => {
adapter.publish({
kind: "event",
name: event,
payload
});
}
};
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
RpcError,
createClient,
createErrorResponse,
createOkResponse,
createServer,
defineAdapter,
defineEvent,
defineMethod
});