@lynx-js/react 0.108.0 → 0.108.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/package.json +3 -3
- package/refresh/.turbo/turbo-build.log +1 -1
- package/runtime/lib/lifecycle/patch/isMainThreadHydrationFinished.d.ts +2 -0
- package/runtime/lib/lifecycle/patch/isMainThreadHydrationFinished.js +9 -0
- package/runtime/lib/lifecycle/patch/isMainThreadHydrationFinished.js.map +1 -0
- package/runtime/lib/lifecycle/patch/updateMainThread.js +4 -3
- package/runtime/lib/lifecycle/patch/updateMainThread.js.map +1 -1
- package/runtime/lib/lifecycle/reload.js +2 -0
- package/runtime/lib/lifecycle/reload.js.map +1 -1
- package/runtime/lib/snapshot/ref.js.map +1 -1
- package/runtime/lib/snapshot/spread.d.ts +0 -6
- package/runtime/lib/snapshot/spread.js +4 -10
- package/runtime/lib/snapshot/spread.js.map +1 -1
- package/runtime/lib/snapshot/workletEvent.d.ts +2 -1
- package/runtime/lib/snapshot/workletEvent.js +1 -1
- package/runtime/lib/snapshot/workletEvent.js.map +1 -1
- package/runtime/lib/snapshot/workletRef.d.ts +4 -4
- package/runtime/lib/snapshot/workletRef.js +8 -6
- package/runtime/lib/snapshot/workletRef.js.map +1 -1
- package/runtime/lib/worklet/workletRef.d.ts +1 -0
- package/runtime/lib/worklet/workletRef.js +14 -12
- package/runtime/lib/worklet/workletRef.js.map +1 -1
- package/runtime/src/lifecycle/patch/isMainThreadHydrationFinished.ts +10 -0
- package/runtime/src/lifecycle/patch/updateMainThread.ts +4 -3
- package/runtime/src/lifecycle/reload.ts +2 -0
- package/runtime/src/snapshot/ref.ts +2 -2
- package/runtime/src/snapshot/spread.ts +15 -5
- package/runtime/src/snapshot/workletEvent.ts +3 -2
- package/runtime/src/snapshot/workletRef.ts +18 -19
- package/runtime/src/worklet/workletRef.ts +15 -12
- package/transform/dist/wasm.cjs +1 -1
- package/worklet-runtime/dist/dev.js +25 -13
- package/worklet-runtime/dist/dev.js.map +3 -3
- package/worklet-runtime/dist/main.js +25 -13
- package/worklet-runtime/dist/main.js.map +3 -3
- package/worklet-runtime/lib/bindings/bindings.d.ts +1 -1
- package/worklet-runtime/lib/bindings/bindings.js +2 -2
- package/worklet-runtime/lib/bindings/bindings.js.map +1 -1
- package/worklet-runtime/lib/bindings/index.d.ts +1 -1
- package/worklet-runtime/lib/bindings/index.js +1 -1
- package/worklet-runtime/lib/bindings/index.js.map +1 -1
- package/worklet-runtime/lib/bindings/types.d.ts +7 -3
- package/worklet-runtime/lib/bindings/types.js +3 -0
- package/worklet-runtime/lib/bindings/types.js.map +1 -1
- package/worklet-runtime/lib/ctxTrace.d.ts +8 -0
- package/worklet-runtime/lib/ctxTrace.js +13 -0
- package/worklet-runtime/lib/ctxTrace.js.map +1 -0
- package/worklet-runtime/lib/global.d.ts +3 -3
- package/worklet-runtime/lib/workletRuntime.js +11 -8
- package/worklet-runtime/lib/workletRuntime.js.map +1 -1
|
@@ -204,6 +204,17 @@
|
|
|
204
204
|
);
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
// src/ctxTrace.ts
|
|
208
|
+
var currentCtx;
|
|
209
|
+
function traceCtxCall(ctx, _params) {
|
|
210
|
+
currentCtx = {
|
|
211
|
+
ctx
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function clearCurrentCtx() {
|
|
215
|
+
currentCtx = void 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
207
218
|
// src/delayWorkletEvent.ts
|
|
208
219
|
var impl2;
|
|
209
220
|
function initEventDelay() {
|
|
@@ -330,19 +341,20 @@
|
|
|
330
341
|
return runWorkletImpl(ctx, params);
|
|
331
342
|
}
|
|
332
343
|
function runWorkletImpl(ctx, params) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
|
|
344
|
+
traceCtxCall(ctx, params);
|
|
345
|
+
try {
|
|
346
|
+
const worklet = profile(
|
|
347
|
+
"transformWorkletCtx " + ctx._wkltId,
|
|
348
|
+
() => transformWorklet(ctx, true)
|
|
349
|
+
);
|
|
350
|
+
const params_ = profile(
|
|
351
|
+
"transformWorkletParams",
|
|
352
|
+
() => transformWorklet(params || [], false)
|
|
353
|
+
);
|
|
354
|
+
return profile("runWorklet", () => worklet(...params_));
|
|
355
|
+
} finally {
|
|
356
|
+
clearCurrentCtx();
|
|
357
|
+
}
|
|
346
358
|
}
|
|
347
359
|
function validateWorklet(ctx) {
|
|
348
360
|
return typeof ctx === "object" && ctx !== null && ("_wkltId" in ctx || "_lepusWorkletHash" in ctx);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/delayWorkletEvent.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
3
|
+
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/ctxTrace.ts", "../src/delayWorkletEvent.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
4
4
|
"sourceRoot": "/home/runner/work/lynx-stack/lynx-stack/packages/react/worklet-runtime/src",
|
|
5
|
-
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-ignore set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: any): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): any {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, any>,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params || {},\n (res: { code: number; data: any }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n if (PageElement.pageElement === undefined) {\n PageElement.pageElement = __GetPageElement();\n }\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion || '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-ignore\n lynx.querySelector = querySelector;\n // @ts-ignore\n lynx.querySelectorAll = querySelectorAll;\n // @ts-ignore\n globalThis.setTimeout = lynx.setTimeout;\n // @ts-ignore\n globalThis.setInterval = lynx.setInterval;\n // @ts-ignore\n globalThis.clearTimeout = lynx.clearTimeout;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-ignore\n globalThis.clearInterval = lynx.clearInterval ?? lynx.clearTimeInterval;\n\n {\n // @ts-ignore\n const requestAnimationFrame = lynx.requestAnimationFrame;\n // @ts-ignore\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => {},\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-ignore\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: any[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = (\n id: WorkletRefId,\n): WorkletRef<unknown> => {\n const value = impl!._workletRefMap[id];\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value!;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle._wvid).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n impl!._workletRefMap[id] ??= createWorkletRef(id, value);\n });\n });\n}\n\nexport {\n type RefImpl,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: RuntimeProxy.Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: RuntimeProxy.Event) => {\n removeValueFromWorkletRefMap(event.data.id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n // @ts-ignore\n if (params[0]?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) || 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { isRunOnBackgroundEnabled, JsFunctionLifecycleManager } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _eventDelayImpl: initEventDelay(),\n _refImpl: initWorkletRef(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: Function): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n const worklet: Function = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n\n let result;\n profile('runWorklet', () => {\n result = worklet(...params_);\n });\n return result;\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | Function>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): Function;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | Function {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n obj: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n for (const key in obj) {\n // @ts-ignore\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n // @ts-ignore\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n // @ts-ignore\n obj[key] = getFromWorkletRefMap(\n (subObj as any as WorkletRefImpl<unknown>)._wvid,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n // @ts-ignore\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
-
"mappings": "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
|
|
5
|
+
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-ignore set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: any): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): any {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, any>,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params || {},\n (res: { code: number; data: any }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n if (PageElement.pageElement === undefined) {\n PageElement.pageElement = __GetPageElement();\n }\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion || '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-ignore\n lynx.querySelector = querySelector;\n // @ts-ignore\n lynx.querySelectorAll = querySelectorAll;\n // @ts-ignore\n globalThis.setTimeout = lynx.setTimeout;\n // @ts-ignore\n globalThis.setInterval = lynx.setInterval;\n // @ts-ignore\n globalThis.clearTimeout = lynx.clearTimeout;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-ignore\n globalThis.clearInterval = lynx.clearInterval ?? lynx.clearTimeInterval;\n\n {\n // @ts-ignore\n const requestAnimationFrame = lynx.requestAnimationFrame;\n // @ts-ignore\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => {},\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-ignore\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: any[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = (\n id: WorkletRefId,\n): WorkletRef<unknown> => {\n const value = impl!._workletRefMap[id];\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value!;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle._wvid).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n impl!._workletRefMap[id] ??= createWorkletRef(id, value);\n });\n });\n}\n\nexport {\n type RefImpl,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: RuntimeProxy.Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: RuntimeProxy.Event) => {\n removeValueFromWorkletRefMap(event.data.id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\n\ninterface CtxTrace {\n ctx: Worklet;\n}\n\nexport let currentCtx: CtxTrace | undefined;\n\nexport function traceCtxCall(ctx: Worklet, _params: ClosureValueType[]): void {\n currentCtx = {\n ctx,\n };\n}\n\nexport function clearCurrentCtx(): void {\n currentCtx = undefined;\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n // @ts-ignore\n if (params[0]?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) || 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { clearCurrentCtx, traceCtxCall } from './ctxTrace.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _eventDelayImpl: initEventDelay(),\n _refImpl: initWorkletRef(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: (...args: any[]) => any): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n traceCtxCall(ctx, params);\n try {\n const worklet: (...args: any[]) => unknown = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n return profile('runWorklet', () => worklet(...params_));\n } finally {\n clearCurrentCtx();\n }\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | ((...args: any[]) => any)>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): (...args: any[]) => any;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | ((...args: any[]) => any) {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n obj: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n for (const key in obj) {\n // @ts-ignore\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n // @ts-ignore\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n // @ts-ignore\n obj[key] = getFromWorkletRefMap(\n (subObj as any as WorkletRefImpl<unknown>)._wvid,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n // @ts-ignore\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
+
"mappings": "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",
|
|
7
7
|
"names": ["impl", "runWorklet"]
|
|
8
8
|
}
|
|
@@ -204,6 +204,17 @@
|
|
|
204
204
|
);
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
// src/ctxTrace.ts
|
|
208
|
+
var currentCtx;
|
|
209
|
+
function traceCtxCall(ctx, _params) {
|
|
210
|
+
currentCtx = {
|
|
211
|
+
ctx
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function clearCurrentCtx() {
|
|
215
|
+
currentCtx = void 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
207
218
|
// src/delayWorkletEvent.ts
|
|
208
219
|
var impl2;
|
|
209
220
|
function initEventDelay() {
|
|
@@ -330,19 +341,20 @@
|
|
|
330
341
|
return runWorkletImpl(ctx, params);
|
|
331
342
|
}
|
|
332
343
|
function runWorkletImpl(ctx, params) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
|
|
344
|
+
traceCtxCall(ctx, params);
|
|
345
|
+
try {
|
|
346
|
+
const worklet = profile(
|
|
347
|
+
"transformWorkletCtx " + ctx._wkltId,
|
|
348
|
+
() => transformWorklet(ctx, true)
|
|
349
|
+
);
|
|
350
|
+
const params_ = profile(
|
|
351
|
+
"transformWorkletParams",
|
|
352
|
+
() => transformWorklet(params || [], false)
|
|
353
|
+
);
|
|
354
|
+
return profile("runWorklet", () => worklet(...params_));
|
|
355
|
+
} finally {
|
|
356
|
+
clearCurrentCtx();
|
|
357
|
+
}
|
|
346
358
|
}
|
|
347
359
|
function validateWorklet(ctx) {
|
|
348
360
|
return typeof ctx === "object" && ctx !== null && ("_wkltId" in ctx || "_lepusWorkletHash" in ctx);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/delayWorkletEvent.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
3
|
+
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/ctxTrace.ts", "../src/delayWorkletEvent.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
4
4
|
"sourceRoot": "/home/runner/work/lynx-stack/lynx-stack/packages/react/worklet-runtime/src",
|
|
5
|
-
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-ignore set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: any): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): any {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, any>,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params || {},\n (res: { code: number; data: any }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n if (PageElement.pageElement === undefined) {\n PageElement.pageElement = __GetPageElement();\n }\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion || '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-ignore\n lynx.querySelector = querySelector;\n // @ts-ignore\n lynx.querySelectorAll = querySelectorAll;\n // @ts-ignore\n globalThis.setTimeout = lynx.setTimeout;\n // @ts-ignore\n globalThis.setInterval = lynx.setInterval;\n // @ts-ignore\n globalThis.clearTimeout = lynx.clearTimeout;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-ignore\n globalThis.clearInterval = lynx.clearInterval ?? lynx.clearTimeInterval;\n\n {\n // @ts-ignore\n const requestAnimationFrame = lynx.requestAnimationFrame;\n // @ts-ignore\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => {},\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-ignore\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: any[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = (\n id: WorkletRefId,\n): WorkletRef<unknown> => {\n const value = impl!._workletRefMap[id];\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value!;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle._wvid).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n impl!._workletRefMap[id] ??= createWorkletRef(id, value);\n });\n });\n}\n\nexport {\n type RefImpl,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: RuntimeProxy.Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: RuntimeProxy.Event) => {\n removeValueFromWorkletRefMap(event.data.id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n // @ts-ignore\n if (params[0]?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) || 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { isRunOnBackgroundEnabled, JsFunctionLifecycleManager } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _eventDelayImpl: initEventDelay(),\n _refImpl: initWorkletRef(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: Function): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n const worklet: Function = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n\n let result;\n profile('runWorklet', () => {\n result = worklet(...params_);\n });\n return result;\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | Function>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): Function;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | Function {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n obj: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n for (const key in obj) {\n // @ts-ignore\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n // @ts-ignore\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n // @ts-ignore\n obj[key] = getFromWorkletRefMap(\n (subObj as any as WorkletRefImpl<unknown>)._wvid,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n // @ts-ignore\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
-
"mappings": "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
|
|
5
|
+
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-ignore set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: any): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): any {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, any>,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params || {},\n (res: { code: number; data: any }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n if (PageElement.pageElement === undefined) {\n PageElement.pageElement = __GetPageElement();\n }\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion || '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-ignore\n lynx.querySelector = querySelector;\n // @ts-ignore\n lynx.querySelectorAll = querySelectorAll;\n // @ts-ignore\n globalThis.setTimeout = lynx.setTimeout;\n // @ts-ignore\n globalThis.setInterval = lynx.setInterval;\n // @ts-ignore\n globalThis.clearTimeout = lynx.clearTimeout;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-ignore\n globalThis.clearInterval = lynx.clearInterval ?? lynx.clearTimeInterval;\n\n {\n // @ts-ignore\n const requestAnimationFrame = lynx.requestAnimationFrame;\n // @ts-ignore\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => {},\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-ignore\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: any[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = (\n id: WorkletRefId,\n): WorkletRef<unknown> => {\n const value = impl!._workletRefMap[id];\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value!;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle._wvid).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n impl!._workletRefMap[id] ??= createWorkletRef(id, value);\n });\n });\n}\n\nexport {\n type RefImpl,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: RuntimeProxy.Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: RuntimeProxy.Event) => {\n removeValueFromWorkletRefMap(event.data.id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\n\ninterface CtxTrace {\n ctx: Worklet;\n}\n\nexport let currentCtx: CtxTrace | undefined;\n\nexport function traceCtxCall(ctx: Worklet, _params: ClosureValueType[]): void {\n currentCtx = {\n ctx,\n };\n}\n\nexport function clearCurrentCtx(): void {\n currentCtx = undefined;\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n // @ts-ignore\n if (params[0]?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) || 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { clearCurrentCtx, traceCtxCall } from './ctxTrace.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _eventDelayImpl: initEventDelay(),\n _refImpl: initWorkletRef(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: (...args: any[]) => any): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n traceCtxCall(ctx, params);\n try {\n const worklet: (...args: any[]) => unknown = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n return profile('runWorklet', () => worklet(...params_));\n } finally {\n clearCurrentCtx();\n }\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | ((...args: any[]) => any)>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): (...args: any[]) => any;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | ((...args: any[]) => any) {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n obj: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n for (const key in obj) {\n // @ts-ignore\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n // @ts-ignore\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n // @ts-ignore\n obj[key] = getFromWorkletRefMap(\n (subObj as any as WorkletRefImpl<unknown>)._wvid,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n // @ts-ignore\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
+
"mappings": "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",
|
|
7
7
|
"names": ["impl", "runWorklet"]
|
|
8
8
|
}
|
|
@@ -11,4 +11,4 @@ declare function runWorkletCtx(worklet: Worklet, params: ClosureValueType[]): un
|
|
|
11
11
|
* @param patch - An array containing the index and new value of the worklet value.
|
|
12
12
|
*/
|
|
13
13
|
declare function updateWorkletRefInitValueChanges(patch?: [number, unknown][]): void;
|
|
14
|
-
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges,
|
|
14
|
+
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, onHydrationFinished, registerWorklet, };
|
|
@@ -46,7 +46,7 @@ function updateWorkletRefInitValueChanges(patch) {
|
|
|
46
46
|
*
|
|
47
47
|
* @internal
|
|
48
48
|
*/
|
|
49
|
-
function
|
|
49
|
+
function onHydrationFinished() {
|
|
50
50
|
globalThis.lynxWorkletImpl?._eventDelayImpl.clearDelayedWorklets();
|
|
51
51
|
}
|
|
52
52
|
/**
|
|
@@ -57,5 +57,5 @@ function clearDelayedWorklets() {
|
|
|
57
57
|
function registerWorklet(type, id, worklet) {
|
|
58
58
|
globalThis.registerWorklet(type, id, worklet);
|
|
59
59
|
}
|
|
60
|
-
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges,
|
|
60
|
+
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, onHydrationFinished, registerWorklet, };
|
|
61
61
|
//# sourceMappingURL=bindings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/bindings/bindings.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAO1D;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,OAAgB,EAAE,OAAoB;IAChE,UAAU,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,CAAC;IAC3F,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAgB,EAAE,MAA0B;IACjE,OAAO,UAAU,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,UAAmC,EAAE,OAA2B;IACxF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,gCAAgC,CAAC,KAA2B;IACnE,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,
|
|
1
|
+
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/bindings/bindings.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAO1D;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,OAAgB,EAAE,OAAoB;IAChE,UAAU,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,CAAC;IAC3F,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAgB,EAAE,MAA0B;IACjE,OAAO,UAAU,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,UAAmC,EAAE,OAA2B;IACxF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,gCAAgC,CAAC,KAA2B;IACnE,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB;IAC1B,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,oBAAoB,EAAE,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,EAAU,EAAE,OAAgC;IACjF,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,gCAAgC,EAChC,mBAAmB,EACnB,eAAe,GAChB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { loadWorkletRuntime } from './loadRuntime.js';
|
|
2
|
-
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges,
|
|
2
|
+
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, onHydrationFinished, } from './bindings.js';
|
|
3
3
|
export type * from './types.js';
|
|
4
4
|
export { WorkletEvents, type RunWorkletCtxData, type RunWorkletCtxRetData } from './events.js';
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
4
|
export { loadWorkletRuntime } from './loadRuntime.js';
|
|
5
|
-
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges,
|
|
5
|
+
export { onWorkletCtxUpdate, runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, onHydrationFinished, } from './bindings.js';
|
|
6
6
|
export { WorkletEvents } from './events.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,gCAAgC,EAChC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,gCAAgC,EAChC,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,aAAa,EAAqD,MAAM,aAAa,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Element } from '../api/element.js';
|
|
2
|
+
export type { Element };
|
|
1
3
|
export type WorkletRefId = number;
|
|
2
4
|
export interface WorkletRefImpl<T> {
|
|
3
5
|
_wvid: WorkletRefId;
|
|
@@ -13,14 +15,17 @@ export interface WorkletRef<T> {
|
|
|
13
15
|
}
|
|
14
16
|
interface ClosureValueType_ extends Record<string, ClosureValueType> {
|
|
15
17
|
}
|
|
16
|
-
export type ClosureValueType = null | undefined | string | boolean | number | Worklet | WorkletRef<unknown> |
|
|
18
|
+
export type ClosureValueType = null | undefined | string | boolean | number | Worklet | WorkletRef<unknown> | Element | (((...args: unknown[]) => unknown) & {
|
|
19
|
+
ctx?: ClosureValueType;
|
|
20
|
+
}) | ClosureValueType_ | ClosureValueType[];
|
|
17
21
|
export interface Worklet {
|
|
18
22
|
_wkltId: string;
|
|
23
|
+
_workletType?: string;
|
|
19
24
|
_c?: Record<string, ClosureValueType>;
|
|
20
25
|
_lepusWorkletHash?: string;
|
|
21
26
|
_execId?: number;
|
|
22
27
|
_jsFn?: Record<string, string>;
|
|
23
|
-
_unmount?:
|
|
28
|
+
_unmount?: () => void;
|
|
24
29
|
[key: string]: ClosureValueType;
|
|
25
30
|
}
|
|
26
31
|
/**
|
|
@@ -32,4 +37,3 @@ export interface JsFnHandle {
|
|
|
32
37
|
_execId?: number;
|
|
33
38
|
_error?: string;
|
|
34
39
|
}
|
|
35
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bindings/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bindings/types.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ClosureValueType, Worklet } from './bindings/types.js';
|
|
2
|
+
interface CtxTrace {
|
|
3
|
+
ctx: Worklet;
|
|
4
|
+
}
|
|
5
|
+
export declare let currentCtx: CtxTrace | undefined;
|
|
6
|
+
export declare function traceCtxCall(ctx: Worklet, _params: ClosureValueType[]): void;
|
|
7
|
+
export declare function clearCurrentCtx(): void;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
export let currentCtx;
|
|
5
|
+
export function traceCtxCall(ctx, _params) {
|
|
6
|
+
currentCtx = {
|
|
7
|
+
ctx,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function clearCurrentCtx() {
|
|
11
|
+
currentCtx = undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ctxTrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctxTrace.js","sourceRoot":"","sources":["../src/ctxTrace.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAQ1D,MAAM,CAAC,IAAI,UAAgC,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,OAA2B;IACpE,UAAU,GAAG;QACX,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,UAAU,GAAG,SAAS,CAAC;AACzB,CAAC"}
|
|
@@ -4,12 +4,12 @@ import type { JsFunctionLifecycleManager } from './jsFunctionLifecycle.js';
|
|
|
4
4
|
import type { RefImpl } from './workletRef.js';
|
|
5
5
|
declare global {
|
|
6
6
|
var lynxWorkletImpl: {
|
|
7
|
-
_workletMap: Record<string,
|
|
7
|
+
_workletMap: Record<string, (...args: any[]) => any>;
|
|
8
8
|
_jsFunctionLifecycleManager?: JsFunctionLifecycleManager;
|
|
9
9
|
_eventDelayImpl: EventDelayImpl;
|
|
10
10
|
_refImpl: RefImpl;
|
|
11
11
|
};
|
|
12
12
|
function runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown;
|
|
13
|
-
function registerWorklet(type: string, id: string, worklet:
|
|
14
|
-
function registerWorkletInternal(type: string, id: string, worklet:
|
|
13
|
+
function registerWorklet(type: string, id: string, worklet: (...args: any[]) => any): void;
|
|
14
|
+
function registerWorkletInternal(type: string, id: string, worklet: (...args: any[]) => any): void;
|
|
15
15
|
}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
4
|
import { Element } from './api/element.js';
|
|
5
|
+
import { clearCurrentCtx, traceCtxCall } from './ctxTrace.js';
|
|
5
6
|
import { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';
|
|
6
|
-
import {
|
|
7
|
+
import { JsFunctionLifecycleManager, isRunOnBackgroundEnabled } from './jsFunctionLifecycle.js';
|
|
7
8
|
import { profile } from './utils/profile.js';
|
|
8
9
|
import { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';
|
|
9
10
|
function initWorklet() {
|
|
@@ -47,13 +48,15 @@ function runWorklet(ctx, params) {
|
|
|
47
48
|
return runWorkletImpl(ctx, params);
|
|
48
49
|
}
|
|
49
50
|
function runWorkletImpl(ctx, params) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
51
|
+
traceCtxCall(ctx, params);
|
|
52
|
+
try {
|
|
53
|
+
const worklet = profile('transformWorkletCtx ' + ctx._wkltId, () => transformWorklet(ctx, true));
|
|
54
|
+
const params_ = profile('transformWorkletParams', () => transformWorklet(params || [], false));
|
|
55
|
+
return profile('runWorklet', () => worklet(...params_));
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
clearCurrentCtx();
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
61
|
function validateWorklet(ctx) {
|
|
59
62
|
return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workletRuntime.js","sourceRoot":"","sources":["../src/workletRuntime.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"workletRuntime.js","sourceRoot":"","sources":["../src/workletRuntime.ts"],"names":[],"mappings":"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"}
|