next-flow-interface 0.27.8 → 0.27.11

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.
Files changed (2) hide show
  1. package/index.d.ts +723 -281
  2. package/package.json +2 -2
package/index.d.ts CHANGED
@@ -42,14 +42,12 @@ import { Material } from '@babylonjs/core';
42
42
  import { Mesh } from '@babylonjs/core';
43
43
  import { MouseEvent as MouseEvent_2 } from 'react';
44
44
  import { MouseEventHandler } from 'react';
45
- import { MultipartUploadResult } from 'ali-oss';
46
45
  import { NavigateOptions } from 'next/dist/shared/lib/app-router-context.shared-runtime';
47
46
  import { Node as Node_2 } from '@babylonjs/core';
48
47
  import { NodeMaterial } from '@babylonjs/core';
49
48
  import { NodeMaterialBlock } from '@babylonjs/core';
50
49
  import { NodeMaterialBlockConnectionPointTypes } from '@babylonjs/core';
51
50
  import { Observable } from '@babylonjs/core/Misc/observable';
52
- import OSS from 'ali-oss';
53
51
  import { PBRMaterial } from '@babylonjs/core';
54
52
  import { PointerEventHandler } from 'react';
55
53
  import { PrefetchOptions } from 'next/dist/shared/lib/app-router-context.shared-runtime';
@@ -66,6 +64,8 @@ import { RecursiveObject } from 'rhine-var';
66
64
  import { RedirectType } from 'next/navigation';
67
65
  import { Ref } from 'react';
68
66
  import { RefAttributes } from 'react';
67
+ import type { Resource } from 'rhine-base/network';
68
+ import type { ResourceFileInfo } from 'rhine-base/network';
69
69
  import { RhineVarArray } from 'rhine-var';
70
70
  import { RhineVarMap } from 'rhine-var';
71
71
  import { Root } from 'react-dom/client';
@@ -230,11 +230,10 @@ declare function approximatelyEqual(n1: number, n2: number, bias?: number): bool
230
230
 
231
231
 
232
232
 
233
-
234
233
  /**
235
234
  * @public
236
235
  */
237
- export declare type Attribute<T extends object = any> = NodeAttribute<T> | StepAttribute<T> | GlobalAttribute<T>;
236
+ export declare type Attribute<T extends object = object> = NodeAttribute<T> | StepAttribute<T> | GlobalAttribute<T>;
238
237
 
239
238
  /**
240
239
  * @public
@@ -252,15 +251,15 @@ export declare class AttributeService {
252
251
  stepAttributes: StepAttribute[];
253
252
  globalAttributes: GlobalAttribute[];
254
253
  /** 注册属性 */
255
- register<T extends object = any>(attribute: Attribute<T>): void;
254
+ register<T extends object = object>(attribute: Attribute<T>): void;
256
255
  /** 通过路径精确匹配获取属性 */
257
- get<T extends object = any>(type: AttributeType, path: RvPath | string): Attribute<T> | undefined;
256
+ get<T extends object = object>(type: AttributeType, path: RvPath | string): Attribute<T> | undefined;
258
257
  /** 通过路径获取 NodeAttribute */
259
- getNodeAttribute<T extends object = any>(path: RvPath | string): NodeAttribute<T> | undefined;
258
+ getNodeAttribute<T extends object = object>(path: RvPath | string): NodeAttribute<T> | undefined;
260
259
  /** 通过路径获取 StepAttribute */
261
- getStepAttribute<T extends object = any>(path: RvPath | string): StepAttribute<T> | undefined;
260
+ getStepAttribute<T extends object = object>(path: RvPath | string): StepAttribute<T> | undefined;
262
261
  /** 通过路径获取 GlobalAttribute */
263
- getGlobalAttribute<T extends object = any>(path: RvPath | string): GlobalAttribute<T> | undefined;
262
+ getGlobalAttribute<T extends object = object>(path: RvPath | string): GlobalAttribute<T> | undefined;
264
263
  /** 根据类型获取属性列表,不传入类型的时候返回所有 */
265
264
  getList(type?: AttributeType): Attribute[];
266
265
  isPathConflict(type: AttributeType, path: RvPath): boolean;
@@ -424,7 +423,7 @@ export declare class AwarenessService {
424
423
  /**
425
424
  * @public
426
425
  */
427
- export declare abstract class BaseAttribute<T extends object = any> {
426
+ export declare abstract class BaseAttribute<T extends object = object> {
428
427
  abstract type: AttributeType;
429
428
  abstract path: RvPath;
430
429
  defaultValue: T;
@@ -826,6 +825,7 @@ export declare const ClipboardUtils: {
826
825
  declare function computeSHA256(buffer: BufferSource): Promise<string>;
827
826
 
828
827
 
828
+
829
829
  /**
830
830
  * @public
831
831
  */
@@ -2232,7 +2232,7 @@ declare function isAttach(mime?: string): boolean;
2232
2232
 
2233
2233
  declare function isBabylon(mime?: string): boolean;
2234
2234
 
2235
- declare function isChangeEventType(type: EventType | string): type is EventType.ADD | EventType.UPDATE | EventType.DELETE;
2235
+ declare function isChangeEventType(type: EventType | string): boolean;
2236
2236
 
2237
2237
  /**
2238
2238
  * @public
@@ -2492,17 +2492,15 @@ export declare class LocalDataService {
2492
2492
  /**
2493
2493
  * 加载一个文件到本地
2494
2494
  *
2495
- * 根据提供的 URL 类型(blob、http/https、oss)下载文件到本地。
2495
+ * 通过 fileId 从后端获取签名下载 URL,然后下载文件到本地。
2496
2496
  * 支持下载进度跟踪,下载完成后会自动处理文件内容(JSON、文本等)。
2497
- * 如果文件已存在且已加载完成,则直接返回已存在的本地数据。
2498
2497
  *
2499
- * @param fid - 文件在 RhineVar 中的文件ID
2500
- * @param url - 文件的直接下载链接、Blob URL 或 OSS 链接
2498
+ * @param fileId - 后端文件 ID
2501
2499
  * @param mime - 文件 MIME 类型,默认为 UNKNOWN
2502
2500
  * @returns Promise<LocalData> - 返回本地数据对象的 Promise
2503
2501
  * @public
2504
2502
  */
2505
- load(fid: string, url: string, mime?: string): Promise<LocalData>;
2503
+ load(fileId: string, mime?: string): Promise<LocalData>;
2506
2504
  /**
2507
2505
  * 通过 File 对象加载文件到本地
2508
2506
  *
@@ -2539,35 +2537,6 @@ export declare class LocalDataService {
2539
2537
  */
2540
2538
  remove(fid: string): boolean;
2541
2539
  /**
2542
- * 暂停文件下载
2543
- *
2544
- * @param fid - 文件ID
2545
- * @returns 是否成功暂停
2546
- * @public
2547
- * @throws 该方法尚未实现
2548
- */
2549
- pause(fid: string): boolean;
2550
- /**
2551
- * 恢复文件下载
2552
- *
2553
- * @param fid - 文件ID
2554
- * @returns 是否成功恢复
2555
- * @public
2556
- * @throws 该方法尚未实现
2557
- */
2558
- resume(fid: string): boolean;
2559
- /**
2560
- * 取消文件下载
2561
- *
2562
- * @param fid - 文件ID
2563
- * @returns 是否成功取消
2564
- * @public
2565
- * @throws 该方法尚未实现
2566
- */
2567
- cancel(fid: string): boolean;
2568
- /**
2569
- * 获取本地文件的 Blob URL
2570
- *
2571
2540
  * 将本地数据转换为浏览器可用的 Blob URL,用于在浏览器中显示或下载文件。
2572
2541
  * 如果数据类型是 BLOB,则创建 Blob URL;如果是 OBJECT,则创建 MediaSource URL。
2573
2542
  *
@@ -2644,9 +2613,33 @@ export declare class LocalDataService {
2644
2613
  * @public
2645
2614
  */
2646
2615
  unsubscribeSingle(fid: string, subscriber: LocalDataServiceSubscriber): void;
2647
- publish(fid: string, type: LocalDataServiceEventType, localData: LocalData): void;
2616
+ /**
2617
+ * 文件加载完成后执行回调
2618
+ *
2619
+ * 如果文件已加载完成,立即执行回调;否则订阅 LOADED 事件,触发后自动取消订阅。
2620
+ *
2621
+ * @param fid - 文件 ID
2622
+ * @param subscriber - 加载完成后的回调函数
2623
+ * @public
2624
+ */
2648
2625
  afterLoaded(fid: string, subscriber: (localData: LocalData) => void): void;
2626
+ /**
2627
+ * 等待文件加载完成
2628
+ *
2629
+ * 返回一个 Promise,在文件加载完成时 resolve。
2630
+ *
2631
+ * @param fid - 文件 ID
2632
+ * @returns 加载完成的本地数据对象
2633
+ * @public
2634
+ */
2649
2635
  waitLoaded(fid: string): Promise<LocalData>;
2636
+ /**
2637
+ * 检查文件是否已加载完成
2638
+ *
2639
+ * @param fid - 文件 ID
2640
+ * @returns true 已加载,false 未加载,undefined 文件不存在
2641
+ * @public
2642
+ */
2650
2643
  isLoaded(fid: string): boolean | undefined;
2651
2644
  }
2652
2645
 
@@ -3259,8 +3252,6 @@ export declare const NumberUtils: {
3259
3252
  isValidNumber: typeof isValidNumber;
3260
3253
  };
3261
3254
 
3262
-
3263
-
3264
3255
  /**
3265
3256
  * @public
3266
3257
  */
@@ -3285,245 +3276,78 @@ export declare enum OssUploadInstanceStatus {
3285
3276
  }
3286
3277
 
3287
3278
  /**
3288
- * OSS 上传服务
3279
+ * 上传服务
3289
3280
  *
3290
- * @remarks
3291
- * 该服务负责管理所有 OSS 上传任务队列,提供文件上传、取消、状态监听等功能。
3292
- * 所有上传任务都会创建对应的 RvFile 记录,并在协同数据中标记 `uploading: true`。
3293
- * 上传完成后会自动更新 RvFile 的 URL 并移除上传标记。
3294
- *
3295
- * @example
3296
- * ```typescript
3297
- * // 上传文件
3298
- * const fid = await OssUploadService.instance.upload(file)
3299
- *
3300
- * // 监听上传进度
3301
- * OssUploadService.instance.subscribe((type, instance) => {
3302
- * if (type === OssUploadServiceEventType.PROGRESS) {
3303
- * console.log(`上传进度: ${instance.progress}%`)
3304
- * }
3305
- * })
3306
- * ```
3281
+ * 委托 rhine-base UploadService 完成文件上传,
3282
+ * 上传完成后将 fileId / resourceId 写入协同数据。
3307
3283
  *
3308
3284
  * @public
3309
3285
  */
3310
3286
  export declare class OssUploadService {
3311
- /**
3312
- * 获取 OssUploadService 单例实例
3313
- *
3314
- * @returns OssUploadService 单例实例
3315
- *
3316
- * @public
3317
- */
3287
+ private static _instance;
3318
3288
  static get instance(): OssUploadService;
3319
- /**
3320
- * 当前所有上传实例的集合
3321
- *
3322
- * @remarks
3323
- * 使用 Map 结构存储,key 为文件 ID (fid),value 为上传实例对象。
3324
- * 上传完成后,实例会从集合中自动移除。
3325
- *
3326
- * @public
3327
- */
3289
+ private constructor();
3290
+ private initialize;
3291
+ /** 正在上传的实例 Map(fid -> OssUploadInstance) */
3328
3292
  instances: Map<string, OssUploadInstance>;
3329
3293
  /**
3330
- * 根据文件 ID 获取上传实例
3294
+ * 根据 fid 获取上传实例
3331
3295
  *
3332
3296
  * @param fid - 文件 ID
3333
- * @returns 上传实例对象,如果不存在则返回 undefined
3334
- *
3335
- * @public
3297
+ * @returns 上传实例,不存在则返回 undefined
3336
3298
  */
3337
3299
  get(fid: string): OssUploadInstance | undefined;
3338
3300
  /**
3339
- * 检查是否存在指定 ID 的上传任务
3301
+ * 检查是否存在指定 fid 的上传实例
3340
3302
  *
3341
3303
  * @param fid - 文件 ID
3342
- * @returns 如果存在返回 true,否则返回 false
3343
- *
3344
- * @public
3345
3304
  */
3346
3305
  has(fid: string): boolean;
3347
3306
  /**
3348
- * 检查指定的 File 对象是否已经在上传队列中
3349
- *
3350
- * @param file - 要检查的 File 对象
3351
- * @returns 如果该文件已在上传队列中返回 true,否则返回 false
3307
+ * 检查指定 File 对象是否正在上传中
3352
3308
  *
3353
- * @remarks
3354
- * 该方法通过遍历所有上传实例来比较 File 对象引用
3355
- *
3356
- * @public
3309
+ * @param file - 浏览器 File 对象
3357
3310
  */
3358
3311
  hasFile(file: File): boolean;
3359
3312
  /**
3360
- * 上传完成后从队列中移除的延迟时间(毫秒)
3361
- *
3362
- * @defaultValue 100
3363
- *
3364
- * @public
3365
- */
3366
- REMOVE_INTERVAL_AFTER_COMPLETED: number;
3367
- /**
3368
- * 上传文件到 OSS
3369
- *
3370
- * @param file - 要上传的文件对象
3371
- * @param fid - 文件 ID,如果不提供则自动生成
3372
- * @param mime - 文件 MIME 类型,如果不提供则自动检测
3373
- * @param hash - 文件哈希值(可选)
3374
- * @returns Promise,上传任务启动后返回
3375
- *
3376
- * @remarks
3377
- * 该方法会执行以下操作:
3378
- * 1. 创建 RvFile 记录,标记 `uploading: true`
3379
- * 2. 创建上传实例并加入队列
3380
- * 3. 开始上传并触发相关事件(START、PROGRESS、UPLOADED/FAILED)
3381
- * 4. 上传成功后更新 RvFile 的 URL 并移除 uploading 标记
3382
- * 5. 上传失败后自动删除 RvFile 记录
3383
- * 6. 将文件添加到本地数据服务
3384
- *
3385
- * @throws 如果创建 RvFile 失败,抛出 Error
3386
- *
3387
- * @example
3388
- * ```typescript
3389
- * // 基本用法
3390
- * await OssUploadService.instance.upload(file)
3391
- *
3392
- * // 指定文件 ID
3393
- * await OssUploadService.instance.upload(file, 'custom-fid')
3394
- *
3395
- * // 指定 MIME 类型和哈希值
3396
- * await OssUploadService.instance.upload(file, 'custom-fid', 'image/png', 'sha256-hash')
3397
- * ```
3398
- *
3399
- * @public
3400
- */
3401
- upload(file: File, fid?: string, mime?: string, hash?: string): Promise<void>;
3402
- /**
3403
- * 暂停指定的上传任务
3313
+ * 上传文件
3404
3314
  *
3405
- * @param fid - 文件 ID
3406
- * @returns 暂停操作是否成功
3407
- *
3408
- * @remarks
3409
- * 该方法尚未实现,调用会抛出异常
3410
- *
3411
- * @throws 方法未实现错误
3412
- *
3413
- * @public
3315
+ * 委托 rhine-base UploadService 完成完整上传流程。
3316
+ * 上传完成后自动将 fileId 和 resourceId 写入协同数据。
3414
3317
  */
3415
- pause(fid: string): boolean;
3318
+ upload(file: File, fid?: string, mime?: string): Promise<void>;
3416
3319
  /**
3417
- * 恢复指定的上传任务
3320
+ * 取消指定文件的上传
3418
3321
  *
3419
3322
  * @param fid - 文件 ID
3420
- * @returns 恢复操作是否成功
3421
- *
3422
- * @remarks
3423
- * 该方法尚未实现,调用会抛出异常
3424
- *
3425
- * @throws 方法未实现错误
3426
- *
3427
- * @public
3428
- */
3429
- resume(fid: string): boolean;
3430
- /**
3431
- * 取消指定的上传任务
3432
- *
3433
- * @param fid - 文件 ID
3434
- * @returns 取消操作是否成功
3435
- *
3436
- * @remarks
3437
- * 取消上传后会发布 CANCELED 事件,无论取消是否成功都会发布该事件。
3438
- * 取消后上传实例仍会保留在队列中,直到超时或手动移除。
3439
- *
3440
- * @example
3441
- * ```typescript
3442
- * const fid = 'file-id'
3443
- * if (OssUploadService.instance.cancel(fid)) {
3444
- * console.log('上传已取消')
3445
- * }
3446
- * ```
3447
- *
3448
- * @public
3323
+ * @returns 是否成功取消
3449
3324
  */
3450
3325
  cancel(fid: string): boolean;
3326
+ private subscribers;
3327
+ private singleSubscribers;
3451
3328
  /**
3452
- * 订阅所有文件的上传事件
3329
+ * 订阅所有上传事件
3453
3330
  *
3454
- * @param subscriber - 订阅回调函数,当任何文件的上传状态改变时会被调用
3331
+ * @param subscriber - 事件回调函数
3455
3332
  * @returns 取消订阅的函数
3456
- *
3457
- * @remarks
3458
- * 该方法会监听所有文件的上传事件,包括:
3459
- * - START: 上传开始
3460
- * - PROGRESS: 上传进度更新
3461
- * - UPLOADED: 上传成功
3462
- * - FAILED: 上传失败
3463
- * - CANCELED: 上传取消
3464
- *
3465
- * @example
3466
- * ```typescript
3467
- * const unsubscribe = OssUploadService.instance.subscribe((type, instance) => {
3468
- * console.log(`文件 ${instance.fid} 状态: ${type}, 进度: ${instance.progress}%`)
3469
- * })
3470
- *
3471
- * // 取消订阅
3472
- * unsubscribe()
3473
- * ```
3474
- *
3475
- * @public
3476
3333
  */
3477
3334
  subscribe(subscriber: OssUploadServiceSubscriber): () => void;
3478
3335
  /**
3479
- * 取消订阅所有文件的上传事件
3336
+ * 取消订阅所有上传事件
3480
3337
  *
3481
- * @param subscriber - 要取消的订阅回调函数
3482
- *
3483
- * @remarks
3484
- * 从订阅列表中移除指定的订阅者
3485
- *
3486
- * @public
3338
+ * @param subscriber - 要取消的回调函数
3487
3339
  */
3488
3340
  unsubscribe(subscriber: OssUploadServiceSubscriber): void;
3489
3341
  /**
3490
- * 订阅指定文件的上传事件
3342
+ * 订阅单个文件的上传事件
3491
3343
  *
3492
- * @param fid - 要订阅的文件 ID
3493
- * @param subscriber - 订阅回调函数,当该文件的上传状态改变时会被调用
3344
+ * @param fid - 文件 ID
3345
+ * @param subscriber - 事件回调函数
3494
3346
  * @returns 取消订阅的函数
3495
- *
3496
- * @remarks
3497
- * 该方法只监听指定文件的上传事件。相比 {@link subscribe},这个方法更适合只关注单个文件的场景。
3498
- * 事件类型包括:START、PROGRESS、UPLOADED、FAILED、CANCELED
3499
- *
3500
- * @example
3501
- * ```typescript
3502
- * const unsubscribe = OssUploadService.instance.subscribeSingle('file-id', (type, instance) => {
3503
- * if (type === OssUploadServiceEventType.UPLOADED) {
3504
- * console.log('文件上传完成')
3505
- * }
3506
- * })
3507
- *
3508
- * // 取消订阅
3509
- * unsubscribe()
3510
- * ```
3511
- *
3512
- * @public
3513
3347
  */
3514
3348
  subscribeSingle(fid: string, subscriber: OssUploadServiceSubscriber): () => void;
3515
- /**
3516
- * 取消订阅指定文件的上传事件
3517
- *
3518
- * @param fid - 文件 ID
3519
- * @param subscriber - 要取消的订阅回调函数
3520
- *
3521
- * @remarks
3522
- * 从指定文件的订阅列表中移除订阅者
3523
- *
3524
- * @public
3525
- */
3526
3349
  unsubscribeSingle(fid: string, subscriber: OssUploadServiceSubscriber): void;
3350
+ publish(fid: string, type: OssUploadServiceEventType, uploadInstance: OssUploadInstance): void;
3527
3351
  }
3528
3352
 
3529
3353
  /**
@@ -3715,38 +3539,479 @@ export declare interface PluginInformation {
3715
3539
 
3716
3540
 
3717
3541
  /**
3542
+ * 插件系统核心服务
3543
+ *
3544
+ * 本服务是整个插件系统的核心入口,负责插件的完整生命周期管理,包括添加、安装、启用、禁用、卸载等操作。
3545
+ * 插件系统采用插件化架构设计,所有侧边栏、弹窗、功能按钮等都以插件形式存在,可按需装配。
3546
+ *
3547
+ * ## 插件系统架构概览
3548
+ *
3549
+ * 插件系统由以下核心模块组成:
3550
+ *
3551
+ * 1. PluginService (本文件) - 插件生命周期管理核心
3552
+ * 2. PluginConnector - 插件与主项目的桥接器,向window注入全局API
3553
+ * 3. PluginApiProvider - 向插件暴露的主项目服务和组件集合
3554
+ * 4. PluginContainerService - 插件UI容器管理,处理插件的DOM渲染
3555
+ * 5. RvPluginService - 插件协同数据管理,存储插件配置到RhineVar
3556
+ *
3557
+ * ## 插件分类
3558
+ *
3559
+ * 插件按类型(PluginType)分为以下几类:
3560
+ *
3561
+ * - BUTTON: 按钮插件,点击触发动作,无展开内容
3562
+ * - SWITCH: 开关插件,点击切换状态
3563
+ * - DRAWER: 抽屉插件,点击展开侧边栏面板
3564
+ * - DIALOG: 对话框插件,点击弹出模态框
3565
+ * - CONTENT: 内容插件,固定显示在内容区域
3566
+ * - WINDOW: 窗口插件,浮动显示在画布上层
3567
+ * - SERVICE: 服务插件,无UI,仅提供后台服务
3568
+ *
3569
+ * ## 插件来源
3570
+ *
3571
+ * 插件按来源分为两类:
3572
+ *
3573
+ * - 内置插件(BuiltIn): URL以`nfp://`开头,代码打包在主项目中,通过builtInPluginFactory创建实例
3574
+ * - 外部插件(External): URL为http(s)地址,运行时动态加载JS/CSS文件
3575
+ *
3576
+ * ## 插件生命周期
3577
+ *
3578
+ * 插件的完整生命周期如下:
3579
+ *
3580
+ * ```
3581
+ * add -> install -> enable -> open/close -> disable -> uninstall
3582
+ * ```
3583
+ *
3584
+ * 各阶段说明:
3585
+ *
3586
+ * - add: 添加插件配置,创建PluginState,加载外部资源(JS/CSS/国际化文件)
3587
+ * - install: 执行插件的onInstall回调,标记installed=true
3588
+ * - enable: 将插件添加到UI容器,执行onEnable回调,标记enabled=true
3589
+ * - open: 打开可展开的插件(DRAWER/DIALOG/SWITCH)
3590
+ * - close: 关闭已打开的插件
3591
+ * - disable: 从UI容器移除,执行onDisable回调,标记enabled=false
3592
+ * - uninstall: 执行onUninstall回调,移除DOM元素,从plugins Map中删除
3593
+ *
3594
+ * ## 启用级别(EnableLevel)
3595
+ *
3596
+ * 协同数据中定义了插件的启用级别,决定插件在页面加载时的初始状态:
3597
+ *
3598
+ * - NONE: 不加载
3599
+ * - INSTALL: 仅安装,不启用
3600
+ * - ENABLE: 安装并启用,但不打开
3601
+ * - OPEN: 安装、启用并打开
3602
+ *
3603
+ * ## 调试模式
3604
+ *
3605
+ * 支持插件热更新调试:
3606
+ *
3607
+ * - 通过URL参数`?plugin=id:urlPort:hmrPort`快速启动调试
3608
+ * - 通过协同数据`plugin.debug`配置调试插件
3609
+ * - WebSocket监听HMR消息,自动重载插件
3610
+ *
3611
+ * ## 初始化流程
3612
+ *
3613
+ * 1. 等待SyncInitialized状态
3614
+ * 2. 解析URL中的调试插件参数
3615
+ * 3. 并行处理所有配置中的插件(根据EnableLevel执行add/install/enable/open)
3616
+ * 4. 并行启动所有调试插件
3617
+ * 5. 设置PluginEnabled状态
3618
+ * 6. 订阅调试插件配置变化
3619
+ * 7. 检查PreLoaded和PreRendered钩子
3620
+ *
3621
+ * ## 事件订阅
3622
+ *
3623
+ * 通过subscribe/unsubscribe方法订阅插件事件:
3624
+ *
3625
+ * - ADD: 插件添加完成
3626
+ * - INSTALL: 插件安装完成
3627
+ * - ENABLE: 插件启用完成
3628
+ * - DISABLE: 插件禁用完成
3629
+ * - UNINSTALL: 插件卸载完成
3630
+ *
3631
+ * ## 相关文件索引
3632
+ *
3633
+ * 核心服务:
3634
+ * - ./plugin-connector.ts - 插件桥接器,向window注入全局对象供外部插件访问
3635
+ * - ./plugin-api-provider.ts - API提供器,汇总所有向插件暴露的服务、组件、工具函数
3636
+ * - ./plugin-list.tsx - 插件列表,定义所有可用插件的配置信息和内置插件工厂
3637
+ *
3638
+ * 类型定义:
3639
+ * - ./dto/plugin-config.type.ts - 插件配置类型,定义插件的基本信息结构
3640
+ * - ./dto/plugin-state.interface.ts - 插件状态接口,记录插件运行时状态
3641
+ * - ./dto/plugin-event-type.enum.ts - 插件事件类型枚举
3642
+ * - ./dto/plugin-service-subscriber.type.ts - 事件订阅者类型定义
3643
+ *
3644
+ * 插件实例接口:
3645
+ * - ./instance/base-plugin.ts - 插件基础接口,所有插件类型的公共属性
3646
+ * - ./instance/icon-plugin.ts - 图标插件接口,带侧边栏按钮的插件基类
3647
+ * - ./instance/drawer-plugin.ts - 抽屉插件接口,可展开侧边栏面板
3648
+ * - ./instance/dialog-plugin.ts - 对话框插件接口,点击弹出模态框
3649
+ * - ./instance/view-plugin.ts - 视图插件接口,CONTENT和WINDOW类型的基类
3650
+ * - ./instance/dto/plugin-type.enum.ts - 插件类型枚举
3651
+ * - ./instance/dto/icon-plugin-position.enum.ts - 图标插件位置枚举
3652
+ * - ./instance/dto/icon-view-props.interface.ts - 图标视图Props接口
3653
+ * - ./instance/dto/plugin-view-props.interface.ts - 插件视图Props接口
3654
+ *
3655
+ * UI容器管理:
3656
+ * - ./view/plugin-container/plugin-container-service.ts - 容器服务,管理插件的DOM渲染和布局
3657
+ * - ./view/plugin-container/dynamic/icon-button-manager.ts - 图标按钮管理器,创建和管理侧边栏按钮
3658
+ * - ./view/plugin-container/dynamic/plugin-ordering-manager.ts - 排序管理器,处理按钮排序和分割线
3659
+ * - ./view/plugin-container/dynamic/hover-manager.ts - 悬停管理器,处理按钮容器的悬停效果
3660
+ *
3661
+ * 协同数据:
3662
+ * - ../sync/plugin/rv-plugin-service.ts - 插件协同数据服务,管理plugin配置的CRUD
3663
+ * - ../sync/plugin/default-plugin-config.ts - 默认插件配置,定义初始插件列表和启用级别
3664
+ * - ../sync/interface/plugin/rv-plugin.ts - 插件协同数据结构
3665
+ * - ../sync/interface/plugin/rv-plugin-config.interface.ts - 插件配置接口,含EnableLevel和VersionPoint
3666
+ * - ../sync/interface/plugin/rv-plugin-debug.ts - 调试插件配置接口
3667
+ *
3668
+ * 内置插件示例:
3669
+ * - ../nfp/drawer/debug/debug-drawer-plugin.tsx - 调试抽屉插件,DrawerPlugin实现示例
3670
+ * - ../nfp/button/home-button/home-button-plugin.tsx - 主页按钮插件,IconPlugin(BUTTON)实现示例
3671
+ * - ../nfp/switch/select-switch/select-switch-plugin.tsx - 选择开关插件,IconPlugin(SWITCH)实现示例
3672
+ * - ../nfp/dialog/plugin-manage-dialog/plugin-manage-dialog-plugin.tsx - 插件管理对话框,DialogPlugin实现示例
3673
+ * - ../nfp/content/message-display/message-display-plugin.tsx - 消息显示插件,ViewPlugin(CONTENT)实现示例
3674
+ * - ../nfp/window/context-menu-display/context-menu-display-plugin.tsx - 右键菜单插件,ViewPlugin(WINDOW)实现示例
3675
+ *
3676
+ * 工具函数:
3677
+ * - ../../utils/render-mix-view.tsx - 混合视图渲染,支持字符串HTML或React组件
3678
+ * - ../../types/view/mix-view.ts - MixView类型定义
3679
+ *
3718
3680
  * @public
3719
3681
  */
3720
3682
  export declare class PluginService {
3683
+ /**
3684
+ * 获取 PluginService 单例实例
3685
+ *
3686
+ * 首次访问时会自动创建实例并触发初始化流程。
3687
+ *
3688
+ * @returns PluginService 单例实例
3689
+ *
3690
+ * @example
3691
+ * ```typescript
3692
+ * const pluginService = PluginService.instance
3693
+ * await pluginService.add(config)
3694
+ * ```
3695
+ */
3721
3696
  static get instance(): PluginService;
3697
+ /**
3698
+ * 私有构造函数,确保单例模式
3699
+ *
3700
+ * 构造时自动触发异步初始化流程。
3701
+ */
3722
3702
  private constructor();
3703
+ /**
3704
+ * 已注册插件的状态映射表
3705
+ *
3706
+ * 以插件 ID 为键,存储每个插件的运行时状态信息。
3707
+ * 包含插件实例、DOM 元素引用、安装/启用状态等。
3708
+ *
3709
+ * @see PluginState
3710
+ */
3723
3711
  plugins: Map<string, PluginState>;
3712
+ /**
3713
+ * 详细日志模式开关
3714
+ *
3715
+ * 开启后会在控制台输出更多插件操作的调试信息。
3716
+ * 默认关闭,仅在开发调试时启用。
3717
+ */
3724
3718
  DETAILED_LOG_MODE: boolean;
3719
+ /**
3720
+ * 普通插件安装超时时间(毫秒)
3721
+ *
3722
+ * 等待插件安装完成的最大时间,超时后会抛出错误。
3723
+ * @default 3000
3724
+ */
3725
3725
  INSTALL_TIMEOUT: number;
3726
+ /**
3727
+ * 调试插件安装超时时间(毫秒)
3728
+ *
3729
+ * 等待调试插件安装完成的最大时间,超时后会抛出错误。
3730
+ * @default 3000
3731
+ */
3726
3732
  DEBUG_INSTALL_TIMEOUT: number;
3733
+ /**
3734
+ * 创建预加载钩子
3735
+ *
3736
+ * 插件可在启用时调用此方法注册预加载任务。
3737
+ * 注册后需调用 {@link completePreLoadedHook} 标记完成。
3738
+ *
3739
+ * @param id - 插件 ID
3740
+ *
3741
+ * @example
3742
+ * ```typescript
3743
+ * // 在插件 onEnable 中
3744
+ * PluginService.instance.createPreLoadedHook(this.id)
3745
+ * // 异步任务完成后
3746
+ * PluginService.instance.completePreLoadedHook(this.id)
3747
+ * ```
3748
+ */
3727
3749
  createPreLoadedHook(id: string): void;
3750
+ /**
3751
+ * 完成预加载钩子
3752
+ *
3753
+ * 标记指定插件的预加载任务已完成。
3754
+ * 所有预加载任务完成后会触发 PluginPreLoaded 状态。
3755
+ *
3756
+ * @param id - 插件 ID
3757
+ */
3728
3758
  completePreLoadedHook(id: string): void;
3759
+ /**
3760
+ * 创建预渲染钩子
3761
+ *
3762
+ * 插件可在启用时调用此方法注册预渲染任务。
3763
+ * 注册后需调用 {@link completePreRenderedHook} 标记完成。
3764
+ *
3765
+ * @param id - 插件 ID
3766
+ *
3767
+ * @example
3768
+ * ```typescript
3769
+ * // 在插件 onEnable 中
3770
+ * PluginService.instance.createPreRenderedHook(this.id)
3771
+ * // 渲染准备完成后
3772
+ * PluginService.instance.completePreRenderedHook(this.id)
3773
+ * ```
3774
+ */
3729
3775
  createPreRenderedHook(id: string): void;
3776
+ /**
3777
+ * 完成预渲染钩子
3778
+ *
3779
+ * 标记指定插件的预渲染任务已完成。
3780
+ * 所有预渲染任务完成后会触发 PluginPreRendered 状态。
3781
+ *
3782
+ * @param id - 插件 ID
3783
+ */
3730
3784
  completePreRenderedHook(id: string): void;
3731
- protected checkPreLoaded(): void;
3732
- protected checkPreRendered(): void;
3785
+ /**
3786
+ * 订阅插件事件
3787
+ *
3788
+ * 注册一个回调函数,在插件生命周期事件发生时被调用。
3789
+ *
3790
+ * @param subscriber - 事件订阅回调函数
3791
+ * @returns 取消订阅的函数
3792
+ *
3793
+ * @example
3794
+ * ```typescript
3795
+ * const unsubscribe = PluginService.instance.subscribe((id, type) => {
3796
+ * console.log(`Plugin ${id} event: ${type}`)
3797
+ * })
3798
+ * // 取消订阅
3799
+ * unsubscribe()
3800
+ * ```
3801
+ */
3733
3802
  subscribe(subscriber: PluginServiceSubscriber): () => void;
3803
+ /**
3804
+ * 取消订阅插件事件
3805
+ *
3806
+ * @param subscriber - 要取消的订阅回调函数
3807
+ */
3734
3808
  unsubscribe(subscriber: PluginServiceSubscriber): void;
3809
+ /**
3810
+ * 获取插件状态
3811
+ *
3812
+ * 根据插件 ID 获取其运行时状态信息。
3813
+ *
3814
+ * @param id - 插件 ID
3815
+ * @returns 插件状态对象,若不存在则返回 undefined
3816
+ *
3817
+ * @example
3818
+ * ```typescript
3819
+ * const state = PluginService.instance.get('my-plugin')
3820
+ * if (state?.enabled) {
3821
+ * console.log('Plugin is enabled')
3822
+ * }
3823
+ * ```
3824
+ */
3735
3825
  get(id: string): PluginState | undefined;
3826
+ /**
3827
+ * 添加插件
3828
+ *
3829
+ * 根据插件配置添加插件到系统中。
3830
+ * 自动识别内置插件(nfp://)和外部插件(http)并分别处理。
3831
+ *
3832
+ * 对于外部插件:
3833
+ * - 创建 script 和 link 元素加载 JS/CSS
3834
+ * - 加载国际化资源文件
3835
+ * - 将元素添加到 document.body
3836
+ *
3837
+ * 对于内置插件:
3838
+ * - 从 builtInPluginFactory 创建实例
3839
+ * - 自动触发安装流程
3840
+ *
3841
+ * @param config - 插件配置对象
3842
+ * @returns 是否添加成功
3843
+ *
3844
+ * @example
3845
+ * ```typescript
3846
+ * const success = await PluginService.instance.add({
3847
+ * id: 'my-plugin',
3848
+ * url: 'https://cdn.example.com/plugins/my-plugin',
3849
+ * entry: 'index.js',
3850
+ * css: 'index.css',
3851
+ * information: { name: 'My Plugin' }
3852
+ * })
3853
+ * ```
3854
+ */
3736
3855
  add(config: PluginConfig): Promise<boolean>;
3856
+ /**
3857
+ * 启动插件调试模式
3858
+ *
3859
+ * 加载调试插件并建立 WebSocket 连接监听 HMR 消息。
3860
+ * 当收到编译完成消息时自动重新加载插件实现热更新。
3861
+ *
3862
+ * @param debug - 调试插件配置(RhineVar 存储)
3863
+ *
3864
+ * @example
3865
+ * ```typescript
3866
+ * await PluginService.instance.debug(rvPluginDebug)
3867
+ * ```
3868
+ */
3737
3869
  debug(debug: StoredRhineVar<RvPluginDebug>): Promise<void>;
3870
+ /**
3871
+ * 停止插件调试
3872
+ *
3873
+ * 关闭 HMR WebSocket 连接并卸载调试插件。
3874
+ *
3875
+ * @param id - 插件 ID
3876
+ */
3738
3877
  stopDebug(id: string): Promise<void>;
3878
+ /**
3879
+ * 加载插件国际化消息
3880
+ *
3881
+ * 从插件的 messages 属性中加载当前语言的翻译资源。
3882
+ * 内置插件可通过此方式提供多语言支持。
3883
+ *
3884
+ * @param plugin - 插件实例
3885
+ */
3739
3886
  loadPluginMessages(plugin: BasePlugin): Promise<void>;
3887
+ /**
3888
+ * 安装插件
3889
+ *
3890
+ * 执行插件的安装流程:
3891
+ * 1. 将插件实例存入 PluginState
3892
+ * 2. 加载插件国际化消息
3893
+ * 3. 调用插件的 onInstall 生命周期钩子
3894
+ * 4. 标记 installed = true
3895
+ * 5. 发布 INSTALL 事件
3896
+ *
3897
+ * 注意: 外部插件的 install 由插件 JS 加载完成后自动调用 PluginConnector.install 触发。
3898
+ *
3899
+ * @param plugin - 插件实例
3900
+ */
3740
3901
  install(plugin: BasePlugin): Promise<void>;
3902
+ /**
3903
+ * 启用插件
3904
+ *
3905
+ * 执行插件的启用流程:
3906
+ * 1. 将插件添加到 UI 容器(创建按钮或渲染视图)
3907
+ * 2. 调用插件的 onEnable 生命周期钩子
3908
+ * 3. 标记 enabled = true
3909
+ * 4. 发布 ENABLE 事件
3910
+ *
3911
+ * @param id - 插件 ID
3912
+ */
3741
3913
  enable(id: string): Promise<void>;
3914
+ /**
3915
+ * 打开插件
3916
+ *
3917
+ * 打开可展开的插件(DRAWER/DIALOG/SWITCH 类型)。
3918
+ * 对于 DRAWER 类型会展开侧边栏面板,对于 DIALOG 类型会弹出对话框。
3919
+ *
3920
+ * @param id - 插件 ID
3921
+ * @throws 若插件未安装则抛出错误
3922
+ */
3742
3923
  open(id: string): Promise<void>;
3924
+ /**
3925
+ * 关闭插件
3926
+ *
3927
+ * 关闭已打开的插件(DRAWER/DIALOG/SWITCH 类型)。
3928
+ *
3929
+ * @param id - 插件 ID
3930
+ * @throws 若插件未安装则抛出错误
3931
+ */
3743
3932
  close(id: string): Promise<void>;
3933
+ /**
3934
+ * 禁用插件
3935
+ *
3936
+ * 执行插件的禁用流程:
3937
+ * 1. 从 UI 容器移除插件
3938
+ * 2. 调用插件的 onDisable 生命周期钩子
3939
+ * 3. 标记 enabled = false
3940
+ * 4. 发布 DISABLE 事件
3941
+ *
3942
+ * @param id - 插件 ID
3943
+ */
3744
3944
  disable(id: string): Promise<void>;
3945
+ /**
3946
+ * 卸载插件
3947
+ *
3948
+ * 执行插件的完整卸载流程:
3949
+ * 1. 若已启用则先禁用
3950
+ * 2. 调用插件的 onUninstall 生命周期钩子
3951
+ * 3. 标记 installed = false
3952
+ * 4. 移除 script 和 style DOM 元素
3953
+ * 5. 从 plugins Map 中删除
3954
+ * 6. 发布 UNINSTALL 事件
3955
+ *
3956
+ * @param id - 插件 ID
3957
+ */
3745
3958
  uninstall(id: string): Promise<void>;
3959
+ /**
3960
+ * 等待插件安装完成
3961
+ *
3962
+ * 返回一个 Promise,在指定插件安装完成时 resolve。
3963
+ * 若插件已安装则立即 resolve。
3964
+ *
3965
+ * @param id - 插件 ID
3966
+ * @param timeoutMs - 超时时间(毫秒),超时后 reject
3967
+ * @returns Promise,安装完成时 resolve
3968
+ *
3969
+ * @example
3970
+ * ```typescript
3971
+ * await PluginService.instance.waitInstall('my-plugin', 5000)
3972
+ * console.log('Plugin installed')
3973
+ * ```
3974
+ */
3746
3975
  waitInstall(id: string, timeoutMs?: number): Promise<void>;
3976
+ /**
3977
+ * 等待插件启用完成
3978
+ *
3979
+ * 返回一个 Promise,在指定插件启用完成时 resolve。
3980
+ * 若插件已启用则立即 resolve。
3981
+ *
3982
+ * @param id - 插件 ID
3983
+ * @param timeoutMs - 超时时间(毫秒),超时后 reject
3984
+ * @returns Promise,启用完成时 resolve
3985
+ */
3747
3986
  waitEnable(id: string, timeoutMs?: number): Promise<void>;
3987
+ /**
3988
+ * 判断是否为可打开的插件类型
3989
+ *
3990
+ * 可打开的插件类型包括: DRAWER, DIALOG, SWITCH
3991
+ *
3992
+ * @param type - 插件类型
3993
+ * @returns 是否可打开
3994
+ */
3748
3995
  isOpenablePlugin(type: PluginType): boolean;
3996
+ /**
3997
+ * 判断是否为侧边栏插件类型
3998
+ *
3999
+ * 侧边栏插件会在左右两侧显示图标按钮。
4000
+ * 包括: DRAWER, DIALOG, BUTTON, SWITCH
4001
+ *
4002
+ * @param type - 插件类型
4003
+ * @returns 是否为侧边栏插件
4004
+ */
3749
4005
  isSideBarPlugin(type: PluginType): boolean;
4006
+ /**
4007
+ * 判断是否为视图插件类型
4008
+ *
4009
+ * 视图插件直接渲染在内容区域或浮动窗口中。
4010
+ * 包括: WINDOW, CONTENT
4011
+ *
4012
+ * @param type - 插件类型
4013
+ * @returns 是否为视图插件
4014
+ */
3750
4015
  isViewPlugin(type: PluginType): boolean;
3751
4016
  }
3752
4017
 
@@ -3857,7 +4122,10 @@ export declare interface ResourcePreviewProps extends DivProps {
3857
4122
  }
3858
4123
 
3859
4124
  /**
3860
- * ResourceService
4125
+ * 资源管理服务
4126
+ *
4127
+ * 负责资源的上传、批量上传、重复检测、纹理预览图生成等功能。
4128
+ * 上传操作委托 OssUploadService 完成,最终由 rhine-base UploadService 执行。
3861
4129
  *
3862
4130
  * @public
3863
4131
  */
@@ -3867,6 +4135,7 @@ export declare class ResourceService {
3867
4135
  */
3868
4136
  static get instance(): ResourceService;
3869
4137
  private constructor();
4138
+ /** 资源拖拽状态(Valtio 响应式) */
3870
4139
  dragState: {
3871
4140
  fid: string;
3872
4141
  data: null;
@@ -3875,15 +4144,52 @@ export declare class ResourceService {
3875
4144
  offsetX: number;
3876
4145
  offsetY: number;
3877
4146
  };
4147
+ /**
4148
+ * 上传单个文件为资源
4149
+ *
4150
+ * @param file - 浏览器 File 对象
4151
+ * @param fid - 可选的文件 ID,不传则由上传服务自动生成
4152
+ * @param check - 是否标记历史记录
4153
+ * @returns 文件 ID
4154
+ */
3878
4155
  upload(file: File, fid?: string, check?: boolean): Promise<string>;
4156
+ /**
4157
+ * 批量上传文件为资源
4158
+ *
4159
+ * 自动检测重复文件并提示用户。fidList 长度需与 fileList 一致或为空。
4160
+ *
4161
+ * @param fileList - 文件列表,支持 FileList、File[]、单个 File 或 null
4162
+ * @param check - 是否标记历史记录
4163
+ * @param fidList - 可选的文件 ID 列表,与 fileList 一一对应
4164
+ */
3879
4165
  uploadMulti(fileList: FileList | File[] | File | null | undefined, check?: boolean, fidList?: string[]): Promise<void>;
3880
- addByOssUrl(ossUrl: string, name?: string, fid?: string, check?: boolean): Promise<string>;
4166
+ /** 预览图宽度(像素) */
3881
4167
  PREVIEW_IMAGE_WIDTH: number;
4168
+ /** 预览图高度(像素) */
3882
4169
  PREVIEW_IMAGE_HEIGHT: number;
3883
- generateDescribeAndPreview(file: File): Promise<[string, File | null]>;
3884
- generatePreviewFile(img: HTMLImageElement | HTMLVideoElement, name: string): Promise<File>;
3885
- generateDescribeForTexture(texture: BaseTexture, fromFid: string): string;
4170
+ /**
4171
+ * 生成纹理的描述信息
4172
+ *
4173
+ * @param texture - BabylonJS 纹理对象
4174
+ * @param fromFileId - 纹理来源的文件 ID
4175
+ * @returns 包含分辨率和来源文件名的描述字符串
4176
+ */
4177
+ generateDescribeForTexture(texture: BaseTexture, fromFileId: string): string;
4178
+ /**
4179
+ * 生成纹理的预览图文件
4180
+ *
4181
+ * 将 BabylonJS 纹理渲染为 256x256 的 PNG 预览图,保持宽高比居中绘制。
4182
+ *
4183
+ * @param texture - BabylonJS 纹理对象
4184
+ * @param filename - 输出文件名,默认 'texture.png'
4185
+ * @returns PNG 格式的 File 对象,失败返回 null
4186
+ */
3886
4187
  generatePreviewForTexture(texture: BaseTexture, filename?: string): Promise<File | null>;
4188
+ /**
4189
+ * 生成资源/文件 ID
4190
+ *
4191
+ * @returns 以 'F' 为前缀的唯一 ID
4192
+ */
3887
4193
  generateId(): string;
3888
4194
  }
3889
4195
 
@@ -4379,7 +4685,6 @@ export declare enum RsModelStatus {
4379
4685
  CANCELED = "CANCELED"
4380
4686
  }
4381
4687
 
4382
-
4383
4688
  /**
4384
4689
  * @public
4385
4690
  */
@@ -5050,20 +5355,37 @@ export declare interface RvAwarenessWindow {
5050
5355
  }
5051
5356
 
5052
5357
  /**
5358
+ * 全局协同数据总变量
5359
+ *
5360
+ * 所有项目数据的根结构,通过 RhineVar 实现多人实时同步。
5361
+ * files 和 resources 仅存储 ID 列表,元数据通过对应 Service 从后端获取并缓存在本地。
5362
+ *
5053
5363
  * @public
5054
5364
  */
5055
5365
  export declare interface RvBase {
5366
+ /** 项目全局配置 */
5056
5367
  project: RvProject;
5368
+ /** 场景展示顺序(sid 列表) */
5057
5369
  order: RhineVarArray<string>;
5370
+ /** 场景 Map(sid -> RvStep) */
5058
5371
  steps: RhineVarMap<RvStep>;
5372
+ /** 插件信息 */
5059
5373
  plugin: RvPlugin;
5060
- files: RhineVarMap<RvFile>;
5061
- resources: RhineVarMap<RvResource>;
5374
+ /** 文件 ID 列表,元数据通过 RvFileService.getMetadata() 获取 */
5375
+ files: RhineVarArray<string>;
5376
+ /** 资源 ID 列表,元数据通过 RvResourceService.getMetadata() 获取 */
5377
+ resources: RhineVarArray<string>;
5378
+ /** 场景节点树 */
5062
5379
  scene: RhineVarMap<RvSceneNode>;
5380
+ /** 模型列表 */
5063
5381
  models: RhineVarMap<RvModel>;
5382
+ /** 材质分离数据 */
5064
5383
  separate: RvSeparate;
5384
+ /** 历史记录 */
5065
5385
  history: RvHistory;
5386
+ /** 会议信息 */
5066
5387
  meetings: RhineVarMap<RvMeeting>;
5388
+ /** 版本信息 */
5067
5389
  version: RvVersion;
5068
5390
  }
5069
5391
 
@@ -5201,42 +5523,97 @@ export declare interface RvEnvironment {
5201
5523
  }
5202
5524
 
5203
5525
  /**
5526
+ * 文件元数据接口
5527
+ *
5528
+ * 描述项目中一个文件的完整元信息。
5529
+ * 协同数据中仅存储 fid,完整元数据通过 RvFileService.getMetadata() 从后端获取并缓存。
5530
+ *
5204
5531
  * @public
5205
5532
  */
5206
5533
  export declare interface RvFile {
5534
+ /** 文件唯一标识 */
5207
5535
  fid: string;
5536
+ /** 文件存储类型 */
5208
5537
  type: RvFileType;
5538
+ /** 文件名 */
5209
5539
  name: string;
5540
+ /** 文件大小(字节) */
5210
5541
  size: number;
5542
+ /** MIME 类型 */
5211
5543
  mime: string;
5544
+ /** 文件内容哈希值,用于去重 */
5212
5545
  hash?: string;
5546
+ /** 文件地址。格式: https://xxx | oss://{bucket}/{path} | attach://{fid} */
5213
5547
  url: string;
5548
+ /** 创建时间戳(毫秒) */
5214
5549
  createdAt: number;
5550
+ /** 更新时间戳(毫秒) */
5215
5551
  updatedAt: number;
5552
+ /** 是否正在上传中 */
5216
5553
  uploading?: boolean;
5554
+ /** 扩展数据 */
5217
5555
  extra?: Record<string, unknown>;
5218
5556
  }
5219
5557
 
5220
5558
  /**
5559
+ * 文件协同数据服务
5560
+ *
5561
+ * 管理协同数据中的 fileId 列表,以及本地文件元数据缓存。
5562
+ * fileId 列表存储在协同数据中,元数据从后端获取并缓存在本地。
5563
+ *
5221
5564
  * @public
5222
5565
  */
5223
5566
  export declare class RvFileService {
5224
5567
  static get instance(): RvFileService;
5225
5568
  private constructor();
5226
- files: RecursiveMap<RvFile>;
5227
- get(fid: string): RecursiveObject<RvFile> | undefined;
5228
- getByUrl(url: string): RecursiveObject<RvFile> | undefined;
5229
- has(fid: string): boolean;
5230
- hasUrl(url: string): boolean;
5231
- add(fileData: RvFile): Promise<StoredRhineVar<RvFile> | null>;
5232
- addByUrl(url: string): Promise<StoredRhineVar<RvFile> | null>;
5233
- remove(fid: string): boolean;
5569
+ files: RhineVarArray<string>;
5570
+ private metadataCache;
5571
+ /**
5572
+ * 添加 fileId 到协同数据
5573
+ */
5574
+ add(fileId: string): void;
5575
+ /**
5576
+ * 从协同数据移除 fileId
5577
+ */
5578
+ remove(fileId: string): boolean;
5579
+ /**
5580
+ * 检查 fileId 是否在列表中
5581
+ */
5582
+ has(fileId: string): boolean;
5583
+ /**
5584
+ * 获取缓存的文件元数据
5585
+ */
5586
+ getMetadata(fileId: string): ResourceFileInfo | undefined;
5587
+ /**
5588
+ * 设置文件元数据缓存
5589
+ */
5590
+ setMetadata(fileId: string, metadata: ResourceFileInfo): void;
5591
+ /**
5592
+ * 获取文件下载 URL(通过后端签名)
5593
+ */
5594
+ getDownloadUrl(fileId: string): Promise<string>;
5595
+ /**
5596
+ * 订阅文件列表变化事件(ADD/REMOVE)
5597
+ *
5598
+ * @param subscriber - 事件回调函数
5599
+ * @returns 取消订阅的函数
5600
+ */
5234
5601
  subscribe(subscriber: RvFileServiceSubscriber): () => void;
5602
+ /**
5603
+ * 取消订阅文件列表变化事件
5604
+ *
5605
+ * @param subscriber - 要取消的回调函数
5606
+ */
5235
5607
  unsubscribe(subscriber: RvFileServiceSubscriber): void;
5236
- subscribeSingle(fid: string, subscriber: RvFileServiceSubscriber): () => void;
5237
- unsubscribeSingle(fid: string, subscriber: RvFileServiceSubscriber): void;
5238
- generateId(): string;
5239
- findSame(file: File): Promise<string | null>;
5608
+ /**
5609
+ * 订阅单个文件的变化事件
5610
+ *
5611
+ * @param fileId - 文件 ID
5612
+ * @param subscriber - 事件回调函数
5613
+ * @returns 取消订阅的函数
5614
+ */
5615
+ subscribeSingle(fileId: string, subscriber: RvFileServiceSubscriber): () => void;
5616
+ unsubscribeSingle(fileId: string, subscriber: RvFileServiceSubscriber): void;
5240
5617
  }
5241
5618
 
5242
5619
  /**
@@ -5250,7 +5627,7 @@ export declare enum RvFileServiceEventType {
5250
5627
  /**
5251
5628
  * @public
5252
5629
  */
5253
- export declare type RvFileServiceSubscriber = (type: RvFileServiceEventType, fid: string, rvFile?: RecursiveObject<RvFile>) => void;
5630
+ export declare type RvFileServiceSubscriber = (type: RvFileServiceEventType, fileId: string) => void;
5254
5631
 
5255
5632
  /**
5256
5633
  * @public
@@ -5682,42 +6059,107 @@ export declare class RvProjectService {
5682
6059
  }
5683
6060
 
5684
6061
  /**
6062
+ * 资源元数据接口
6063
+ *
6064
+ * 描述项目中一个资源的完整元信息。资源是用户可见的文件或程序资源(如材质、贴图)。
6065
+ * 协同数据中仅存储资源 ID,完整元数据通过 RvResourceService.getMetadata() 从后端获取并缓存。
6066
+ *
6067
+ * 一个资源可能对应多个文件(如图片资源 + 缩略图文件),
6068
+ * 一个文件也可能对应多个资源(如模型文件内部的多个贴图为 Attach 型资源)。
6069
+ *
5685
6070
  * @public
5686
6071
  */
5687
6072
  export declare interface RvResource {
6073
+ /** 关联的文件 ID */
5688
6074
  fid: string;
6075
+ /** 资源名称 */
5689
6076
  name: string;
6077
+ /** 资源类型: FILE(独立文件资源)或 ATTACH(主资源的内置子资源) */
5690
6078
  type: RvResourceType;
6079
+ /** MIME 类型 */
5691
6080
  mime: string;
6081
+ /** 预览图 URL */
5692
6082
  preview?: string;
6083
+ /** 资源描述信息 */
5693
6084
  description?: string;
6085
+ /** Attach 型资源的来源信息,仅当 type 为 ATTACH 时存在 */
5694
6086
  from?: {
6087
+ /** 来源文件 ID */
5695
6088
  fid: string;
6089
+ /** Attach 类型: TEXTURE | MATERIAL | UV */
5696
6090
  type: RvAttachType;
6091
+ /** 资源在文件内部的路径 */
5697
6092
  path: string;
5698
6093
  };
6094
+ /** 创建时间戳(毫秒) */
5699
6095
  createdAt: number;
6096
+ /** 更新时间戳(毫秒) */
5700
6097
  updatedAt: number;
6098
+ /** 扩展数据 */
5701
6099
  extra?: Record<string, unknown>;
5702
6100
  }
5703
6101
 
5704
6102
  /**
6103
+ * 资源协同数据服务
6104
+ *
6105
+ * 管理协同数据中的 resourceId 列表,以及本地资源元数据缓存。
6106
+ * resourceId 列表存储在协同数据中,元数据从后端获取并缓存在本地。
6107
+ *
5705
6108
  * @public
5706
6109
  */
5707
6110
  export declare class RvResourceService {
5708
6111
  static get instance(): RvResourceService;
5709
6112
  private constructor();
5710
- resources: RecursiveMap<RvResource>;
5711
- get(fid: string): RecursiveObject<RvResource> | undefined;
5712
- has(fid: string): boolean;
5713
- add(file: RvResource): void;
5714
- remove(fid: string): boolean;
6113
+ resources: StoredRhineVar<string[]>;
6114
+ private metadataCache;
6115
+ /**
6116
+ * 添加 resourceId 到协同数据
6117
+ */
6118
+ add(resourceId: string): void;
6119
+ /**
6120
+ * 从协同数据移除 resourceId
6121
+ */
6122
+ remove(resourceId: string): boolean;
6123
+ /**
6124
+ * 检查 resourceId 是否在列表中
6125
+ */
6126
+ has(resourceId: string): boolean;
6127
+ /**
6128
+ * 获取缓存的资源元数据
6129
+ */
6130
+ getMetadata(resourceId: string): Resource | undefined;
6131
+ /**
6132
+ * 设置资源元数据缓存
6133
+ */
6134
+ setMetadata(resourceId: string, metadata: Resource): void;
6135
+ /**
6136
+ * 批量获取所有资源元数据(项目初始化时调用)
6137
+ *
6138
+ * 同时从 Resource.contentFile 提取文件元数据,写入 RvFileService.metadataCache
6139
+ */
6140
+ fetchAllMetadata(): Promise<void>;
6141
+ /**
6142
+ * 订阅资源列表变化事件(ADD/REMOVE)
6143
+ *
6144
+ * @param subscriber - 事件回调函数
6145
+ * @returns 取消订阅的函数
6146
+ */
5715
6147
  subscribe(subscriber: RvResourceServiceSubscriber): () => void;
6148
+ /**
6149
+ * 取消订阅资源列表变化事件
6150
+ *
6151
+ * @param subscriber - 要取消的回调函数
6152
+ */
5716
6153
  unsubscribe(subscriber: RvResourceServiceSubscriber): void;
5717
- subscribeSingle(fid: string, subscriber: RvResourceServiceSubscriber): () => void;
5718
- unsubscribeSingle(fid: string, subscriber: RvResourceServiceSubscriber): void;
5719
- generateId(): string;
5720
- findSame(file: File): Promise<string | null>;
6154
+ /**
6155
+ * 订阅单个资源的变化事件
6156
+ *
6157
+ * @param resourceId - 资源 ID
6158
+ * @param subscriber - 事件回调函数
6159
+ * @returns 取消订阅的函数
6160
+ */
6161
+ subscribeSingle(resourceId: string, subscriber: RvResourceServiceSubscriber): () => void;
6162
+ unsubscribeSingle(resourceId: string, subscriber: RvResourceServiceSubscriber): void;
5721
6163
  }
5722
6164
 
5723
6165
  /**
@@ -5731,7 +6173,7 @@ export declare enum RvResourceServiceEventType {
5731
6173
  /**
5732
6174
  * @public
5733
6175
  */
5734
- export declare type RvResourceServiceSubscriber = (type: RvResourceServiceEventType, fid: string, rvResource?: RecursiveObject<RvResource>) => void;
6176
+ export declare type RvResourceServiceSubscriber = (type: RvResourceServiceEventType, resourceId: string) => void;
5735
6177
 
5736
6178
  /**
5737
6179
  * @public
@@ -6467,7 +6909,8 @@ export declare class SyncService {
6467
6909
  *
6468
6910
  * @public
6469
6911
  */
6470
- url: string;
6912
+ private getUrl;
6913
+ private getToken;
6471
6914
  /**
6472
6915
  * RhineVar 协同状态对象
6473
6916
  *
@@ -6758,7 +7201,6 @@ declare function toEulerDegrees(v: V4): V3;
6758
7201
 
6759
7202
  declare function toEulerRadians(v: V4): V3;
6760
7203
 
6761
-
6762
7204
  /**
6763
7205
  * 360度制欧拉角转四元数
6764
7206
  * @public
@@ -6823,7 +7265,7 @@ export declare function useAllSelectedInfo(): {
6823
7265
  /**
6824
7266
  * @public
6825
7267
  */
6826
- export declare function useGlobalAttribute<T extends object = any>(path?: string | RvPath): {
7268
+ export declare function useGlobalAttribute<T extends object = object>(path?: string | RvPath): {
6827
7269
  state: T | StoredRhineVar<T>;
6828
7270
  path: string | RvPath;
6829
7271
  targetGlobalAttribute: GlobalAttribute<T>;
@@ -6903,7 +7345,7 @@ export declare function useStepOptions(withDisable?: boolean): StepOptions;
6903
7345
  /**
6904
7346
  * @public
6905
7347
  */
6906
- export declare function useTargetNodeAttribute<T extends object = any>(path?: string | RvPath): {
7348
+ export declare function useTargetNodeAttribute<T extends object = object>(path?: string | RvPath): {
6907
7349
  state: T | StoredRhineVar<T>;
6908
7350
  path: string | RvPath;
6909
7351
  sid: string;
@@ -6939,7 +7381,7 @@ export declare function useTargetNodeAttribute<T extends object = any>(path?: st
6939
7381
  /**
6940
7382
  * @public
6941
7383
  */
6942
- export declare function useTargetStepAttribute<T extends object = any>(path?: string | RvPath): {
7384
+ export declare function useTargetStepAttribute<T extends object = object>(path?: string | RvPath): {
6943
7385
  state: T | StoredRhineVar<T>;
6944
7386
  path: string | RvPath;
6945
7387
  sid: string;
package/package.json CHANGED
@@ -34,9 +34,9 @@
34
34
  "react": "19.2.3",
35
35
  "react-dom": "19.2.3",
36
36
  "valtio": "2.1.7",
37
- "rhine-var": "^2.4.2"
37
+ "rhine-var": "2.4.3"
38
38
  },
39
- "version": "0.27.8",
39
+ "version": "0.27.11",
40
40
  "author": "NextFlow",
41
41
  "license": "Apache-2.0",
42
42
  "keywords": [