From bd06fad8f50033b18ed10694f1a623b6ca08915f Mon Sep 17 00:00:00 2001 From: Flussen Date: Thu, 9 Apr 2026 22:35:45 +0200 Subject: [PATCH 1/2] feat: add viewId filtering support to OnView decorator and introduce createWebView helper --- src/runtime/client/decorators/onView.ts | 23 +++++++++++++++++-- .../system/processors/view.processor.ts | 7 ++++-- src/runtime/client/webview-bridge.ts | 7 ++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/runtime/client/decorators/onView.ts b/src/runtime/client/decorators/onView.ts index bc2d921..42892f9 100644 --- a/src/runtime/client/decorators/onView.ts +++ b/src/runtime/client/decorators/onView.ts @@ -1,5 +1,9 @@ import { METADATA_KEYS } from '../system/metadata-client.keys' +export interface OnViewOptions { + viewId?: string +} + /** * Registers a method as a WebView callback handler. * @@ -7,7 +11,12 @@ import { METADATA_KEYS } from '../system/metadata-client.keys' * This decorator only stores metadata. During bootstrap, the framework binds the decorated method * to the active WebView runtime callback. * + * If `options.viewId` is provided, the handler will only receive messages from the + * specified WebView viewId. Without it, the handler receives events from all views. + * * @param eventName - Callback name. + * @param options - Optional configuration. Pass `{ viewId: 'my-view' }` to + * filter incoming messages by viewId. * * @example * ```ts @@ -17,11 +26,21 @@ import { METADATA_KEYS } from '../system/metadata-client.keys' * saveSettings(payload: unknown) { * // ... * } + * + * @Client.onView('system-ui:ready', { viewId: 'system-ui' }) + * onSystemUiReady() { + * // Only fires for the 'system-ui' WebView + * } * } * ``` */ -export function OnView(eventName: string) { +export function OnView(eventName: string, options?: OnViewOptions) { return (target: any, propertyKey: string) => { - Reflect.defineMetadata(METADATA_KEYS.VIEW, { eventName }, target, propertyKey) + Reflect.defineMetadata( + METADATA_KEYS.VIEW, + { eventName, viewId: options?.viewId }, + target, + propertyKey, + ) } } diff --git a/src/runtime/client/system/processors/view.processor.ts b/src/runtime/client/system/processors/view.processor.ts index 9a025ac..c097870 100644 --- a/src/runtime/client/system/processors/view.processor.ts +++ b/src/runtime/client/system/processors/view.processor.ts @@ -10,12 +10,13 @@ export class ViewProcessor implements DecoratorProcessor { constructor(@inject(WebViewService as any) private readonly webviews: WebViewService) {} - process(target: any, methodName: string, metadata: { eventName: string }) { + process(target: any, methodName: string, metadata: { eventName: string; viewId?: string }) { const handler = target[methodName].bind(target) const handlerName = `${target.constructor.name}.${methodName}` this.webviews.onMessage(async (message) => { if (message.event !== metadata.eventName) return + if (metadata.viewId && message.viewId !== metadata.viewId) return try { await handler(message.payload) } catch (error) { @@ -30,6 +31,8 @@ export class ViewProcessor implements DecoratorProcessor { } }) - loggers.webView.debug(`Registered WebView callback: ${metadata.eventName} -> ${handlerName}`) + loggers.webView.debug( + `Registered WebView callback: ${metadata.eventName}${metadata.viewId ? ` [viewId=${metadata.viewId}]` : ''} -> ${handlerName}`, + ) } } diff --git a/src/runtime/client/webview-bridge.ts b/src/runtime/client/webview-bridge.ts index 83e521c..bb9779c 100644 --- a/src/runtime/client/webview-bridge.ts +++ b/src/runtime/client/webview-bridge.ts @@ -117,3 +117,10 @@ function resolveWebViewService(): WebViewService { export const WebView = new WebViewBridge(resolveWebViewService) export const NUI = WebView + +export function createWebView< + TSend extends Record = Record, + TReceive extends Record = Record, +>(viewId: string): WebViewBridge { + return new WebViewBridge(resolveWebViewService, viewId) +} From 7aa473aeb26d434a85ac51ece8f0c1731618228a Mon Sep 17 00:00:00 2001 From: Flussen Date: Thu, 9 Apr 2026 23:42:19 +0200 Subject: [PATCH 2/2] bump: version 1.0.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df8bd4e..ae7fba0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@open-core/framework", - "version": "1.0.10", + "version": "1.0.11", "description": "Secure, event-driven TypeScript Framework & Runtime engine for CitizenFX (Cfx).", "main": "dist/index.js", "types": "dist/index.d.ts",