vscode-message-management
Version:
A message management library that supports getting response values
73 lines • 2.43 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Messenger = void 0;
const lodash_1 = require("lodash");
class Messenger {
constructor(options = {}) {
this.eventListeners = {};
this.cachedRequests = [];
this.pendingRequests = {};
this.sid = 0;
const defaultOptions = {
cacheRequestIfWebviewIsUnbind: true,
};
this.options = { ...defaultOptions, ...options };
}
bindWebview(webview) {
this.webview = webview;
this.listenMessage();
if (!(0, lodash_1.isEmpty)(this.cachedRequests)) {
this.cachedRequests.forEach((work) => work(webview));
this.cachedRequests = [];
}
}
listenMessage() {
this.webview?.onDidReceiveMessage(async ({ sid, event, data }) => {
if (!sid)
return;
// request from webview
if (event) {
const listener = this.eventListeners[event];
if (!listener)
return;
const response = await listener(data);
const responseMessage = { sid, data: response };
this.webview?.postMessage(responseMessage);
return;
}
// response from webview
const pendingRequest = this.pendingRequests[sid];
if (!pendingRequest)
return;
pendingRequest(data);
});
}
getSid() {
return `${this.sid++}`;
}
async request(event, data) {
return new Promise((resolve, reject) => {
const sid = this.getSid();
const message = { sid, event, data };
this.pendingRequests[sid] = resolve;
const requestWork = (webview) => {
webview.postMessage(message);
if (this.options.timeout) {
setTimeout(() => reject("timeout"), this.options.timeout);
}
};
if (this.webview) {
requestWork(this.webview);
return;
}
if (this.options.cacheRequestIfWebviewIsUnbind) {
this.cachedRequests.push(requestWork);
}
});
}
bind(event, callback) {
this.eventListeners[event] = callback;
}
}
exports.Messenger = Messenger;
//# sourceMappingURL=extension.js.map