/** * 微信 DataNexus / 30r。仅 wechatgame 构建时由扩展拷入 assets/script/sdk。 * 官方 SDK 放到 node_modules/@dn-sdk,或把 js 放本目录命名为 dn-sdk.js。 */ /** createSdk30r 入参 */ export type Sdk30rCreateOpts = { /** 腾讯广告 user_action_set_id */ user_action_set_id: number; /** 密钥 */ secret_key: string; /** 微信 appid */ appid: string; }; /** 官方 SDK 最小面 */ type DnSdkLike = { init?: (opts: Sdk30rCreateOpts) => { inited?: boolean } | void; track?: (event: string, msg: unknown) => void; setOpenId?: (uid: string) => void; onTutorialFinish?: () => void; onRegister?: () => void; }; /** * 微信 30r 运行时(SDKManager.require 入口为 createSdk30r)。 */ export class Sdk30rWechat { private _sdk: DnSdkLike | null = null; private _inited = false; /** * 加载官方 SDK 并初始化 * @param opts 广告账号参数 */ static create(opts: Sdk30rCreateOpts): Sdk30rWechat { const ins = new Sdk30rWechat(); ins._boot(opts); return ins; } /** * 上报事件 * @param event 事件名 * @param msg 属性 */ track(event: string, msg: unknown): void { this._sdk?.track?.(event, msg); } /** 新手引导完成 */ onTutorialFinish(): void { this._sdk?.onTutorialFinish?.(); } /** 注册完成 */ onRegister(): void { this._sdk?.onRegister?.(); } /** * 绑定 openid * @param uid 用户 id */ setOpenId(uid: string): void { this._sdk?.setOpenId?.(String(uid ?? '')); } /** 初始化结果 */ getInitResult(): { inited: boolean } { return { inited: this._inited }; } /** 载入并 init 官方 SDK */ private _boot(opts: Sdk30rCreateOpts): void { const mod = this._loadDnSdk(); if (!mod) { console.error('[Sdk30rWechat] 未找到 @dn-sdk / dn-sdk.js'); return; } this._sdk = mod; if (typeof mod.init !== 'function') { this._inited = true; return; } const ret = mod.init(opts); this._inited = ret == null || ret.inited !== false; } /** 优先 npm @dn-sdk,其次同目录 dn-sdk.js */ private _loadDnSdk(): DnSdkLike | null { try { return this._unwrap(require('@dn-sdk')); } catch { /* 再试 vendor */ } try { return this._unwrap(require('./dn-sdk')); } catch { return null; } } /** * 解开 default 导出 * @param raw require 结果 */ private _unwrap(raw: unknown): DnSdkLike | null { if (!raw || typeof raw !== 'object') return null; const rec = raw as { default?: DnSdkLike }; return rec.default ?? (raw as DnSdkLike); } } /** * SDKManager 动态 require 入口 * @param opts 初始化参数 */ export function createSdk30r(opts: Sdk30rCreateOpts): Sdk30rWechat { return Sdk30rWechat.create(opts); }