Skip to content

Commit 36e9fcd

Browse files
feat: added native core listener events support (#520)
* feat: subscribe/unsubscribe working * feat: updated uniffi, added support for wasm event listeners 🎉 * chore: reverting app changes * chore: reverting app changes * chore: fixed tests * chore: fixed tests * chore: removed instaceid
1 parent 392f555 commit 36e9fcd

11 files changed

+2614
-2914
lines changed

packages/web/src/core/dotlottie-player.js

Lines changed: 2060 additions & 2577 deletions
Large diffs are not rendered by default.

packages/web/src/core/dotlottie-player.types.ts

Lines changed: 102 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
/* eslint-disable @typescript-eslint/naming-convention */
2+
/* eslint-disable @typescript-eslint/ban-types */
3+
/* eslint-disable typescript-sort-keys/interface */
24
/* eslint-disable @typescript-eslint/no-namespace */
35
// TypeScript bindings for emscripten-generated code. Automatically generated at compile time.
46
declare namespace RuntimeExports {
@@ -73,75 +75,114 @@ export interface OpenUrl {
7375
whitelist: VectorString;
7476
}
7577

78+
export interface Observer extends ClassHandle {
79+
on_complete(): void;
80+
on_frame(_0: number): void;
81+
on_load(): void;
82+
on_load_error(): void;
83+
on_stop(): void;
84+
on_play(): void;
85+
on_loop(_0: number): void;
86+
on_pause(): void;
87+
on_render(_0: number): void;
88+
}
89+
90+
export interface ObserverWrapper extends Observer {
91+
notifyOnDestruction(): void;
92+
}
93+
94+
export interface StateMachineObserver extends ClassHandle {
95+
on_boolean_input_value_change(_0: EmbindString, _1: boolean, _2: boolean): void;
96+
on_custom_event(_0: EmbindString): void;
97+
on_error(_0: EmbindString): void;
98+
on_input_fired(_0: EmbindString): void;
99+
on_state_exit(_0: EmbindString): void;
100+
on_stop(): void;
101+
on_string_input_value_change(_0: EmbindString, _1: EmbindString, _2: EmbindString): void;
102+
on_numeric_input_value_change(_0: EmbindString, _1: number, _2: number): void;
103+
on_start(): void;
104+
on_state_entered(_0: EmbindString): void;
105+
on_transition(_0: EmbindString, _1: EmbindString): void;
106+
}
107+
108+
export interface StateMachineObserverWrapper extends StateMachineObserver {
109+
notifyOnDestruction(): void;
110+
}
111+
76112
export interface DotLottiePlayer extends ClassHandle {
77113
activeAnimationId(): string;
78114
activeStateMachineId(): string;
79115
activeThemeId(): string;
80116
animationSize(): VectorFloat;
81-
buffer(): unknown;
117+
stateMachineSubscribe(_0: StateMachineObserver | null): StateMachineObserver | null;
118+
stateMachineFrameworkSubscribe(_0: StateMachineObserver | null): StateMachineObserver | null;
82119
clear(): void;
83-
config(): Config;
84-
currentFrame(): number;
85-
duration(): number;
86-
getLayerBounds(_0: EmbindString): VectorFloat;
87-
getStateMachine(_0: EmbindString): string;
88-
instanceId(): number;
89-
intersect(_0: number, _1: number, _2: EmbindString): boolean;
90-
isComplete(): boolean;
120+
unsubscribe(_0: Observer | null): void;
121+
stateMachineUnsubscribe(_0: StateMachineObserver | null): void;
122+
stateMachineFrameworkUnsubscribe(_0: StateMachineObserver | null): void;
91123
isLoaded(): boolean;
92124
isPaused(): boolean;
93125
isPlaying(): boolean;
94126
isStopped(): boolean;
95-
isTweening(): boolean;
96-
loadAnimation(_0: EmbindString, _1: number, _2: number): boolean;
97-
loadAnimationData(_0: EmbindString, _1: number, _2: number): boolean;
98-
loadAnimationPath(_0: EmbindString, _1: number, _2: number): boolean;
99-
loadDotLottieData(_0: EmbindString, _1: number, _2: number): boolean;
100-
loopCount(): number;
101-
manifestString(): string;
102-
markers(): VectorMarker;
103127
pause(): boolean;
104128
play(): boolean;
105129
render(): boolean;
106-
requestFrame(): number;
130+
stop(): boolean;
131+
isComplete(): boolean;
107132
resetTheme(): boolean;
133+
stateMachineStart(_0: OpenUrl): boolean;
134+
stateMachineStop(): boolean;
135+
tick(): boolean;
136+
tweenStop(): boolean;
137+
isTweening(): boolean;
138+
setViewport(_0: number, _1: number, _2: number, _3: number): boolean;
139+
loopCount(): number;
108140
resize(_0: number, _1: number): boolean;
141+
tweenUpdate(_0?: number): boolean;
142+
currentFrame(): number;
143+
duration(): number;
144+
requestFrame(): number;
145+
setFrame(_0: number): boolean;
109146
seek(_0: number): boolean;
147+
totalFrames(): number;
110148
segmentDuration(): number;
111-
setConfig(_0: Config): void;
112-
setFrame(_0: number): boolean;
113-
setSlots(_0: EmbindString): boolean;
114-
setTheme(_0: EmbindString): boolean;
115-
setThemeData(_0: EmbindString): boolean;
116-
setViewport(_0: number, _1: number, _2: number, _3: number): boolean;
117-
stateMachineCurrentState(): string;
118-
stateMachineFireEvent(_0: EmbindString): void;
119-
stateMachineFrameworkSetup(): VectorString;
120-
stateMachineGetBooleanInput(_0: EmbindString): boolean;
121-
stateMachineGetNumericInput(_0: EmbindString): number;
122-
stateMachineGetStringInput(_0: EmbindString): string;
123-
stateMachineLoad(_0: EmbindString): boolean;
124-
stateMachineLoadData(_0: EmbindString): boolean;
125-
stateMachineOverrideCurrentState(_0: EmbindString, _1: boolean): boolean;
149+
tween(_0: number, _1?: number, _2?: VectorFloat): boolean;
126150
stateMachinePostClickEvent(_0: number, _1: number): number;
127151
stateMachinePostPointerDownEvent(_0: number, _1: number): number;
152+
stateMachinePostPointerUpEvent(_0: number, _1: number): number;
153+
stateMachinePostPointerMoveEvent(_0: number, _1: number): number;
128154
stateMachinePostPointerEnterEvent(_0: number, _1: number): number;
129155
stateMachinePostPointerExitEvent(_0: number, _1: number): number;
130-
stateMachinePostPointerMoveEvent(_0: number, _1: number): number;
131-
stateMachinePostPointerUpEvent(_0: number, _1: number): number;
156+
config(): Config;
157+
setConfig(_0: Config): void;
158+
loadAnimationData(_0: EmbindString, _1: number, _2: number): boolean;
159+
loadAnimationPath(_0: EmbindString, _1: number, _2: number): boolean;
160+
loadDotLottieData(_0: EmbindString, _1: number, _2: number): boolean;
161+
loadAnimation(_0: EmbindString, _1: number, _2: number): boolean;
162+
manifestString(): string;
163+
setTheme(_0: EmbindString): boolean;
164+
setThemeData(_0: EmbindString): boolean;
165+
setSlots(_0: EmbindString): boolean;
166+
markers(): VectorMarker;
167+
subscribe(_0: Observer | null): Observer | null;
168+
stateMachineLoad(_0: EmbindString): boolean;
132169
stateMachineSetBooleanInput(_0: EmbindString, _1: boolean): boolean;
170+
stateMachineFireEvent(_0: EmbindString): void;
133171
stateMachineSetNumericInput(_0: EmbindString, _1: number): boolean;
134172
stateMachineSetStringInput(_0: EmbindString, _1: EmbindString): boolean;
135-
stateMachineStart(_0: OpenUrl): boolean;
136-
stateMachineStatus(): string;
137-
stateMachineStop(): boolean;
138-
stop(): boolean;
139-
tick(): boolean;
140-
totalFrames(): number;
141-
tween(_0: number, _1?: number, _2?: VectorFloat): boolean;
142-
tweenStop(): boolean;
173+
stateMachineLoadData(_0: EmbindString): boolean;
174+
stateMachineGetNumericInput(_0: EmbindString): number;
175+
stateMachineGetStringInput(_0: EmbindString): string;
176+
stateMachineGetBooleanInput(_0: EmbindString): boolean;
177+
intersect(_0: number, _1: number, _2: EmbindString): boolean;
178+
getLayerBounds(_0: EmbindString): VectorFloat;
143179
tweenToMarker(_0: EmbindString, _1?: number, _2?: VectorFloat): boolean;
144-
tweenUpdate(_0?: number): boolean;
180+
getStateMachine(_0: EmbindString): string;
181+
stateMachineFrameworkSetup(): VectorString;
182+
stateMachineCurrentState(): string;
183+
stateMachineOverrideCurrentState(_0: EmbindString, _1: boolean): boolean;
184+
stateMachineStatus(): string;
185+
buffer(): unknown;
145186
}
146187

147188
export interface Marker {
@@ -156,9 +197,9 @@ export interface Config {
156197
layout: Layout;
157198
loopAnimation: boolean;
158199
marker: EmbindString;
159-
mode: Mode;
160200
segment: VectorFloat;
161201
speed: number;
202+
mode: Mode;
162203
stateMachineId: EmbindString;
163204
themeId: EmbindString;
164205
useFrameInterpolation: boolean;
@@ -176,20 +217,30 @@ interface EmbindModule {
176217
FitWidth: FitValue<4>;
177218
None: FitValue<6>;
178219
};
179-
Mode: { Bounce: ModeValue<3>; Forward: ModeValue<1>; Reverse: ModeValue<2>; ReverseBounce: ModeValue<4> };
180-
OpenUrlMode: { Allow: OpenUrlModeValue<3>; Deny: OpenUrlModeValue<1>; Interaction: OpenUrlModeValue<2> };
181-
VectorFloat: {
182-
new (): VectorFloat;
220+
Mode: { Bounce: ModeValue<3>; Reverse: ModeValue<2>; Forward: ModeValue<1>; ReverseBounce: ModeValue<4> };
221+
Observer: {
222+
extend(_0: EmbindString, _1: unknown): unknown;
223+
implement(_0: unknown): ObserverWrapper;
183224
};
184225
VectorMarker: {
185226
new (): VectorMarker;
186227
};
228+
OpenUrlMode: { Allow: OpenUrlModeValue<3>; Interaction: OpenUrlModeValue<2>; Deny: OpenUrlModeValue<1> };
229+
createDefaultLayout(): Layout;
230+
createDefaultOpenURL(): OpenUrl;
187231
VectorString: {
188232
new (): VectorString;
189233
};
234+
ObserverWrapper: {};
235+
StateMachineObserver: {
236+
extend(_0: EmbindString, _1: unknown): unknown;
237+
implement(_0: unknown): StateMachineObserverWrapper;
238+
};
239+
StateMachineObserverWrapper: {};
240+
VectorFloat: {
241+
new (): VectorFloat;
242+
};
190243
createDefaultConfig(): Config;
191-
createDefaultLayout(): Layout;
192-
createDefaultOpenURL(): OpenUrl;
193244
transformThemeToLottieSlots(_0: EmbindString, _1: EmbindString): string;
194245
}
195246

265 KB
Binary file not shown.

packages/web/src/core/dotlottie-wasm-loader.ts

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,20 @@ import { PACKAGE_NAME, PACKAGE_VERSION } from '../constants';
44
import createDotLottiePlayerModule from './dotlottie-player';
55
import type { MainModule } from './dotlottie-player.types';
66

7-
// Define the bridge interface
8-
export interface DotLottieBridge {
9-
observer_on_complete: (dotlottie_instance_id: number) => void;
10-
observer_on_frame: (dotlottie_instance_id: number, frame_no: number) => void;
11-
observer_on_load: (dotlottie_instance_id: number) => void;
12-
observer_on_load_error: (dotlottie_instance_id: number) => void;
13-
observer_on_loop: (dotlottie_instance_id: number, loop_count: number) => void;
14-
observer_on_pause: (dotlottie_instance_id: number) => void;
15-
observer_on_play: (dotlottie_instance_id: number) => void;
16-
observer_on_render: (dotlottie_instance_id: number, frame_no: number) => void;
17-
observer_on_stop: (dotlottie_instance_id: number) => void;
18-
state_machine_observer_on_boolean_input_value_change: (
19-
dotlottie_instance_id: number,
20-
input_name: string,
21-
old_value: boolean,
22-
new_value: boolean,
23-
) => void;
24-
state_machine_observer_on_custom_event: (dotlottie_instance_id: number, message: string) => void;
25-
state_machine_observer_on_error: (dotlottie_instance_id: number, message: string) => void;
26-
state_machine_observer_on_input_fired: (dotlottie_instance_id: number, input_name: string) => void;
27-
state_machine_observer_on_numeric_input_value_change: (
28-
dotlottie_instance_id: number,
29-
input_name: string,
30-
old_value: number,
31-
new_value: number,
32-
) => void;
33-
state_machine_observer_on_start: (dotlottie_instance_id: number) => void;
34-
state_machine_observer_on_state_entered: (dotlottie_instance_id: number, entering_state: string) => void;
35-
state_machine_observer_on_state_exit: (dotlottie_instance_id: number, exiting_state: string) => void;
36-
state_machine_observer_on_stop: (dotlottie_instance_id: number) => void;
37-
state_machine_observer_on_string_input_value_change: (
38-
dotlottie_instance_id: number,
39-
input_name: string,
40-
old_value: string,
41-
new_value: string,
42-
) => void;
43-
state_machine_observer_on_transition: (
44-
dotlottie_instance_id: number,
45-
previous_state: string,
46-
new_state: string,
47-
) => void;
48-
}
49-
507
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
518
export class DotLottieWasmLoader {
529
private static _ModulePromise: Promise<MainModule> | null = null;
5310

5411
// URL for the WASM file, constructed using package information
5512
private static _wasmURL = `https://cdn.jsdelivr.net/npm/${PACKAGE_NAME}@${PACKAGE_VERSION}/dist/dotlottie-player.wasm`;
5613

57-
private static _bridge: DotLottieBridge | null = null;
58-
5914
private constructor() {
6015
throw new Error('RendererLoader is a static class and cannot be instantiated.');
6116
}
6217

6318
private static async _tryLoad(url: string): Promise<MainModule> {
6419
const module = await createDotLottiePlayerModule({
6520
locateFile: () => url,
66-
// Pass the bridge to the module if it exists
67-
dotlottieBridge: this._bridge || undefined,
6821
});
6922

7023
return module;
@@ -96,27 +49,7 @@ export class DotLottieWasmLoader {
9649
return this._ModulePromise;
9750
}
9851

99-
/**
100-
* Sets the callback bridge for the DotLottie player
101-
* @param bridge - The bridge object containing all callback implementations
102-
*/
103-
public static setBridge(bridge: DotLottieBridge): void {
104-
this._bridge = bridge;
105-
106-
// Invalidate current module promise to ensure next load uses new bridge
107-
// this._ModulePromise = null;
108-
}
109-
110-
/**
111-
* Public method to load the WebAssembly module.
112-
* @param bridge - Optional bridge object to set before loading
113-
* @returns Promise<Module> - A promise that resolves to the loaded module.
114-
*/
115-
public static async load(bridge?: DotLottieBridge): Promise<MainModule> {
116-
if (bridge) {
117-
this.setBridge(bridge);
118-
}
119-
52+
public static async load(): Promise<MainModule> {
12053
return this._loadWithBackup();
12154
}
12255

0 commit comments

Comments
 (0)