UNPKG

vscode-message-management

Version:

A message management library that supports getting response values

73 lines 2.43 kB
"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