dsh-token-gauge 0.1.4 → 0.1.5

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/lib/client.mjs CHANGED
@@ -948,31 +948,21 @@ function GaugeTab() {
948
948
  }
949
949
  var name = PLUGIN_ID;
950
950
  function apply(ctx) {
951
- let disposed = false;
952
- const getSidebar = () => (typeof ctx.get === "function" ? ctx.get("betterSidebar") : void 0) || ctx.betterSidebar;
953
- const tryRegister = () => {
954
- if (disposed) return true;
955
- const sidebar = getSidebar();
956
- if (!sidebar || typeof sidebar.registerTab !== "function") return false;
957
- sidebar.registerTab({
951
+ const disposeSidebar = ctx.inject(["betterSidebar"], (sidebarCtx) => {
952
+ const sidebar = sidebarCtx.betterSidebar;
953
+ if (!sidebar || typeof sidebar.registerTab !== "function") return;
954
+ const unregister = sidebar.registerTab({
958
955
  id: PLUGIN_ID,
959
956
  title: "Token \u4EEA\u8868\u76D8",
960
957
  single: true,
961
958
  component: GaugeTab
962
959
  });
963
- return true;
960
+ return () => {
961
+ if (typeof unregister === "function") unregister();
962
+ };
963
+ });
964
+ return () => {
965
+ if (typeof disposeSidebar === "function") disposeSidebar();
964
966
  };
965
- if (!tryRegister()) {
966
- const timer = setInterval(() => {
967
- if (tryRegister()) clearInterval(timer);
968
- }, 200);
969
- setTimeout(() => clearInterval(timer), 15e3);
970
- if (typeof ctx.on === "function") {
971
- ctx.on("dispose", () => {
972
- disposed = true;
973
- clearInterval(timer);
974
- });
975
- }
976
- }
977
967
  }
978
968
  ; return module.exports; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-token-gauge",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "DSH 机车风格 Token 用量/费用仪表盘侧边栏插件(稳定版 0.1.1-rc.x 兼容)",
5
5
  "type": "module",
6
6
  "main": "lib/index.mjs",
package/src/client.ts CHANGED
@@ -204,38 +204,39 @@ function GaugeTab(): React.ReactElement {
204
204
  }
205
205
 
206
206
  export const name = PLUGIN_ID
207
- // 注意:不要声明 `inject: ['betterSidebar']`。
208
- // 在本机这个 DSH cordis 启动里,兄弟 bundle 通过 ctx.provide 提供的服务在单趟
209
- // boot 的激活检查点(assertEntriesActivated)之前不会被注入,导致插件被永久 defer
210
- // 在 pending("waiting for service: betterSidebar")。改为在 apply 内直接
211
- // ctx.get('betterSidebar') 取服务——bundles 顺序保证 better-sidebar 在本插件之前
212
- // apply,服务此时已在全局注册表中。再加短轮询兜底防顺序抖动。
213
- export function apply(ctx: any): void {
214
- let disposed = false
215
- const getSidebar = () =>
216
- (typeof ctx.get === 'function' ? ctx.get('betterSidebar') : void 0) || ctx.betterSidebar
217
- const tryRegister = (): boolean => {
218
- if (disposed) return true
219
- const sidebar = getSidebar()
220
- if (!sidebar || typeof sidebar.registerTab !== 'function') return false
221
- sidebar.registerTab({
207
+
208
+ // 兄弟 bundle 提供的服务(betterSidebar)在本机这个 cordis 里两种读法都不行,必须用
209
+ // ctx.inject 回调模式。原因(已实测坐实,见本文件末尾注释与 dsh-plugin-guide 官方
210
+ // postmortem):
211
+ // 1) 插件级 `export const inject = ['betterSidebar']`
212
+ // -> cordis 把整插件 defer,单趟 boot 的 assertEntriesActivated 检查点在
213
+ // loader.await() 后跑,此时兄弟 bundle 的 provide 还没落到本 fiber,
214
+ // 直接判 "pending (waiting for service: betterSidebar)"(0.1.3 实测)。
215
+ // 2) apply 顶层 `ctx.get('betterSidebar')` 或 `ctx.betterSidebar`
216
+ // -> 0811 cordis 是「严格注入」:未声明 inject 直接读服务属性,走 ancestor-only
217
+ // fiber 遍历到 root 找不到就抛
218
+ // "cannot get property betterSidebar without inject"(0.1.4 实测)。
219
+ // 正确姿势:插件级不声明任何 inject(插件立即激活,不 pending),改用
220
+ // ctx.inject(['betterSidebar'], cb) —— 回调拿到的子上下文里 betterSidebar 是已注入的
221
+ // 合法属性,读它不触发守卫;且注册被延迟到服务就绪那一刻(兄弟 bundle 提供得早或晚
222
+ // 都能注册上)。生态插件 @linxin666/dsh-client-ui-aionui-panel 用的正是这个模式。
223
+ export function apply(ctx: any): (() => void) | void {
224
+ const disposeSidebar = ctx.inject(['betterSidebar'], (sidebarCtx: any) => {
225
+ const sidebar = sidebarCtx.betterSidebar
226
+ if (!sidebar || typeof sidebar.registerTab !== 'function') return
227
+ const unregister = sidebar.registerTab({
222
228
  id: PLUGIN_ID,
223
229
  title: 'Token 仪表盘',
224
230
  single: true,
225
231
  component: GaugeTab,
226
232
  })
227
- return true
228
- }
229
- if (!tryRegister()) {
230
- const timer = setInterval(() => {
231
- if (tryRegister()) clearInterval(timer)
232
- }, 200)
233
- setTimeout(() => clearInterval(timer), 15000)
234
- if (typeof ctx.on === 'function') {
235
- ctx.on('dispose', () => {
236
- disposed = true
237
- clearInterval(timer)
238
- })
233
+ return () => {
234
+ if (typeof unregister === 'function') unregister()
239
235
  }
236
+ })
237
+
238
+ // 返回插件级 disposer:卸载时一并撤掉未完成的注入
239
+ return () => {
240
+ if (typeof disposeSidebar === 'function') disposeSidebar()
240
241
  }
241
242
  }