diff --git a/.changeset/twenty-suits-teach.md b/.changeset/twenty-suits-teach.md new file mode 100644 index 0000000000..ac3c5d3f92 --- /dev/null +++ b/.changeset/twenty-suits-teach.md @@ -0,0 +1,10 @@ +--- +"@lynx-js/web-core": minor +--- + +feat: upgrade @lynx-js/lynx-core to 0.1.2 + +refactor some internal logic + +- __OnLifeCycleEvent +- __OnNativeAppReady diff --git a/packages/web-platform/web-constants/src/endpoints.ts b/packages/web-platform/web-constants/src/endpoints.ts index 22b95327ed..b065bd4889 100644 --- a/packages/web-platform/web-constants/src/endpoints.ts +++ b/packages/web-platform/web-constants/src/endpoints.ts @@ -9,7 +9,6 @@ import type { } from './types/EventType.js'; import type { Cloneable, CloneableObject } from './types/Cloneable.js'; import type { MainThreadStartConfigs } from './types/MainThreadStartConfigs.js'; -import type { LynxLifecycleEvent } from './types/LynxLifecycleEvent.js'; import type { IdentifierType, InvokeCallbackRes } from './types/NativeApp.js'; import type { LynxTemplate } from './types/LynxModule.js'; import type { NapiModulesMap } from './types/NapiModules.js'; @@ -74,21 +73,6 @@ export const disposeEndpoint = createRpcEndpoint< void >('dispose', false, true); -export const uiThreadFpReadyEndpoint = createRpcEndpoint<[], void>( - 'uiThreadFpReady', - false, - false, -); - -export const onLifecycleEventEndpoint = createRpcEndpoint< - [LynxLifecycleEvent], - void ->( - '__OnLifecycleEvent', - false, - false, -); - export const BackgroundThreadStartEndpoint = createRpcEndpoint<[ { initData: unknown; @@ -116,11 +100,6 @@ export const flushElementTreeEndpoint = createRpcEndpoint< void >('flushElementTree', false, true); -export const mainThreadChunkReadyEndpoint = createRpcEndpoint< - [], - void ->('mainThreadChunkReady', false, false); - export const callLepusMethodEndpoint = createRpcEndpoint< [name: string, data: unknown], void @@ -215,3 +194,10 @@ export const dispatchNapiModuleEndpoint = createRpcEndpoint< [data: Cloneable], void >('dispatchNapiModule', false, false); +export const dispatchCoreContextEventEndpoint = createRpcEndpoint< + [ + eventType: string, + data: Cloneable | undefined | null, + ], + void +>('dispatchCoreContextEventEndpoint', false, false); diff --git a/packages/web-platform/web-constants/src/types/Cloneable.ts b/packages/web-platform/web-constants/src/types/Cloneable.ts index 1cb0b9019a..3f06bcb3aa 100644 --- a/packages/web-platform/web-constants/src/types/Cloneable.ts +++ b/packages/web-platform/web-constants/src/types/Cloneable.ts @@ -3,7 +3,8 @@ // LICENSE file in the root directory of this source tree. export type Cloneable = | T - | Record; + | Record + | T[]; export type CloneableObject = Record< string, diff --git a/packages/web-platform/web-constants/src/types/LynxContextEventTarget.ts b/packages/web-platform/web-constants/src/types/LynxContextEventTarget.ts new file mode 100644 index 0000000000..debd5cc57f --- /dev/null +++ b/packages/web-platform/web-constants/src/types/LynxContextEventTarget.ts @@ -0,0 +1,31 @@ +export const DispatchEventResult = { + // Event was not canceled by event handler or default event handler. + NotCanceled: 0, + // Event was canceled by event handler; i.e. a script handler calling + // preventDefault. + CanceledByEventHandler: 1, + // Event was canceled by the default event handler; i.e. executing the default + // action. This result should be used sparingly as it deviates from the DOM + // Event Dispatch model. Default event handlers really shouldn't be invoked + // inside of dispatch. + CanceledByDefaultEventHandler: 2, + // Event was canceled but suppressed before dispatched to event handler. This + // result should be used sparingly; and its usage likely indicates there is + // potential for a bug. Trusted events may return this code; but untrusted + // events likely should always execute the event handler the developer intends + // to execute. + CanceledBeforeDispatch: 3, +} as const; +export interface LynxContextEventTarget { + onTriggerEvent?: (event: MessageEvent) => void; + + postMessage(message: any): void; + dispatchEvent( + event: MessageEvent, + ): typeof DispatchEventResult[keyof typeof DispatchEventResult]; + addEventListener(type: string, listener: (event: MessageEvent) => void): void; + removeEventListener( + type: string, + listener: (event: MessageEvent) => void, + ): void; +} diff --git a/packages/web-platform/web-constants/src/types/LynxLifecycleEvent.ts b/packages/web-platform/web-constants/src/types/LynxLifecycleEvent.ts deleted file mode 100644 index 63cd325695..0000000000 --- a/packages/web-platform/web-constants/src/types/LynxLifecycleEvent.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -export type LynxLifecycleEvent = [eventName: string, params: unknown]; diff --git a/packages/web-platform/web-constants/src/types/NativeApp.ts b/packages/web-platform/web-constants/src/types/NativeApp.ts index 70bfa0f564..84ca9b25d5 100644 --- a/packages/web-platform/web-constants/src/types/NativeApp.ts +++ b/packages/web-platform/web-constants/src/types/NativeApp.ts @@ -2,6 +2,7 @@ // Licensed under the Apache License Version 2.0 that can be found in the import type { CloneableObject } from './Cloneable.js'; +import type { LynxContextEventTarget } from './LynxContextEventTarget.js'; import type { PerformancePipelineOptions } from './Performance.js'; // LICENSE file in the root directory of this source tree. @@ -39,8 +40,17 @@ export interface EventEmitter { toggle(eventName: string, ...data: unknown[]): void; } +export type NativeLynx = { + __globalProps: CloneableObject; + getJSModule(_moduleName: string): unknown; + getNativeApp(): NativeApp; + getCoreContext(): LynxContextEventTarget; + getCustomSectionSync(key: string): CloneableObject; + getCustomSection(key: string): Promise; +}; + export type NativeTTObject = { - lynx: unknown; + lynx: NativeLynx; OnLifecycleEvent: (...args: unknown[]) => void; publicComponentEvent( componentId: string, @@ -90,35 +100,6 @@ export interface InvokeCallbackRes { data?: string; } -export enum DispatchEventResult { - // Event was not canceled by event handler or default event handler. - NotCanceled = 0, - // Event was canceled by event handler; i.e. a script handler calling - // preventDefault. - CanceledByEventHandler, - // Event was canceled by the default event handler; i.e. executing the default - // action. This result should be used sparingly as it deviates from the DOM - // Event Dispatch model. Default event handlers really shouldn't be invoked - // inside of dispatch. - CanceledByDefaultEventHandler, - // Event was canceled but suppressed before dispatched to event handler. This - // result should be used sparingly; and its usage likely indicates there is - // potential for a bug. Trusted events may return this code; but untrusted - // events likely should always execute the event handler the developer intends - // to execute. - CanceledBeforeDispatch, -} -export interface ContextProxy { - onTriggerEvent?: (event: MessageEvent) => void; - - postMessage(message: any): void; - dispatchEvent(event: MessageEvent): DispatchEventResult; - addEventListener(type: string, listener: (event: MessageEvent) => void): void; - removeEventListener( - type: string, - listener: (event: MessageEvent) => void, - ): void; -} export interface NativeApp { id: string; @@ -178,6 +159,16 @@ export interface NativeApp { timing_flag: string, ) => void; + /** + * Support from Lynx 3.0 + */ + profileStart: (traceName: string, option?: unknown) => void; + + /** + * Support from Lynx 3.0 + */ + profileEnd: () => void; + triggerComponentEvent(id: string, params: { eventDetail: CloneableObject; eventOption: CloneableObject; diff --git a/packages/web-platform/web-constants/src/types/index.ts b/packages/web-platform/web-constants/src/types/index.ts index 09f8b12d88..2e2e3e8302 100644 --- a/packages/web-platform/web-constants/src/types/index.ts +++ b/packages/web-platform/web-constants/src/types/index.ts @@ -3,7 +3,6 @@ export * from './EventType.js'; export * from './PageConfig.js'; export * from './Cloneable.js'; export * from './LynxModule.js'; -export * from './LynxLifecycleEvent.js'; export * from './ProcessDataCallback.js'; export * from './Performance.js'; export * from './MainThreadStartConfigs.js'; @@ -12,3 +11,4 @@ export * from './UpdateDataOptions.js'; export * from './NativeModules.js'; export * from './NapiModules.js'; export * from './FlushElementTreeOptions.js'; +export * from './LynxContextEventTarget.js'; diff --git a/packages/web-platform/web-core/package.json b/packages/web-platform/web-core/package.json index 23254f97d1..7b594571a7 100644 --- a/packages/web-platform/web-core/package.json +++ b/packages/web-platform/web-core/package.json @@ -30,11 +30,11 @@ "@lynx-js/web-worker-runtime": "workspace:*" }, "devDependencies": { - "@lynx-js/lynx-core": "0.1.0", + "@lynx-js/lynx-core": "0.1.2", "@lynx-js/web-elements": "workspace:*" }, "peerDependencies": { - "@lynx-js/lynx-core": "0.1.0", + "@lynx-js/lynx-core": "0.1.2", "@lynx-js/web-elements": ">=0.3.1" } } diff --git a/packages/web-platform/web-core/src/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.ts b/packages/web-platform/web-core/src/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.ts index 373d70fc4a..4981d7f1c0 100644 --- a/packages/web-platform/web-core/src/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.ts +++ b/packages/web-platform/web-core/src/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.ts @@ -13,9 +13,6 @@ export function registerFlushElementTreeHandler( options: { shadowRoot: ShadowRoot; }, - onCommit: (info: { - isFP: boolean; - }) => void, ) { const { shadowRoot, @@ -25,17 +22,10 @@ export function registerFlushElementTreeHandler( shadowRoot, onEvent, }); - let isFP = true; mainThreadRpc.registerHandler( flushElementTreeEndpoint, (operations) => { decodeOperation(operations); - onCommit({ - isFP, - }); - if (isFP) { - isFP = false; - } }, ); } diff --git a/packages/web-platform/web-core/src/uiThread/startUIThread.ts b/packages/web-platform/web-core/src/uiThread/startUIThread.ts index f37803bbc0..ebd6c782f5 100644 --- a/packages/web-platform/web-core/src/uiThread/startUIThread.ts +++ b/packages/web-platform/web-core/src/uiThread/startUIThread.ts @@ -13,11 +13,9 @@ import { createDispose } from './crossThreadHandlers/createDispose.js'; import { registerTriggerComponentEventHandler } from './crossThreadHandlers/registerTriggerComponentEventHandler.js'; import { registerSelectComponentHandler } from './crossThreadHandlers/registerSelectComponentHandler.js'; import { - mainThreadChunkReadyEndpoint, mainThreadStartEndpoint, markTimingEndpoint, sendGlobalEventEndpoint, - uiThreadFpReadyEndpoint, type MainThreadStartConfigs, type NapiModulesCall, type NativeModulesCall, @@ -45,7 +43,6 @@ export function startUIThread( terminateWorkers, } = bootWorkers(); const sendGlobalEvent = backgroundRpc.createCall(sendGlobalEventEndpoint); - const uiThreadFpReady = backgroundRpc.createCall(uiThreadFpReadyEndpoint); const mainThreadStart = mainThreadRpc.createCall(mainThreadStartEndpoint); const markTiming = backgroundRpc.createCall(markTimingEndpoint); const markTimingInternal = ( @@ -72,39 +69,28 @@ export function startUIThread( callbacks.onError, ); registerDispatchLynxViewEventHandler(backgroundRpc, shadowRoot); - mainThreadRpc.registerHandler( - mainThreadChunkReadyEndpoint, - () => { - registerFlushElementTreeHandler( - mainThreadRpc, - { - shadowRoot, - }, - (info) => { - const { isFP } = info; - if (isFP) { - registerInvokeUIMethodHandler( - backgroundRpc, - shadowRoot, - ); - registerNativePropsHandler( - backgroundRpc, - shadowRoot, - ); - registerTriggerComponentEventHandler( - backgroundRpc, - shadowRoot, - ); - registerSelectComponentHandler( - backgroundRpc, - shadowRoot, - ); - uiThreadFpReady(); - } - }, - ); + registerFlushElementTreeHandler( + mainThreadRpc, + { + shadowRoot, }, ); + registerInvokeUIMethodHandler( + backgroundRpc, + shadowRoot, + ); + registerNativePropsHandler( + backgroundRpc, + shadowRoot, + ); + registerTriggerComponentEventHandler( + backgroundRpc, + shadowRoot, + ); + registerSelectComponentHandler( + backgroundRpc, + shadowRoot, + ); registerNativeModulesCallHandler( backgroundRpc, callbacks.nativeModulesCall, diff --git a/packages/web-platform/web-explorer/package.json b/packages/web-platform/web-explorer/package.json index 8f8401a711..dae293e918 100644 --- a/packages/web-platform/web-explorer/package.json +++ b/packages/web-platform/web-explorer/package.json @@ -27,7 +27,7 @@ }, "devDependencies": { "@codecov/webpack-plugin": "^1.9.0", - "@lynx-js/lynx-core": "0.1.0", + "@lynx-js/lynx-core": "0.1.2", "@lynx-js/web-core": "workspace:*", "@lynx-js/web-elements": "workspace:*", "@rsbuild/core": "catalog:rsbuild", diff --git a/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts b/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts index 5a480c96a9..c49344ddcd 100644 --- a/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts +++ b/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts @@ -15,7 +15,6 @@ import { type publishEventEndpoint, type publicComponentEventEndpoint, type reportErrorEndpoint, - type onLifecycleEventEndpoint, type RpcCallType, type postExposureEndpoint, } from '@lynx-js/web-constants'; @@ -42,7 +41,7 @@ export interface MainThreadRuntimeCallbacks { timingFlags: string[], ) => void; _ReportError: RpcCallType; - __OnLifecycleEvent: RpcCallType; + __OnLifecycleEvent: (lifeCycleEvent: Cloneable) => void; markTiming: (pipelineId: string, timingKey: string) => void; publishEvent: RpcCallType; publicComponentEvent: RpcCallType; @@ -215,7 +214,7 @@ export class MainThreadRuntime { _ReportError: RpcCallType; - __OnLifecycleEvent: RpcCallType; + __OnLifecycleEvent: (lifeCycleEvent: Cloneable) => void; __LoadLepusChunk: (path: string) => boolean = (path) => { try { diff --git a/packages/web-platform/web-tests/package.json b/packages/web-platform/web-tests/package.json index c2ab43da9f..b8ec0ce254 100644 --- a/packages/web-platform/web-tests/package.json +++ b/packages/web-platform/web-tests/package.json @@ -21,7 +21,7 @@ "test:update": "playwright test --ui --update-snapshots" }, "devDependencies": { - "@lynx-js/lynx-core": "0.1.0", + "@lynx-js/lynx-core": "0.1.2", "@lynx-js/offscreen-document": "workspace:*", "@lynx-js/react": "workspace:*", "@lynx-js/react-rsbuild-plugin": "workspace:*", diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts index 12126096a0..e15d8a910b 100644 --- a/packages/web-platform/web-tests/tests/react.spec.ts +++ b/packages/web-platform/web-tests/tests/react.spec.ts @@ -455,18 +455,6 @@ test.describe('reactlynx3 tests', () => { await expect(successCallback).toBe(true); }); - test('api-onNativeAppReady', async ({ page }, { title }) => { - const messages: string[] = []; - await page.on('console', async (message) => { - for (const arg of message.args()) { - messages.push(JSON.stringify(await arg.jsonValue())); - } - }); - await goto(page, title); - await wait(500); - expect(messages.join(',')).toContain('uiThreadFpReady'); - }); - test('basic-at-rule-animation', async ({ page }, { title }) => { await goto(page, title); const target = page.locator('#target'); diff --git a/packages/web-platform/web-tests/tests/react/api-onNativeAppReady/index.jsx b/packages/web-platform/web-tests/tests/react/api-onNativeAppReady/index.jsx deleted file mode 100644 index 446a3b0070..0000000000 --- a/packages/web-platform/web-tests/tests/react/api-onNativeAppReady/index.jsx +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import { root } from '@lynx-js/react'; - -function App() { - return ( - - ); -} - -root.render(); diff --git a/packages/web-platform/web-tests/tests/react/config-splitchunk-single-vendor/rspeedy.config.ts b/packages/web-platform/web-tests/tests/react/config-splitchunk-single-vendor/rspeedy.config.ts index 421d2b99db..b795df87a6 100644 --- a/packages/web-platform/web-tests/tests/react/config-splitchunk-single-vendor/rspeedy.config.ts +++ b/packages/web-platform/web-tests/tests/react/config-splitchunk-single-vendor/rspeedy.config.ts @@ -10,7 +10,7 @@ const __dirname = path.dirname(__filename); const caseName = path.basename(__dirname); const root = path.join(__dirname, '..', '..', '..', 'dist', caseName); -const commonConfigResult = commonConfig(); +const commonConfigResult = commonConfig({ firstScreenSyncTiming: 'jsReady' }); commonConfigResult.output!.distPath = { root }; commonConfigResult.output!.assetPrefix += `/${caseName}`; export default defineConfig({ diff --git a/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-experience/rspeedy.config.ts b/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-experience/rspeedy.config.ts index c3ffda250a..4fad0ff755 100644 --- a/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-experience/rspeedy.config.ts +++ b/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-experience/rspeedy.config.ts @@ -10,7 +10,7 @@ const __dirname = path.dirname(__filename); const caseName = path.basename(__dirname); const root = path.join(__dirname, '..', '..', '..', 'dist', caseName); -const commonConfigResult = commonConfig(); +const commonConfigResult = commonConfig({ firstScreenSyncTiming: 'jsReady' }); commonConfigResult.output!.distPath = { root }; commonConfigResult.output!.assetPrefix += `/${caseName}`; export default defineConfig({ diff --git a/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-module/rspeedy.config.ts b/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-module/rspeedy.config.ts index 419e098768..ef5903797f 100644 --- a/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-module/rspeedy.config.ts +++ b/packages/web-platform/web-tests/tests/react/config-splitchunk-split-by-module/rspeedy.config.ts @@ -10,7 +10,7 @@ const __dirname = path.dirname(__filename); const caseName = path.basename(__dirname); const root = path.join(__dirname, '..', '..', '..', 'dist', caseName); -const commonConfigResult = commonConfig(); +const commonConfigResult = commonConfig({ firstScreenSyncTiming: 'jsReady' }); commonConfigResult.output!.distPath = { root }; commonConfigResult.output!.assetPrefix += `/${caseName}`; export default defineConfig({ diff --git a/packages/web-platform/web-worker-runtime/package.json b/packages/web-platform/web-worker-runtime/package.json index ed47dd8c35..a3c71fa786 100644 --- a/packages/web-platform/web-worker-runtime/package.json +++ b/packages/web-platform/web-worker-runtime/package.json @@ -28,9 +28,9 @@ "@lynx-js/web-worker-rpc": "workspace:*" }, "devDependencies": { - "@lynx-js/lynx-core": "0.1.0" + "@lynx-js/lynx-core": "0.1.2" }, "peerDependencies": { - "@lynx-js/lynx-core": "0.1.0" + "@lynx-js/lynx-core": "0.1.2" } } diff --git a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createBackgroundLynx.ts b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createBackgroundLynx.ts index 4a31a8ee1b..b8b4ea8f0f 100644 --- a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createBackgroundLynx.ts +++ b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createBackgroundLynx.ts @@ -2,20 +2,56 @@ // Licensed under the Apache License Version 2.0 that can be found in the // LICENSE file in the root directory of this source tree. -import type { Cloneable, NativeApp } from '@lynx-js/web-constants'; +import { + dispatchCoreContextEventEndpoint, + DispatchEventResult, + type Cloneable, + type LynxContextEventTarget, + type NativeApp, +} from '@lynx-js/web-constants'; import type { Rpc } from '@lynx-js/web-worker-rpc'; import { createGetCustomSection } from './crossThreadHandlers/createGetCustomSection.js'; - export interface CreateLynxConfig { globalProps: unknown; customSections: Record; } +export class LynxCrossThreadContext extends EventTarget + implements LynxContextEventTarget +{ + constructor( + private _config: { + mainThreadRpc: Rpc; + dispatchEventEndpoint: typeof dispatchCoreContextEventEndpoint; + }, + ) { + super(); + } + postMessage(...args: any[]) { + console.error('[lynx-web] postMessage not implemented, args:', ...args); + } + // @ts-expect-error + override dispatchEvent(event: Event): number { + super.dispatchEvent(event); + return DispatchEventResult.CanceledBeforeDispatch; + } + __start() { + const { mainThreadRpc, dispatchEventEndpoint } = this._config; + mainThreadRpc.registerHandler(dispatchEventEndpoint, (eventType, data) => { + this.dispatchEvent(new MessageEvent(eventType, { data: data ?? {} })); + }); + } +} + export function createBackgroundLynx( config: CreateLynxConfig, nativeApp: NativeApp, mainThreadRpc: Rpc, ) { + const coreContext = new LynxCrossThreadContext({ + mainThreadRpc, + dispatchEventEndpoint: dispatchCoreContextEventEndpoint, + }); return { __globalProps: config.globalProps, getJSModule(_moduleName: string): any { @@ -24,10 +60,7 @@ export function createBackgroundLynx( return nativeApp; }, getCoreContext() { - return { - addInternalEventListener() {}, - addEventListener() {}, - } as any; + return coreContext; }, getCustomSectionSync(key: string) { return config.customSections[key]; diff --git a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createNativeApp.ts b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createNativeApp.ts index da83221adb..c8b7c2565e 100644 --- a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createNativeApp.ts +++ b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createNativeApp.ts @@ -14,17 +14,16 @@ import { type NativeModulesMap, } from '@lynx-js/web-constants'; import { createInvokeUIMethod } from './crossThreadHandlers/createInvokeUIMethod.js'; -import { registerOnLifecycleEventHandler } from './crossThreadHandlers/registerOnLifecycleEventHandler.js'; import { registerPublicComponentEventHandler } from './crossThreadHandlers/registerPublicComponentEventHandler.js'; import { registerGlobalExposureEventHandler } from './crossThreadHandlers/registerGlobalExposureEventHandler.js'; import { createNativeModules } from './createNativeModules.js'; import { registerUpdateDataHandler } from './crossThreadHandlers/registerUpdateDataHandler.js'; import { registerPublishEventHandler } from './crossThreadHandlers/registerPublishEventHandler.js'; import { createPerformanceApis } from './createPerformanceApis.js'; -import { registerOnNativeAppReadyHandler } from './crossThreadHandlers/registerOnNativeAppReadyHandler.js'; import { registerSendGlobalEventHandler } from './crossThreadHandlers/registerSendGlobalEvent.js'; import { createJSObjectDestructionObserver } from './crossThreadHandlers/createJSObjectDestructionObserver.js'; import type { TimingSystem } from './createTimingSystem.js'; +import type { LynxCrossThreadContext } from './createBackgroundLynx.js'; let nativeAppCount = 0; @@ -97,6 +96,8 @@ export async function createNativeApp(config: { const entry = (globalThis.module as LynxJSModule).exports; return { init: (lynxCoreInject) => { + lynxCoreInject.tt.lynxCoreInject = lynxCoreInject; + lynxCoreInject.tt.globalThis ??= lynxCoreInject; return entry?.(lynxCoreInject.tt); }, }; @@ -111,10 +112,6 @@ export async function createNativeApp(config: { setNativeProps, invokeUIMethod: createInvokeUIMethod(uiThreadRpc), setCard(tt) { - registerOnLifecycleEventHandler( - mainThreadRpc, - tt, - ); registerPublicComponentEventHandler( mainThreadRpc, tt, @@ -131,15 +128,12 @@ export async function createNativeApp(config: { uiThreadRpc, tt, ); - registerOnNativeAppReadyHandler( - uiThreadRpc, - tt, - ); registerSendGlobalEventHandler( uiThreadRpc, tt, ); timingSystem.registerGlobalEmitter(tt.GlobalEventEmitter); + (tt.lynx.getCoreContext() as LynxCrossThreadContext).__start(); }, triggerComponentEvent, selectComponent, diff --git a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createPerformanceApis.ts b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createPerformanceApis.ts index 6601694f5e..33e2eb7ad7 100644 --- a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createPerformanceApis.ts +++ b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/createPerformanceApis.ts @@ -11,6 +11,8 @@ export function createPerformanceApis(timingSystem: TimingSystem): Pick< | 'onPipelineStart' | 'markPipelineTiming' | 'bindPipelineIdWithTimingFlag' + | 'profileStart' + | 'profileEnd' > { let inc = 0; const performanceApis = { @@ -40,6 +42,12 @@ export function createPerformanceApis(timingSystem: TimingSystem): Pick< const timingFlags = timingSystem.pipelineIdToTimingFlags.get(pipelineId)!; timingFlags.push(timingFlag); }, + profileStart: () => { + console.error('NYI: profileStart. This is an issue of lynx-core.'); + }, + profileEnd: () => { + console.error('NYI: profileEnd. This is an issue of lynx-core.'); + }, }; return performanceApis; } diff --git a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnLifecycleEventHandler.ts b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnLifecycleEventHandler.ts deleted file mode 100644 index 3a177c10b0..0000000000 --- a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnLifecycleEventHandler.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import { - onLifecycleEventEndpoint, - type NativeTTObject, -} from '@lynx-js/web-constants'; -import type { Rpc } from '@lynx-js/web-worker-rpc'; - -export function registerOnLifecycleEventHandler( - rpc: Rpc, - tt: NativeTTObject, -): void { - rpc.registerHandlerLazy( - onLifecycleEventEndpoint, - tt, - 'OnLifecycleEvent', - ); -} diff --git a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnNativeAppReadyHandler.ts b/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnNativeAppReadyHandler.ts deleted file mode 100644 index 6eb3846f5a..0000000000 --- a/packages/web-platform/web-worker-runtime/src/backgroundThread/background-apis/crossThreadHandlers/registerOnNativeAppReadyHandler.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2023 The Lynx Authors. All rights reserved. -// Licensed under the Apache License Version 2.0 that can be found in the -// LICENSE file in the root directory of this source tree. -import { - uiThreadFpReadyEndpoint, - type NativeTTObject, -} from '@lynx-js/web-constants'; -import type { Rpc } from '@lynx-js/web-worker-rpc'; - -export function registerOnNativeAppReadyHandler( - uiThreadRpc: Rpc, - tt: NativeTTObject, -): void { - uiThreadRpc.registerHandlerLazy( - uiThreadFpReadyEndpoint, - tt, - 'onNativeAppReady', - ); -} diff --git a/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts b/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts index 3d490bae7f..eb898d0eec 100644 --- a/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts +++ b/packages/web-platform/web-worker-runtime/src/mainThread/startMainThread.ts @@ -4,9 +4,7 @@ import { BackgroundThreadStartEndpoint, - mainThreadChunkReadyEndpoint, mainThreadStartEndpoint, - onLifecycleEventEndpoint, type LynxJSModule, flushElementTreeEndpoint, reportErrorEndpoint, @@ -16,6 +14,7 @@ import { postOffscreenEventEndpoint, switchExposureServiceEndpoint, postTimingFlagsEndpoint, + dispatchCoreContextEventEndpoint, } from '@lynx-js/web-constants'; import { Rpc } from '@lynx-js/web-worker-rpc'; import { @@ -45,8 +44,8 @@ export function startMainThread( const backgroundStart = backgroundThreadRpc.createCall( BackgroundThreadStartEndpoint, ); - const __OnLifecycleEvent = backgroundThreadRpc.createCall( - onLifecycleEventEndpoint, + const dispatchCoreContextEvent = backgroundThreadRpc.createCall( + dispatchCoreContextEventEndpoint, ); const publishEvent = backgroundThreadRpc.createCall( publishEventEndpoint, @@ -55,9 +54,6 @@ export function startMainThread( publicComponentEventEndpoint, ); const postExposure = backgroundThreadRpc.createCall(postExposureEndpoint); - const mainThreadChunkReady = uiThreadRpc.createCall( - mainThreadChunkReadyEndpoint, - ); let operations: ElementOperation[] = []; const flushElementTree = uiThreadRpc.createCall(flushElementTreeEndpoint); const reportError = uiThreadRpc.createCall(reportErrorEndpoint); @@ -65,6 +61,7 @@ export function startMainThread( uiThreadRpc.registerHandler( mainThreadStartEndpoint, async (config) => { + let isFp = true; const { globalProps, template, @@ -96,8 +93,7 @@ export function startMainThread( lepusCode, docu, callbacks: { - mainChunkReady: function(): void { - mainThreadChunkReady(); + mainChunkReady: () => { markTimingInternal('data_processor_start'); const initData = runtime.processData ? runtime.processData(config.initData) @@ -137,6 +133,10 @@ export function startMainThread( const pipelineId = options?.pipelineOptions?.pipelineID; markTimingInternal('dispatch_start', pipelineId); docu.commit(); + if (isFp) { + isFp = false; + dispatchCoreContextEvent('__OnNativeAppReady', undefined); + } markTimingInternal('layout_start', pipelineId); markTimingInternal('ui_operation_flush_start', pipelineId); await flushElementTree(operations); @@ -146,7 +146,9 @@ export function startMainThread( postTimingFlags(timingFlags, pipelineId); }, _ReportError: reportError, - __OnLifecycleEvent, + __OnLifecycleEvent: (data) => { + dispatchCoreContextEvent('__OnLifecycleEvent', data); + }, /** * Note : * The parameter of lynx.performance.markTiming is (pipelineId:string, timingFlag:string)=>void diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ca22c13d7..6840f292b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -611,8 +611,8 @@ importers: version: link:../web-worker-runtime devDependencies: '@lynx-js/lynx-core': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.1.2 + version: 0.1.2 '@lynx-js/web-elements': specifier: workspace:* version: link:../web-elements @@ -645,8 +645,8 @@ importers: specifier: ^1.9.0 version: 1.9.0(webpack@5.98.0) '@lynx-js/lynx-core': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.1.2 + version: 0.1.2 '@lynx-js/web-core': specifier: workspace:* version: link:../web-core @@ -680,8 +680,8 @@ importers: packages/web-platform/web-tests: devDependencies: '@lynx-js/lynx-core': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.1.2 + version: 0.1.2 '@lynx-js/offscreen-document': specifier: workspace:* version: link:../offscreen-document @@ -758,8 +758,8 @@ importers: version: link:../web-worker-rpc devDependencies: '@lynx-js/lynx-core': - specifier: 0.1.0 - version: 0.1.0 + specifier: 0.1.2 + version: 0.1.2 packages/webpack/chunk-loading-webpack-plugin: dependencies: @@ -2226,8 +2226,8 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@lynx-js/lynx-core@0.1.0': - resolution: {integrity: sha512-bUYAJNU3/k0ep1kyhP3wolgyD9kulmzWGGU6z4wg+bNfShSqpATZmFPqZYy425cqXhkEdn+apEF02f6uHNjcGA==} + '@lynx-js/lynx-core@0.1.2': + resolution: {integrity: sha512-/oqDTnxbfmc/Haz0rUNC95lqQ082wEdMVzYfPo8ySr0WDtK+64Odo2k47s9uVmsIoX0h09GLsg4NMoWC0kjyPQ==} '@lynx-js/tasm@0.0.5': resolution: {integrity: sha512-E5ZTtNQslv0zGMqtEo/GULHM0XiyvkuL4K8SxP8R9n0WnInppIiekIP5Rzvt+oex7Sg8ngtm/ToUDiZ0NQ9+Qg==} @@ -9541,7 +9541,7 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@lynx-js/lynx-core@0.1.0': {} + '@lynx-js/lynx-core@0.1.2': {} '@lynx-js/tasm@0.0.5': {}