Skip to content

Commit 9a156cb

Browse files
committed
feat(shadow-sync): add custom event
1 parent e17049e commit 9a156cb

File tree

5 files changed

+77
-135
lines changed

5 files changed

+77
-135
lines changed

glass-easel-shadow-sync/src/backend.ts

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -377,25 +377,8 @@ export class ShadowSyncElement implements GlassEaselBackend.Element {
377377
this._context.channel.getContext(this._id, cb)
378378
}
379379

380-
setWXSListenerStats(
381-
eventName: string,
382-
final: boolean,
383-
mutated: boolean,
384-
capture: boolean,
385-
lvaluePath: (string | number)[],
386-
): void {
387-
this._context.channel.setWXSListenerStats(
388-
this._id,
389-
eventName,
390-
final,
391-
mutated,
392-
capture,
393-
lvaluePath,
394-
)
395-
}
396-
397-
callWxsPropChangeListener(newValue: any, oldValue: any, lvaluePath: (string | number)[]): void {
398-
this._context.channel.callWXSPropChangeListener(this._id, newValue, oldValue, lvaluePath)
380+
sendCustomMethod(options: unknown) {
381+
this._context.channel.callCustomMethod(this._id, options)
399382
}
400383
}
401384

@@ -687,6 +670,11 @@ export class ShadowSyncBackendContext implements GlassEaselBackend.Context {
687670
glassEasel: typeof import('glass-easel'),
688671
roots: Node[],
689672
getShadowSyncElement: (elem: Node) => ShadowSyncElement,
673+
afterReplayElement?: (
674+
ownerShadowRoot: ShadowSyncShadowRoot,
675+
elem: Node,
676+
be: ShadowSyncElement,
677+
) => void,
690678
) {
691679
roots.forEach((root) => {
692680
replayShadowBackend(glassEasel, this, root, {
@@ -736,15 +724,21 @@ export class ShadowSyncBackendContext implements GlassEaselBackend.Context {
736724
}
737725
return be
738726
},
727+
afterReplayElement,
739728
})
740729
this._shadowRoot.appendChild(getShadowSyncElement(root))
741730
})
742731
}
743732

744-
onWXSCallMethod(handler: (component: GeneralComponent, method: string, args: any[]) => void) {
745-
this.channel.onWXSCallMethod((componentId, method, args) => {
746-
const component = this._getElementId(componentId)!.__wxElement as GeneralComponent
747-
handler(component, method, args)
733+
sendCustomMethod(options: unknown) {
734+
this.channel.callCustomMethod(null, options)
735+
}
736+
737+
onCustomMethodFromView(handler: (element: Element | null, options: any) => void) {
738+
this.channel.onCustenMethod((elementId, options) => {
739+
const element =
740+
elementId !== null ? (this._getElementId(elementId)!.__wxElement as GeneralComponent) : null
741+
handler(element, options)
748742
})
749743
}
750744

@@ -803,7 +797,7 @@ export class ShadowSyncBackendContext implements GlassEaselBackend.Context {
803797

804798
export const hookBuilderToSyncData = <TBuilder extends GeneralBehaviorBuilder>(
805799
builder: TBuilder,
806-
getComponentFromMethodCaller?: (methodCaller: GeneralComponent) => GeneralComponent | undefined
800+
getComponentFromMethodCaller?: (methodCaller: GeneralComponent) => GeneralComponent | undefined,
807801
): TBuilder => {
808802
const properties: string[] = []
809803

glass-easel-shadow-sync/src/message_channel.ts

Lines changed: 22 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export const enum ChannelEventType {
1818
CREATE = 1,
1919
CREATE_CALLBACK,
2020
DESTROY,
21-
INIT_DATA,
2221

2322
ON_WINDOW_RESIZE,
2423
ON_WINDOW_RESIZE_CALLBACK,
@@ -110,9 +109,7 @@ export const enum ChannelEventType {
110109
PERFORMANCE_END_TRACE,
111110
PERFORMANCE_STATS_CALLBACK,
112111

113-
SET_WXS_LISTENER_STATS,
114-
CALL_WXS_PROP_CHANGE_LISTENER,
115-
ON_WXS_CALL_METHOD,
112+
CUSTOM_METHOD,
116113
}
117114

118115
export type ChannelEventTypeViewSide =
@@ -138,17 +135,18 @@ export type ChannelEventTypeViewSide =
138135
| ChannelEventType.ON_EVENT
139136
| ChannelEventType.ON_RELEASE_EVENT
140137
| ChannelEventType.PERFORMANCE_STATS_CALLBACK
141-
| ChannelEventType.ON_WXS_CALL_METHOD
138+
| ChannelEventType.CUSTOM_METHOD
142139

143-
export type ChannelEventTypeDataSide = Exclude<ChannelEventType, ChannelEventTypeViewSide>
140+
export type ChannelEventTypeDataSide =
141+
| Exclude<ChannelEventType, ChannelEventTypeViewSide>
142+
| ChannelEventType.CUSTOM_METHOD
144143

145144
type ExhaustiveChannelEvent<T extends Record<ChannelEventType, any>> = T
146145

147146
export type ChannelArgs = ExhaustiveChannelEvent<{
148147
[ChannelEventType.CREATE]: [number]
149148
[ChannelEventType.CREATE_CALLBACK]: [number, number, number, number, string]
150149
[ChannelEventType.DESTROY]: []
151-
[ChannelEventType.INIT_DATA]: [string]
152150

153151
[ChannelEventType.ON_WINDOW_RESIZE]: [number]
154152
[ChannelEventType.ON_WINDOW_RESIZE_CALLBACK]: [number, number, number, number]
@@ -261,16 +259,7 @@ export type ChannelArgs = ExhaustiveChannelEvent<{
261259
[ChannelEventType.START_OVERLAY_INSPECT_CALLBACK]: [number, string, number | null]
262260
[ChannelEventType.STOP_OVERLAY_INSPECT]: []
263261

264-
[ChannelEventType.SET_WXS_LISTENER_STATS]: [
265-
number,
266-
string,
267-
boolean,
268-
boolean,
269-
boolean,
270-
(string | number)[],
271-
]
272-
[ChannelEventType.CALL_WXS_PROP_CHANGE_LISTENER]: [number, unknown, unknown, (string | number)[]]
273-
[ChannelEventType.ON_WXS_CALL_METHOD]: [number, string, string]
262+
[ChannelEventType.CUSTOM_METHOD]: [number | null, unknown]
274263
}>
275264

276265
export type Channel = ReturnType<typeof MessageChannelDataSide>
@@ -317,8 +306,7 @@ export const MessageChannelDataSide = (
317306
) => void)
318307
| null = null
319308

320-
let handleWXSCallMethod: ((elementId: number, method: string, args: unknown[]) => void) | null =
321-
null
309+
let handleCustomMethod: ((elementId: number | null, options: any) => void) | null = null
322310
let overlayInspectCallbackId: number | null = null
323311

324312
const callback2id = (cb: (...args: any[]) => void) => {
@@ -472,9 +460,9 @@ export const MessageChannelDataSide = (
472460
})
473461
break
474462
}
475-
case ChannelEventType.ON_WXS_CALL_METHOD: {
476-
const [, elementId, method, args] = arg
477-
handleWXSCallMethod!(elementId, method, JSON.parse(args) as unknown[])
463+
case ChannelEventType.CUSTOM_METHOD: {
464+
const [, elementId, options] = arg
465+
handleCustomMethod?.(elementId, options)
478466
break
479467
}
480468
default:
@@ -491,7 +479,6 @@ export const MessageChannelDataSide = (
491479
}) => void,
492480
) => publish([ChannelEventType.CREATE, callback2id(init)]),
493481
destroy: () => publish([ChannelEventType.DESTROY]),
494-
initData: (initData: Record<string, unknown>) => publish([ChannelEventType.INIT_DATA, JSON.stringify(initData)]),
495482

496483
onWindowResize: (
497484
cb: (res: { width: number; height: number; devicePixelRatio: number }) => void,
@@ -632,11 +619,10 @@ export const MessageChannelDataSide = (
632619
performanceStartTrace: (index: number) => publish([ChannelEventType.PERFORMANCE_START_TRACE, index]),
633620
performanceEndTrace: (id: number, cb: (stats: { startTimestamp: number; endTimestamp: number }) => void,) => publish([ChannelEventType.PERFORMANCE_END_TRACE, id, callback2id(cb)]),
634621

635-
setWXSListenerStats: (elementId: number, eventName: string, final: boolean, mutated: boolean, capture: boolean, lvaluePath: (string | number)[]) => publish([ChannelEventType.SET_WXS_LISTENER_STATS, elementId, eventName, final, mutated, capture, lvaluePath]),
636-
callWXSPropChangeListener: (elementId: number, newValue: any, oldValue: any, lvaluePath: (string | number)[]) => publish([ChannelEventType.CALL_WXS_PROP_CHANGE_LISTENER, elementId, newValue, oldValue, lvaluePath]),
637-
onWXSCallMethod: (handler: (elementId: number, method: string, args: unknown[]) => void) => {
638-
handleWXSCallMethod = handler
639-
},
622+
callCustomMethod: (elementId: number | null, options: any) => publish([ChannelEventType.CUSTOM_METHOD, elementId, options]),
623+
onCustenMethod: (handler: (elementId: number | null, options: any) => void) => {
624+
handleCustomMethod = handler
625+
}
640626
}
641627
}
642628

@@ -721,12 +707,12 @@ export const MessageChannelViewSide = (
721707
}
722708
}
723709

724-
const wxsCallMethodHandler = (elem: Element, method: string, args: any[]) => {
725-
const elemId = getNodeId(elem)!
726-
publish([ChannelEventType.ON_WXS_CALL_METHOD, elemId, method, JSON.stringify(args)])
710+
const sendCustomMethodHandler = (elem: Element | null, options: any) => {
711+
const elemId = elem ? getNodeId(elem)! : null
712+
publish([ChannelEventType.CUSTOM_METHOD, elemId, options])
727713
}
728714

729-
controller.setWXSCallMethodHandler(wxsCallMethodHandler)
715+
controller.onCustomMethod(sendCustomMethodHandler)
730716

731717
// eslint-disable-next-line consistent-return
732718
subscribe((arg) => {
@@ -748,11 +734,6 @@ export const MessageChannelViewSide = (
748734
case ChannelEventType.DESTROY:
749735
controller.destroy()
750736
break
751-
case ChannelEventType.INIT_DATA: {
752-
const [, initData] = arg
753-
controller.initData(JSON.parse(initData))
754-
break
755-
}
756737
case ChannelEventType.ON_WINDOW_RESIZE: {
757738
const [, callbackId] = arg
758739
controller.onWindowResize(({ width, height, devicePixelRatio }) => {
@@ -1246,24 +1227,10 @@ export const MessageChannelViewSide = (
12461227
})
12471228
break
12481229
}
1249-
case ChannelEventType.SET_WXS_LISTENER_STATS: {
1250-
const [, elementId, eventName, final, mutated, capture, lvaluePath] = arg
1251-
const element = nodeMap[elementId]! as Element
1252-
controller.setWXSListenerStats(
1253-
element,
1254-
eventName,
1255-
final,
1256-
mutated,
1257-
capture,
1258-
lvaluePath,
1259-
eventHandler,
1260-
)
1261-
break
1262-
}
1263-
case ChannelEventType.CALL_WXS_PROP_CHANGE_LISTENER: {
1264-
const [, elementId, newValue, oldValue, lvaluepath] = arg
1265-
const element = nodeMap[elementId]! as Element
1266-
controller.callWXSPropChangeListener(element, newValue, oldValue, lvaluepath)
1230+
case ChannelEventType.CUSTOM_METHOD: {
1231+
const [, elementId, options] = arg
1232+
const element = elementId ? (nodeMap[elementId]! as Element) : null
1233+
controller.handleCustomMethod(element, options)
12671234
break
12681235
}
12691236
default:

glass-easel-shadow-sync/src/replay.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ export interface ReplayHandler {
55
ownerShadowRoot: ShadowBackend.ShadowRootContext,
66
elem: Node,
77
): ShadowBackend.Element
8+
afterReplayElement?(
9+
ownerShadowRoot: ShadowBackend.ShadowRootContext,
10+
elem: Node,
11+
be: ShadowBackend.Element,
12+
): void
813
}
914

1015
export function replayShadowBackend(
@@ -74,7 +79,7 @@ export function replayShadowBackend(
7479
if (mutLevel !== undefined) be.setListenerStats(name, false, mutLevel)
7580
if (captureMutLevel !== undefined) be.setListenerStats(name, true, captureMutLevel)
7681
})
77-
const slotName = glassEasel.Element.getSlotName(elem)
82+
const slotName = elem.slot
7883
if (slotName) be.setSlot(slotName)
7984
}
8085

@@ -165,6 +170,7 @@ export function replayShadowBackend(
165170
} else {
166171
throw new Error(`Unknown elem type ${elem.constructor.name}`)
167172
}
173+
handlers.afterReplayElement?.(ownerShadowRoot, elem, be)
168174
backendElementMap.set(elem, be)
169175
return be
170176
}

glass-easel-shadow-sync/src/view_controller.ts

Lines changed: 6 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ export class ViewController {
5858

5959
private _traceStartTimestampMapping = Object.create(null) as Record<number, number>
6060

61-
private _WXSCallMethodHandler:
62-
| ((element: Element, method: string, args: unknown[]) => void)
63-
| undefined
61+
private _customMethodHandler: ((element: Element | null, options: any) => void) | undefined
6462

6563
// eslint-disable-next-line no-useless-constructor
6664
constructor(
@@ -95,10 +93,6 @@ export class ViewController {
9593
//
9694
}
9795

98-
initData(_initData: Record<string, unknown>): void {
99-
//
100-
}
101-
10296
onWindowResize(
10397
cb: (res: { width: number; height: number; devicePixelRatio: number }) => void,
10498
): void {
@@ -662,46 +656,16 @@ export class ViewController {
662656
cb({ startTimestamp, endTimestamp })
663657
}
664658

665-
setWXSListenerStats(
666-
element: Element,
667-
eventName: string,
668-
final: boolean,
669-
mutated: boolean,
670-
capture: boolean,
671-
lvaluePath: (string | number)[],
672-
listener: EventListener<unknown>,
673-
): void {
674-
// To be override
675-
const { _glassEasel } = this
676-
this.setListenerStats(
677-
element,
678-
eventName,
679-
capture,
680-
// eslint-disable-next-line no-nested-ternary
681-
final
682-
? _glassEasel.EventMutLevel.Final
683-
: mutated
684-
? _glassEasel.EventMutLevel.Mut
685-
: _glassEasel.EventMutLevel.None,
686-
listener,
687-
)
688-
}
689-
690-
callWXSPropChangeListener(
691-
_element: Element,
692-
_newValue: any,
693-
_oldValue: any,
694-
_lvaluePath: (string | number)[],
695-
): void {
659+
handleCustomMethod(_element: Element | null, _options: unknown): void {
696660
// To be override
697661
}
698662

699-
setWXSCallMethodHandler(handler: (element: Element, method: string, args: unknown[]) => void) {
700-
this._WXSCallMethodHandler = handler
663+
onCustomMethod(handler: (element: Element | null, options: any) => void) {
664+
this._customMethodHandler = handler
701665
}
702666

703-
onWXSCallMethod(element: Element, method: string, args: unknown[]): void {
704-
this._WXSCallMethodHandler?.(element, method, args)
667+
sendCustomMethod(element: Element | null, options: unknown): void {
668+
this._customMethodHandler?.(element, options)
705669
}
706670
}
707671

0 commit comments

Comments
 (0)