drgame-cc 1.0.62 → 1.0.64
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/drres/focus/focus_1/gesture.atlas +34 -34
- package/drres/focus/focus_2/gesture.atlas +41 -41
- package/drres/focus/focus_3/gesture.atlas +34 -34
- package/drres/focus/focus_4/gesture.atlas +20 -20
- package/drres/prefab/HelperWin.prefab +508 -508
- package/drscript/PlatformAdapter.ts +2 -2
- package/drscript/ad-sdk/README.md +78 -12
- package/drscript/ad-sdk/ad-sdk.ts +417 -0
- package/drscript/ad-sdk/ad-sdk.ts.meta +10 -0
- package/drscript/ad-sdk/adapters/xiaomi-adapter.ts +497 -0
- package/drscript/ad-sdk/adapters/{xiaomi-adapter.js.meta → xiaomi-adapter.ts.meta} +9 -9
- package/drscript/ad-sdk/event-emitter.ts +66 -0
- package/drscript/ad-sdk/event-emitter.ts.meta +10 -0
- package/drscript/ad-sdk/leaderboard/leaderboard.ts +228 -0
- package/drscript/ad-sdk/leaderboard/leaderboard.ts.meta +10 -0
- package/drscript/ad-sdk/package.json +18 -17
- package/drscript/ad-sdk/reporters/reporter.ts +515 -0
- package/drscript/ad-sdk/reporters/reporter.ts.meta +10 -0
- package/drscript/ad-sdk/reporters/superset-lewo.ts +464 -0
- package/drscript/ad-sdk/reporters/superset-lewo.ts.meta +10 -0
- package/drscript/ad-sdk/types/enums.ts +103 -0
- package/drscript/ad-sdk/types/enums.ts.meta +10 -0
- package/drscript/ad-sdk/types/{index.d.ts → index.ts} +1 -1
- package/drscript/ad-sdk/types/index.ts.meta +10 -0
- package/drscript/ad-sdk/types/{interfaces.d.ts → interfaces.ts} +63 -10
- package/drscript/ad-sdk/types/interfaces.ts.meta +10 -0
- package/drscript/ad-sdk/user-gamedata/user-gamedata.ts +219 -0
- package/drscript/ad-sdk/user-gamedata/user-gamedata.ts.meta +10 -0
- package/drscript/ad-sdk/user-gamedata.meta +13 -0
- package/package.json +1 -1
- package/drscript/ad-sdk/ad-sdk.d.ts +0 -59
- package/drscript/ad-sdk/ad-sdk.js +0 -338
- package/drscript/ad-sdk/adapters/xiaomi-adapter.d.ts +0 -29
- package/drscript/ad-sdk/adapters/xiaomi-adapter.d.ts.meta +0 -6
- package/drscript/ad-sdk/adapters/xiaomi-adapter.js +0 -452
- package/drscript/ad-sdk/event-emitter.d.ts +0 -12
- package/drscript/ad-sdk/event-emitter.js +0 -65
- package/drscript/ad-sdk/leaderboard/leaderboard.d.ts +0 -23
- package/drscript/ad-sdk/leaderboard/leaderboard.js +0 -193
- package/drscript/ad-sdk/reporters/reporter.d.ts +0 -85
- package/drscript/ad-sdk/reporters/reporter.js +0 -500
- package/drscript/ad-sdk/reporters/superset-lewo.js +0 -574
- package/drscript/ad-sdk/types/enums.d.ts +0 -66
- package/drscript/ad-sdk/types/enums.js +0 -113
- package/drscript/ad-sdk/types/index.js +0 -15
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聚合广告 SDK - 小米电视适配器
|
|
3
|
+
*
|
|
4
|
+
* 底层通过 JSBridge 与电视应用商店客户端通信:
|
|
5
|
+
* H5 → Native: window.AppBridge.call(json)
|
|
6
|
+
* Native → H5: window.onNativeBridgeCallback(action, data)
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { AdPlatform, AdEvent, AdErrorCode } from '../types/enums';
|
|
10
|
+
import { EventEmitter } from '../event-emitter';
|
|
11
|
+
import {
|
|
12
|
+
IAdAdapter,
|
|
13
|
+
IAdapterConfig,
|
|
14
|
+
IAdRequest,
|
|
15
|
+
IAdRewardResult,
|
|
16
|
+
IDeviceInfo,
|
|
17
|
+
IAccountInfo,
|
|
18
|
+
IEventHandler,
|
|
19
|
+
} from '../types/interfaces';
|
|
20
|
+
const KEY_EVENT_NAME = '__key_event__';
|
|
21
|
+
|
|
22
|
+
// ────────────────────────────────────────
|
|
23
|
+
// 内部类型
|
|
24
|
+
// ────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
interface PromiseEntry<T> {
|
|
27
|
+
resolve: (value: T) => void;
|
|
28
|
+
reject: (reason?: any) => void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface KeyEvent {
|
|
32
|
+
key: string;
|
|
33
|
+
action: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface BridgeMessage {
|
|
37
|
+
action: string;
|
|
38
|
+
data: Record<string, any>;
|
|
39
|
+
callbackId?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface NativeCallbackData {
|
|
43
|
+
callbackId?: string;
|
|
44
|
+
code?: number;
|
|
45
|
+
message?: string;
|
|
46
|
+
data?: any;
|
|
47
|
+
is_completed?: boolean;
|
|
48
|
+
key?: string;
|
|
49
|
+
action?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ────────────────────────────────────────
|
|
53
|
+
// JSBridge 底层封装
|
|
54
|
+
// ────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
/** 获取 JSBridge 全局对象 */
|
|
57
|
+
function getAppBridge(): any {
|
|
58
|
+
if (typeof window === 'undefined') return null;
|
|
59
|
+
return (window as any).AppBridge || null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** 检测是否在原生环境中 */
|
|
63
|
+
function isNativeEnv(): boolean {
|
|
64
|
+
return !!getAppBridge();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** 调用 JSBridge */
|
|
68
|
+
function bridgeCall(msg: BridgeMessage): void {
|
|
69
|
+
const bridge = getAppBridge();
|
|
70
|
+
if (!bridge) {
|
|
71
|
+
console.warn('[AdSdk:Xiaomi] Not in native environment, bridge call ignored.');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
bridge.call(JSON.stringify(msg));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ────────────────────────────────────────
|
|
78
|
+
// 适配器实现
|
|
79
|
+
// ────────────────────────────────────────
|
|
80
|
+
|
|
81
|
+
export class XiaomiAdapter implements IAdAdapter {
|
|
82
|
+
readonly platform: AdPlatform;
|
|
83
|
+
|
|
84
|
+
_config: IAdapterConfig;
|
|
85
|
+
_emitter: EventEmitter;
|
|
86
|
+
_cbId: number;
|
|
87
|
+
_callbacks: Map<string, PromiseEntry<IAdRewardResult>>;
|
|
88
|
+
_deviceCallbacks: Map<string, PromiseEntry<IDeviceInfo>>;
|
|
89
|
+
_accountCallbacks: Map<string, PromiseEntry<IAccountInfo>>;
|
|
90
|
+
_adInProgress: boolean;
|
|
91
|
+
_originalCallback: ((action: string, data: NativeCallbackData) => void) | null;
|
|
92
|
+
_exitResolve: (() => void) | null;
|
|
93
|
+
_keyHandlers: Array<(e: KeyEvent) => void>;
|
|
94
|
+
|
|
95
|
+
constructor() {
|
|
96
|
+
this.platform = AdPlatform.Xiaomi;
|
|
97
|
+
this._config = {};
|
|
98
|
+
this._emitter = new EventEmitter();
|
|
99
|
+
this._cbId = 0;
|
|
100
|
+
this._callbacks = new Map();
|
|
101
|
+
this._deviceCallbacks = new Map();
|
|
102
|
+
this._accountCallbacks = new Map();
|
|
103
|
+
this._adInProgress = false;
|
|
104
|
+
this._originalCallback = null;
|
|
105
|
+
this._exitResolve = null;
|
|
106
|
+
this._keyHandlers = [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 初始化适配器
|
|
111
|
+
*/
|
|
112
|
+
async init(config: IAdapterConfig): Promise<void> {
|
|
113
|
+
this._config = config || {};
|
|
114
|
+
|
|
115
|
+
// 保存已有的 onNativeBridgeCallback,避免覆盖
|
|
116
|
+
if (typeof window !== 'undefined' && (window as any).onNativeBridgeCallback) {
|
|
117
|
+
this._originalCallback = (window as any).onNativeBridgeCallback;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 注册全局回调
|
|
121
|
+
const self = this;
|
|
122
|
+
(window as any).onNativeBridgeCallback = function (action: string, data: NativeCallbackData) {
|
|
123
|
+
// 先调用原有回调
|
|
124
|
+
if (self._originalCallback) {
|
|
125
|
+
try {
|
|
126
|
+
self._originalCallback(action, data);
|
|
127
|
+
} catch (_) {
|
|
128
|
+
// ignore
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
self._handleNativeCallback(action, data);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
console.log('[AdSdk:Xiaomi] Adapter initialized.');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 请求播放广告
|
|
139
|
+
*/
|
|
140
|
+
requestAd(request: IAdRequest): Promise<IAdRewardResult> {
|
|
141
|
+
const self = this;
|
|
142
|
+
return new Promise(function (resolve, reject) {
|
|
143
|
+
if (!isNativeEnv()) {
|
|
144
|
+
reject({
|
|
145
|
+
code: AdErrorCode.PlatformNotSupported,
|
|
146
|
+
message: 'Not in native JSBridge environment',
|
|
147
|
+
platform: self.platform,
|
|
148
|
+
requestId: '',
|
|
149
|
+
});
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (self._adInProgress) {
|
|
154
|
+
reject({
|
|
155
|
+
code: AdErrorCode.AdInProgress,
|
|
156
|
+
message: 'An ad is already in progress',
|
|
157
|
+
platform: self.platform,
|
|
158
|
+
requestId: '',
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
self._adInProgress = true;
|
|
164
|
+
const callbackId = 'ad_' + (++self._cbId);
|
|
165
|
+
|
|
166
|
+
self._callbacks.set(callbackId, { resolve: resolve, reject: reject });
|
|
167
|
+
|
|
168
|
+
// 发出 loaded 事件
|
|
169
|
+
self._emitter.emit(AdEvent.Loaded, { request: request as any });
|
|
170
|
+
|
|
171
|
+
bridgeCall({
|
|
172
|
+
action: 'requestAd',
|
|
173
|
+
data: {
|
|
174
|
+
cp_id: request.cpId || self._config.cpId,
|
|
175
|
+
reward_type: request.rewardType,
|
|
176
|
+
trigger_scene: request.triggerScene,
|
|
177
|
+
...(request.extra || {}),
|
|
178
|
+
},
|
|
179
|
+
callbackId: callbackId,
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 获取设备信息
|
|
186
|
+
*/
|
|
187
|
+
getDeviceInfo(): Promise<IDeviceInfo> {
|
|
188
|
+
const self = this;
|
|
189
|
+
return new Promise(function (resolve, reject) {
|
|
190
|
+
if (!isNativeEnv()) {
|
|
191
|
+
reject({
|
|
192
|
+
code: AdErrorCode.PlatformNotSupported,
|
|
193
|
+
message: 'Not in native JSBridge environment',
|
|
194
|
+
platform: self.platform,
|
|
195
|
+
requestId: '',
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const callbackId = 'dev_' + (++self._cbId);
|
|
201
|
+
self._deviceCallbacks.set(callbackId, { resolve: resolve, reject: reject });
|
|
202
|
+
|
|
203
|
+
bridgeCall({
|
|
204
|
+
action: 'getDeviceInfo',
|
|
205
|
+
data: {},
|
|
206
|
+
callbackId: callbackId,
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* 获取玩家账户信息
|
|
213
|
+
*/
|
|
214
|
+
getAccount(): Promise<IAccountInfo> {
|
|
215
|
+
const self = this;
|
|
216
|
+
return new Promise(function (resolve, reject) {
|
|
217
|
+
if (!isNativeEnv()) {
|
|
218
|
+
reject({
|
|
219
|
+
code: AdErrorCode.PlatformNotSupported,
|
|
220
|
+
message: 'Not in native JSBridge environment',
|
|
221
|
+
platform: self.platform,
|
|
222
|
+
requestId: '',
|
|
223
|
+
});
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const callbackId = 'acc_' + (++self._cbId);
|
|
228
|
+
self._accountCallbacks.set(callbackId, { resolve: resolve, reject: reject });
|
|
229
|
+
|
|
230
|
+
bridgeCall({
|
|
231
|
+
action: 'getAccount',
|
|
232
|
+
data: {},
|
|
233
|
+
callbackId: callbackId,
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 通知游戏加载完成
|
|
240
|
+
*/
|
|
241
|
+
onGameReady(version: string): void {
|
|
242
|
+
bridgeCall({
|
|
243
|
+
action: 'onGameReady',
|
|
244
|
+
data: { version: version },
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/** 通知游戏暂停 */
|
|
249
|
+
onGamePause(): void {
|
|
250
|
+
bridgeCall({
|
|
251
|
+
action: 'onGamePause',
|
|
252
|
+
data: {},
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** 通知游戏恢复 */
|
|
257
|
+
onGameResume(): void {
|
|
258
|
+
bridgeCall({
|
|
259
|
+
action: 'onGameResume',
|
|
260
|
+
data: {},
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* 退出游戏
|
|
266
|
+
*/
|
|
267
|
+
exitGame(): Promise<void> {
|
|
268
|
+
const self = this;
|
|
269
|
+
return new Promise<void>(function (resolve) {
|
|
270
|
+
if (!isNativeEnv()) {
|
|
271
|
+
resolve();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
self._exitResolve = resolve;
|
|
275
|
+
bridgeCall({
|
|
276
|
+
action: 'exitGame',
|
|
277
|
+
data: {},
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* 监听遥控器按键事件
|
|
284
|
+
*/
|
|
285
|
+
onKeyEvent(handler: (e: KeyEvent) => void): void {
|
|
286
|
+
if (typeof handler === 'function' && this._keyHandlers.indexOf(handler) === -1) {
|
|
287
|
+
this._keyHandlers.push(handler);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* 取消监听遥控器按键事件
|
|
293
|
+
*/
|
|
294
|
+
offKeyEvent(handler?: (e: KeyEvent) => void): void {
|
|
295
|
+
if (!handler) {
|
|
296
|
+
this._keyHandlers = [];
|
|
297
|
+
} else {
|
|
298
|
+
const idx = this._keyHandlers.indexOf(handler);
|
|
299
|
+
if (idx !== -1) {
|
|
300
|
+
this._keyHandlers.splice(idx, 1);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 监听事件
|
|
307
|
+
*/
|
|
308
|
+
on(event: AdEvent, handler: IEventHandler): void {
|
|
309
|
+
this._emitter.on(event, handler);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* 取消事件
|
|
314
|
+
*/
|
|
315
|
+
off(event: AdEvent, handler?: IEventHandler): void {
|
|
316
|
+
this._emitter.off(event, handler);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** 销毁适配器 */
|
|
320
|
+
destroy(): void {
|
|
321
|
+
this._callbacks.clear();
|
|
322
|
+
this._deviceCallbacks.clear();
|
|
323
|
+
this._accountCallbacks.clear();
|
|
324
|
+
this._emitter.removeAllListeners();
|
|
325
|
+
this._adInProgress = false;
|
|
326
|
+
this._exitResolve = null;
|
|
327
|
+
this._keyHandlers = [];
|
|
328
|
+
|
|
329
|
+
// 恢复原有回调
|
|
330
|
+
if (this._originalCallback && typeof window !== 'undefined') {
|
|
331
|
+
(window as any).onNativeBridgeCallback = this._originalCallback;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ────────────────────────────────────────
|
|
336
|
+
// 内部方法
|
|
337
|
+
// ────────────────────────────────────────
|
|
338
|
+
|
|
339
|
+
/** @private 处理 Native 回调 */
|
|
340
|
+
_handleNativeCallback(action: string, data: NativeCallbackData): void {
|
|
341
|
+
console.log(`[AdSdk:Xiaomi] Received native callback: ${action}`, data);
|
|
342
|
+
switch (action) {
|
|
343
|
+
// ── 通用回调(getDeviceInfo / getAccount 等) ──
|
|
344
|
+
case 'onBridgeCallback': {
|
|
345
|
+
const cbId = data.callbackId;
|
|
346
|
+
const code = data.code;
|
|
347
|
+
|
|
348
|
+
// getDeviceInfo 回调
|
|
349
|
+
if (cbId && this._deviceCallbacks.has(cbId)) {
|
|
350
|
+
const entry = this._deviceCallbacks.get(cbId);
|
|
351
|
+
this._deviceCallbacks.delete(cbId);
|
|
352
|
+
if (entry) {
|
|
353
|
+
if (code === 0) {
|
|
354
|
+
entry.resolve(data.data || {});
|
|
355
|
+
} else {
|
|
356
|
+
entry.reject({
|
|
357
|
+
code: code,
|
|
358
|
+
message: data.message || 'getDeviceInfo failed',
|
|
359
|
+
platform: this.platform,
|
|
360
|
+
requestId: cbId,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// getAccount 回调
|
|
368
|
+
if (cbId && this._accountCallbacks.has(cbId)) {
|
|
369
|
+
const entry = this._accountCallbacks.get(cbId);
|
|
370
|
+
this._accountCallbacks.delete(cbId);
|
|
371
|
+
if (entry) {
|
|
372
|
+
if (code === 0) {
|
|
373
|
+
entry.resolve(data.data || {});
|
|
374
|
+
} else {
|
|
375
|
+
entry.reject({
|
|
376
|
+
code: code,
|
|
377
|
+
message: data.message || 'getAccount failed',
|
|
378
|
+
platform: this.platform,
|
|
379
|
+
requestId: cbId,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// ── 广告奖励 ──
|
|
389
|
+
case 'onReward': {
|
|
390
|
+
const cbId = data.callbackId;
|
|
391
|
+
const result: IAdRewardResult = {
|
|
392
|
+
isCompleted: true,
|
|
393
|
+
requestId: cbId,
|
|
394
|
+
};
|
|
395
|
+
this._adInProgress = false;
|
|
396
|
+
|
|
397
|
+
this._emitter.emit(AdEvent.Reward, result as any);
|
|
398
|
+
|
|
399
|
+
if (cbId && this._callbacks.has(cbId)) {
|
|
400
|
+
const entry = this._callbacks.get(cbId);
|
|
401
|
+
this._callbacks.delete(cbId);
|
|
402
|
+
if (entry) entry.resolve(result);
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// ── 广告关闭 ──
|
|
408
|
+
case 'onAdClosed': {
|
|
409
|
+
const cbId = data.callbackId;
|
|
410
|
+
const isCompleted = !!data.is_completed;
|
|
411
|
+
const closedResult: IAdRewardResult = {
|
|
412
|
+
isCompleted: isCompleted,
|
|
413
|
+
requestId: cbId,
|
|
414
|
+
};
|
|
415
|
+
this._adInProgress = false;
|
|
416
|
+
|
|
417
|
+
this._emitter.emit(AdEvent.Closed, closedResult as any);
|
|
418
|
+
|
|
419
|
+
if (cbId && this._callbacks.has(cbId)) {
|
|
420
|
+
const entry = this._callbacks.get(cbId);
|
|
421
|
+
this._callbacks.delete(cbId);
|
|
422
|
+
|
|
423
|
+
if (entry) {
|
|
424
|
+
if (isCompleted) {
|
|
425
|
+
entry.resolve({
|
|
426
|
+
isCompleted: true,
|
|
427
|
+
requestId: cbId,
|
|
428
|
+
});
|
|
429
|
+
} else {
|
|
430
|
+
entry.reject({
|
|
431
|
+
code: AdErrorCode.Unknown,
|
|
432
|
+
message: 'Ad closed by user before completion',
|
|
433
|
+
platform: this.platform,
|
|
434
|
+
requestId: cbId,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// ── 广告失败 ──
|
|
443
|
+
case 'onAdFailed': {
|
|
444
|
+
const cbId = data.callbackId;
|
|
445
|
+
const errorCode = data.code;
|
|
446
|
+
const errorMsg = data.message;
|
|
447
|
+
this._adInProgress = false;
|
|
448
|
+
|
|
449
|
+
const adError = {
|
|
450
|
+
code: errorCode,
|
|
451
|
+
message: errorMsg,
|
|
452
|
+
platform: this.platform,
|
|
453
|
+
requestId: cbId,
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
this._emitter.emit(AdEvent.Error, adError as any);
|
|
457
|
+
|
|
458
|
+
if (cbId && this._callbacks.has(cbId)) {
|
|
459
|
+
const entry = this._callbacks.get(cbId);
|
|
460
|
+
this._callbacks.delete(cbId);
|
|
461
|
+
if (entry) entry.reject(adError);
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// ── 退出确认 ──
|
|
467
|
+
case 'onExitConfirmed': {
|
|
468
|
+
// 触发退出回调事件,供 SDK 层调用 reporter 上报
|
|
469
|
+
this._emitter.emit(AdEvent.Exit, {} as any);
|
|
470
|
+
|
|
471
|
+
if (this._exitResolve) {
|
|
472
|
+
this._exitResolve();
|
|
473
|
+
this._exitResolve = null;
|
|
474
|
+
}
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// ── 遥控器按键 ──
|
|
479
|
+
case 'onKeyEvent': {
|
|
480
|
+
const keyEvent: KeyEvent = {
|
|
481
|
+
key: data.key || '',
|
|
482
|
+
action: data.action || 'down',
|
|
483
|
+
};
|
|
484
|
+
for (let i = 0; i < this._keyHandlers.length; i++) {
|
|
485
|
+
try {
|
|
486
|
+
this._keyHandlers[i](keyEvent);
|
|
487
|
+
} catch (e) {
|
|
488
|
+
console.error('[AdSdk:Xiaomi] Key event handler error:', e);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export default XiaomiAdapter;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ver": "1.1.0",
|
|
3
|
-
"uuid": "72fd9cee-f479-4c1e-92c6-77c6923080ee",
|
|
4
|
-
"importer": "
|
|
5
|
-
"isPlugin": false,
|
|
6
|
-
"loadPluginInWeb": true,
|
|
7
|
-
"loadPluginInNative": true,
|
|
8
|
-
"loadPluginInEditor": false,
|
|
9
|
-
"subMetas": {}
|
|
1
|
+
{
|
|
2
|
+
"ver": "1.1.0",
|
|
3
|
+
"uuid": "72fd9cee-f479-4c1e-92c6-77c6923080ee",
|
|
4
|
+
"importer": "typescript",
|
|
5
|
+
"isPlugin": false,
|
|
6
|
+
"loadPluginInWeb": true,
|
|
7
|
+
"loadPluginInNative": true,
|
|
8
|
+
"loadPluginInEditor": false,
|
|
9
|
+
"subMetas": {}
|
|
10
10
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聚合广告 SDK - 简易事件发射器
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { AdEvent, IAdEventData, IEventHandler } from './types';
|
|
6
|
+
|
|
7
|
+
export class EventEmitter {
|
|
8
|
+
_handlers: Map<string, Set<IEventHandler>>;
|
|
9
|
+
|
|
10
|
+
constructor() {
|
|
11
|
+
this._handlers = new Map();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 监听事件
|
|
16
|
+
* @param {string} event - 事件名(AdEvent 枚举值)
|
|
17
|
+
* @param {IEventHandler} handler - 事件处理函数
|
|
18
|
+
*/
|
|
19
|
+
on(event: AdEvent, handler: IEventHandler): void {
|
|
20
|
+
if (!this._handlers.has(event)) {
|
|
21
|
+
this._handlers.set(event, new Set());
|
|
22
|
+
}
|
|
23
|
+
(this._handlers.get(event) as Set<IEventHandler>).add(handler);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 取消监听
|
|
28
|
+
* @param {string} event - 事件名
|
|
29
|
+
* @param {IEventHandler} [handler] - 不传则移除该事件所有监听
|
|
30
|
+
*/
|
|
31
|
+
off(event: AdEvent, handler?: IEventHandler): void {
|
|
32
|
+
if (!handler) {
|
|
33
|
+
this._handlers.delete(event);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const set = this._handlers.get(event);
|
|
37
|
+
if (set) {
|
|
38
|
+
set.delete(handler);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 触发事件
|
|
44
|
+
* @param {string} event - 事件名
|
|
45
|
+
* @param {IAdEventData} data - 事件数据
|
|
46
|
+
*/
|
|
47
|
+
emit(event: AdEvent, data: IAdEventData): void {
|
|
48
|
+
const set = this._handlers.get(event);
|
|
49
|
+
if (set) {
|
|
50
|
+
set.forEach((handler) => {
|
|
51
|
+
try {
|
|
52
|
+
handler(data);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.error('[AdSdk] Event handler error on "' + event + '":', e);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** 移除所有监听 */
|
|
61
|
+
removeAllListeners(): void {
|
|
62
|
+
this._handlers.clear();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export default EventEmitter;
|