aboutsummaryrefslogtreecommitdiff
path: root/ext/js/templates/sandbox/template-renderer-frame-api.js
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2023-12-22 20:27:10 -0500
committerGitHub <noreply@github.com>2023-12-23 01:27:10 +0000
commita72b53de011d35602c0f68577c30e28386046583 (patch)
tree0fd3f2e38b36b81c773bd518c99ce5f01cae32eb /ext/js/templates/sandbox/template-renderer-frame-api.js
parentcb4499fd8ab0322fa3ab706adfb46caf21c57eec (diff)
Type safety for TemplateRendererProxy (#428)
* Type safety for TemplateRendererProxy * Simplify
Diffstat (limited to 'ext/js/templates/sandbox/template-renderer-frame-api.js')
-rw-r--r--ext/js/templates/sandbox/template-renderer-frame-api.js51
1 files changed, 15 insertions, 36 deletions
diff --git a/ext/js/templates/sandbox/template-renderer-frame-api.js b/ext/js/templates/sandbox/template-renderer-frame-api.js
index 56cedb97..28303e51 100644
--- a/ext/js/templates/sandbox/template-renderer-frame-api.js
+++ b/ext/js/templates/sandbox/template-renderer-frame-api.js
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-import {ExtensionError} from '../../core/extension-error.js';
+import {createApiMap, invokeApiMapHandler} from '../../core/api-map.js';
import {parseJson} from '../../core/json.js';
export class TemplateRendererFrameApi {
@@ -26,12 +26,12 @@ export class TemplateRendererFrameApi {
constructor(templateRenderer) {
/** @type {import('./template-renderer.js').TemplateRenderer} */
this._templateRenderer = templateRenderer;
- /** @type {import('core').MessageHandlerMap} */
- this._windowMessageHandlers = new Map(/** @type {import('core').MessageHandlerMapInit} */ ([
+ /** @type {import('template-renderer-proxy').FrontendApiMap} */
+ this._windowMessageHandlers = createApiMap([
['render', this._onRender.bind(this)],
['renderMulti', this._onRenderMulti.bind(this)],
['getModifiedData', this._onGetModifiedData.bind(this)]
- ]));
+ ]);
}
/**
@@ -39,43 +39,19 @@ export class TemplateRendererFrameApi {
*/
prepare() {
window.addEventListener('message', this._onWindowMessage.bind(this), false);
- this._postMessage(window.parent, 'ready', {}, null);
+ this._postMessage(window.parent, 'ready', void 0, null);
}
// Private
/**
- * @param {MessageEvent<import('template-renderer-frame-api').MessageData>} e
+ * @param {MessageEvent<import('template-renderer-proxy').FrontendMessageAny>} e
*/
_onWindowMessage(e) {
const {source, data: {action, params, id}} = e;
- const messageHandler = this._windowMessageHandlers.get(action);
- if (typeof messageHandler === 'undefined') { return; }
-
- this._onWindowMessageInner(messageHandler, action, params, /** @type {Window} */ (source), id);
- }
-
- /**
- * @param {import('core').MessageHandler} handler
- * @param {string} action
- * @param {import('core').SerializableObject} params
- * @param {Window} source
- * @param {?string} id
- */
- async _onWindowMessageInner(handler, action, params, source, id) {
- let response;
- try {
- let result = handler(params);
- if (result instanceof Promise) {
- result = await result;
- }
- response = {result};
- } catch (error) {
- response = {error: ExtensionError.serialize(error)};
- }
-
- if (typeof id === 'undefined') { return; }
- this._postMessage(source, `${action}.response`, response, id);
+ invokeApiMapHandler(this._windowMessageHandlers, action, params, [], (response) => {
+ this._postMessage(/** @type {Window} */ (source), 'response', response, id);
+ });
}
/**
@@ -113,12 +89,15 @@ export class TemplateRendererFrameApi {
}
/**
+ * @template {import('template-renderer-proxy').BackendApiNames} TName
* @param {Window} target
- * @param {string} action
- * @param {import('core').SerializableObject} params
+ * @param {TName} action
+ * @param {import('template-renderer-proxy').BackendApiParams<TName>} params
* @param {?string} id
*/
_postMessage(target, action, params, id) {
- target.postMessage(/** @type {import('template-renderer-frame-api').MessageData} */ ({action, params, id}), '*');
+ /** @type {import('template-renderer-proxy').BackendMessageAny} */
+ const data = {action, params, id};
+ target.postMessage(data, '*');
}
}