rhine-var 0.2.0 → 0.3.2

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 (33) hide show
  1. package/README.md +109 -16
  2. package/README_zh.md +130 -0
  3. package/dist/core/class/array/RhineArray.d.ts +2 -1
  4. package/dist/core/class/array/RhineArray.d.ts.map +1 -1
  5. package/dist/core/class/array/RhineArray.js +1 -1
  6. package/dist/core/class/array/RhineVarArray.d.ts +4 -0
  7. package/dist/core/class/array/RhineVarArray.d.ts.map +1 -0
  8. package/dist/core/class/array/RhineVarArray.js +5 -0
  9. package/dist/core/connector/WebsocketRhineConnector.d.ts +1 -0
  10. package/dist/core/connector/WebsocketRhineConnector.d.ts.map +1 -1
  11. package/dist/core/connector/WebsocketRhineConnector.js +11 -5
  12. package/dist/core/event/Callback.d.ts.map +1 -1
  13. package/dist/core/native/NativeUtils.d.ts +2 -0
  14. package/dist/core/native/NativeUtils.d.ts.map +1 -1
  15. package/dist/core/native/NativeUtils.js +36 -0
  16. package/dist/core/proxy/ProxiedRhineVar.d.ts +2 -1
  17. package/dist/core/proxy/ProxiedRhineVar.d.ts.map +1 -1
  18. package/dist/core/proxy/Proxy.d.ts +3 -1
  19. package/dist/core/proxy/Proxy.d.ts.map +1 -1
  20. package/dist/core/proxy/Proxy.js +21 -17
  21. package/dist/core/proxy/RhineVar.d.ts +9 -2
  22. package/dist/core/proxy/RhineVar.d.ts.map +1 -1
  23. package/dist/core/proxy/RhineVar.js +30 -4
  24. package/dist/core/utils/ConvertProperty.d.ts +18 -1
  25. package/dist/core/utils/ConvertProperty.d.ts.map +1 -1
  26. package/dist/core/utils/ConvertProperty.js +281 -25
  27. package/dist/core/utils/DataUtils.d.ts +4 -2
  28. package/dist/core/utils/DataUtils.d.ts.map +1 -1
  29. package/dist/core/utils/DataUtils.js +10 -0
  30. package/dist/index.d.ts +2 -3
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -3
  33. package/package.json +1 -1
package/README.md CHANGED
@@ -1,46 +1,139 @@
1
+ <div align="center">
1
2
 
2
- # The most concise and rigorous strongly-typed real-time collaborative editing library.
3
+ # RHINE-VAR: Simplest and Most Powerful Collaborative Framework
3
4
 
4
- Variables that support multi-user collaboration and persistence, making collaboration and variable operations as simple as possible, with strict and well-defined type hints.
5
+ Rhine Variable A self-synchronizing variable for collaboration.
6
+ Developing collaborative applications has never been this easy.
7
+
8
+
9
+ [English](README.md) &nbsp; | &nbsp; [中文](README_zh.md)
10
+
11
+ <img src='./assets/images/example1.png' style="border-radius: 10px; max-width: 840px"/>
12
+
13
+ </div>
14
+
15
+ <br/>
16
+
17
+ ## Why Choose RHINE-VAR ?
18
+
19
+ ### Concise and Efficient Syntax Design
20
+ RhineVar draws inspiration from the design philosophy of the Valtio state management library, significantly reducing the learning curve. Developers can easily manage collaborative data as if they were manipulating regular variables.
21
+
22
+ ### Comprehensive Type Support
23
+ RhineVar offers full type hints and checks, ensuring precise code completion and static analysis during development. This not only improves the development experience but also reduces potential errors, making it especially suitable for TypeScript projects, enhancing code safety and reliability.
24
+
25
+ ### Distributed Real-time Collaboration Algorithm
26
+ The underlying collaboration algorithm of RhineVar is powered by the robust Yjs library. Using the CRDT (Conflict-free Replicated Data Type) algorithm, it ensures eventual consistency even in multi-user and offline environments.
27
+
28
+ ### High Performance with Low Bandwidth Requirements
29
+ The data synchronization and conflict resolution mechanism is highly efficient. Leveraging Yjs's incremental update mechanism, only necessary data changes are transmitted rather than the entire document, making it ideal for bandwidth-constrained environments and reducing unnecessary data transfers.
30
+
31
+ ### Strong Offline Support
32
+ Users can continue to work even while offline. Once reconnected, all changes are automatically synchronized, ensuring no data is lost or conflicted. This is crucial for building offline-first applications.
33
+
34
+ ### Cross-platform and Framework Agnostic
35
+ RhineVar can be used in various environments, including browsers, Node.js, and other JavaScript platforms. It integrates with multiple frontend frameworks and libraries such as Next.js, React, Vue.js, ProseMirror, and more.
36
+
37
+ ### Lightweight and Extensible
38
+ RhineVar is a highly lightweight library, with its core package only a few KB in size, making it suitable for various frontend applications. Its modular architecture supports feature extensions, allowing developers to import or develop custom modules as needed.
39
+
40
+ ### Decentralized Architecture
41
+ With a decentralized architecture, collaborative editing becomes more scalable, efficient, and fault-tolerant. Peer-to-peer data transfer is supported without relying on a central server (currently under development).
42
+
43
+ ### Native Yjs Support
44
+ RhineVar offers full support for native Yjs object operations, providing lower-level, richer API support. Direct operations on Yjs objects automatically trigger updates in RhineVar.
45
+
46
+ ### More Friendly and Complete Event System
47
+ RhineVar offers an extensive event subscription and listening system with intuitive data change events. It also supports deep data change monitoring within objects, catering to a wide range of use cases.
48
+
49
+ <br/>
50
+
51
+ ## Contact Us
52
+ Welcome to join our WeChat group for communication. We look forward to having more community members participate in the creation of rhine-var.
53
+
54
+ WeChat: [FNA-04]()
55
+
56
+ Email: [RhineAILab@gmail.com](rhineailab@gmail.com) & [RhineAI@163.com](RhineAI@163.com)
57
+
58
+ <br/>
5
59
 
6
60
  ## Install
7
61
  ```bash
8
- npm i rhine-var
9
- ```
10
- Or with yarn:
11
- ```bash
12
62
  yarn add rhine-var
13
63
  ```
64
+ If you don't have `yarn`, you can install it via `npm i rhine-var`, or install `yarn` first using `npm i -g yarn` and then use the command above to install.
14
65
 
15
- ## Usage
66
+ <br/>
16
67
 
68
+ ## Usage
17
69
 
18
70
  ```typescript jsx
19
71
  const defaultValue = {value: 0}
20
- const count = rhineProxy(defaultValue, 'RhineAI.com/ws/room-0')
21
-
22
- function EasyCounter() {
72
+ const count = rhineProxy(defaultValue, 'localhost:6600/room-0')
23
73
 
74
+ function Counter() {
75
+
24
76
  const countSnap = useRhine(count)
25
-
26
- return <div className='page'>
77
+
78
+ return <div>
27
79
  <button onClick={() => count.value-- }> - 1 </button>
28
80
  <span>{countSnap.value}</span>
29
81
  <button onClick={() => count.value++ }> + 1 </button>
30
82
  </div>
31
83
  }
32
84
  ```
85
+ ### Default Value
86
+
87
+ When the room does not exist on the server, a default value will be used to create the room. If not connected to the server, data from the default value will also be returned.
88
+
89
+ ### Room ID
90
+
91
+ The `Same Room ID` manages the `Same State Variables`, and users who join will experience real-time multi-user collaboration.
92
+
93
+ ### rhineProxy
94
+
95
+ Create a `RhineVariable` that anyone in the room can directly modify, and the value will be synchronized to everyone almost simultaneously.
96
+
97
+ Its value is `at least an object` in javascript, `but` there is almost no upper limit. It can be an `extremely complex and large JSON structure` to accommodate all the data for a large project.
98
+
99
+ ### useRhine
100
+
101
+ A hook for use with React. It creates a snapshot of a `RhineVariable`, and whenever someone modifies this value, the information will be `updated on everyone's screen` in real-time.
102
+
103
+ Use snapshot only when data needs to be displayed on the React page. For other operations, such as modifying values, please use RhineVariable itself.
33
104
 
34
105
  <br/>
35
106
 
36
- ## Develop With US
107
+ ## Server
108
+ We provide a simple server as a reference, located at `/test/server` in this project. The server is fully compatible with all Yjs websocket servers.
109
+ ```
110
+ git clone https://github.com/RhineAI-Lab/rhine-var.git
111
+ cd test/server
112
+ yarn install
113
+ yarn start
114
+ ```
115
+ It will run on `Port 6600`, and you can connect to it via `ws://localhost:6600/<room-id>`. `<room-id>` can be any text, with each room ID corresponding to a `RhineVariable`.
37
116
 
38
- Start Debug Mode
117
+ More information about server develop: [https://docs.yjs.dev/ecosystem/connection-provider/y-websocket](https://docs.yjs.dev/ecosystem/connection-provider/y-websocket)
118
+
119
+ <br/>
120
+
121
+ ## Develop
39
122
 
40
123
  ```bash
41
- npm run watch
124
+ # start watch and build by typescript
125
+ yarn run watch
126
+
127
+ # start a easy websocket server
128
+ cd test/server
129
+ yarn install
130
+ yarn start
131
+
132
+ # start a nextjs playground for develop debug
42
133
  cd test/debug/next-app
43
- npm run dev
134
+ yarn install
135
+ yarn start
136
+ # Open http://localhost:3000 in browser
44
137
  ```
45
138
 
46
139
  <br/>
package/README_zh.md ADDED
@@ -0,0 +1,130 @@
1
+ <div align="center">
2
+
3
+ # 最简单且强大的多人协同框架 RHINE-VAR
4
+
5
+ 莱茵变量 —— 会自己与他人协同的变量 &nbsp; 多人协同应用开发从未如此简单
6
+
7
+ [English](README.md) &nbsp; | &nbsp; [中文](README_zh.md)
8
+
9
+ <img src='./assets/images/example1.png' style="border-radius: 10px; max-width: 840px"/>
10
+
11
+ </div>
12
+
13
+ <br/>
14
+
15
+ ## 为什么选择 RHINE-VAR ?
16
+
17
+ **简洁高效的语法设计:** &nbsp; RhineVar 借鉴了 Valtio 状态管理库的设计理念,极大地降低了学习成本。开发者可以像操作普通变量一样轻松操控协同数据。
18
+
19
+ **完备的类型支持:** &nbsp; RhineVar 提供全面的类型提示和类型检查,确保在开发过程中能够获得精确的代码补全和静态分析。这不仅改善了开发体验,还有效降低了潜在的错误风险,特别适用于 TypeScript 项目,提升了代码的安全性和可靠性。
20
+
21
+ **分布式实时协作算法:** &nbsp; RhineVar 的底层协同算法基于强大的 Yjs 库。通过 CRDT (Conflict-free Replicated Data Type,无冲突复制数据类型) 算法,确保多用户同时使用,甚至离线下使用的最终一致性。
22
+
23
+ **高性能和低带宽需求:** &nbsp; 数据同步和冲突解决机制非常高效,通过 Yjs 的增量更新机制,仅传输必要的数据更改,而非整个文档。这使得它在网络带宽受限的环境中表现良好,减少了不必要的数据传输。
24
+
25
+ **强大的离线支持:** &nbsp; 即使在离线状态下,用户仍然可以继续使用应用。当重新联机时,所有更改将自动同步,确保数据不会出现丢失或冲突。这对于构建离线优先的应用至关重要。
26
+
27
+ **跨平台和框架无关:** &nbsp; RhineVar 支持在多种环境中使用,包括浏览器、Node.js 和其他 JavaScript 环境。此外,它可以与多个前端框架和库 (如 NextJs、React、Vue.js、ProseMirror 等) 集成。
28
+
29
+ **轻量级且可扩展:** &nbsp; RhineVar 是一个非常轻量的库,核心包仅几 KB,适合各种前端应用。其模块化架构也支持扩展特性,开发者可以根据需要引入或开发自定义模块。
30
+
31
+ **去中心化架构:** &nbsp; 通过去中心化架构,使得协作编辑更具扩展性、更高效且更具容错能力。可通过 P2P 进行数据传输,无需依赖中央服务器(开发中)。
32
+
33
+ **原生Yjs支持:** &nbsp; RhineVar 提供完好的Yjs原生对象操作支持,更底层更丰富的API支持。直接对Yjs的对象进行操作,也将自动触发 RhineVar 的更新。
34
+
35
+ **更友好且完善的事件体系:** &nbsp; RhineVar 提供了丰富的事件订阅监听方式,直观的数据变更事件,更好的支持数据变更的监听和处理。以及提供了对内部深层数据变化的监听,以适用更多场景。
36
+
37
+ <br/>
38
+
39
+ ## Contact Us
40
+
41
+ 欢迎加入我们的微信群一起讨论交流,我们期待更多的社区成员能加入到 RHINE-VAR 的创造中来!
42
+
43
+ 微信: [FNA-04]() (请备注来源)
44
+
45
+ 邮箱: [RhineAILab@gmail.com](rhineailab@gmail.com) & [RhineAI@163.com](RhineAI@163.com)
46
+
47
+ <br/>
48
+
49
+ ## Install
50
+ ```bash
51
+ yarn add rhine-var
52
+ ```
53
+ 如果你的电脑未安装`yarn`, 也可通过 `npm i rhine-var` 安装。或先用 `npm i -g yarn` 安装`yarn`,然后再用上方命令进行安装。
54
+
55
+ <br/>
56
+
57
+ ## Usage
58
+
59
+ ```typescript jsx
60
+ const defaultValue = {value: 0}
61
+ const count = rhineProxy(defaultValue, 'localhost:6600/room-0')
62
+
63
+ function Counter() {
64
+
65
+ const countSnap = useRhine(count)
66
+
67
+ return <div>
68
+ <button onClick={() => count.value-- }> - 1 </button>
69
+ <span>{countSnap.value}</span>
70
+ <button onClick={() => count.value++ }> + 1 </button>
71
+ </div>
72
+ }
73
+ ```
74
+ ### Default Value
75
+
76
+ 当服务端无信息时,将使用 DefaultValue 作为默认内容。未连接到服务器时,也将根据默认值进行返回。
77
+
78
+ ### Room ID
79
+
80
+ 一个房间号对应一个状态变量, 加入到一个房间中的用户会参与到多人协同中。
81
+
82
+ ### rhineProxy
83
+
84
+ 用于创建一个 `RhineVariable` 他的值会和房间中的其他人共享并同步。
85
+
86
+ 你可以像操作 JavaScript 中的普通变量一样直接随意操作他。
87
+
88
+ 值的类型至少是 JavaScript 中的 object,但没有上限。它可以是一个非常复杂和庞大的 JSON 结构,以容纳大型项目的所有数据。
89
+
90
+ ### useRhine
91
+
92
+ 一个 `React` 的 `Hook` 函数. 他将为 `RhineVariable` 创建一个快照, 用于自动热重载更新页面。当任何人对值做出修改时,他会把最新的值立刻更新到所有人的屏幕上。
93
+
94
+ 只有页面需要数据的时候使用 `useRhine` 创造的快照。在其他操作,例如赋值时,请操作原来的 `RhineVariable`。
95
+
96
+ <br/>
97
+
98
+ ## Server
99
+ 我们提供了一个简单的服务器例子,位于本项目中的 `/test/server` 处。 服务端完全兼容所有的 Yjs 的 Websocket 服务器,将来会支持更多。
100
+ ```
101
+ git clone https://github.com/RhineAI-Lab/rhine-var.git
102
+ cd test/server
103
+ yarn install
104
+ yarn start
105
+ ```
106
+ 默认运行在 `端口 6600`, 你可以通过连接 `ws://localhost:6600/<room-id>` 连接他,`<room-id>` 可以是任意文本,一个房间号对应一个 `RhineVariable`。
107
+
108
+ 更多服务端开发信息请参考: [https://docs.yjs.dev/ecosystem/connection-provider/y-websocket](https://docs.yjs.dev/ecosystem/connection-provider/y-websocket)
109
+
110
+ <br/>
111
+
112
+ ## Develop
113
+
114
+ ```bash
115
+ # 开始 typescript 自动构建更新
116
+ yarn run watch
117
+
118
+ # 开启临时服务端
119
+ cd test/server
120
+ yarn install
121
+ yarn start
122
+
123
+ # 开始 NextJS 的热环境调试测试项目
124
+ cd test/debug/next-app
125
+ yarn install
126
+ yarn start
127
+ # 浏览器访问 http://localhost:3000
128
+ ```
129
+
130
+ <br/>
@@ -1,3 +1,4 @@
1
- export default class RhineArray<T> {
1
+ import RhineVar from "../../proxy/RhineVar";
2
+ export default class RhineArray<T> extends Array<T | RhineVar<T[]>> {
2
3
  }
3
4
  //# sourceMappingURL=RhineArray.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RhineArray.d.ts","sourceRoot":"","sources":["../../../../src/core/class/array/RhineArray.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC;CAEhC"}
1
+ {"version":3,"file":"RhineArray.d.ts","sourceRoot":"","sources":["../../../../src/core/class/array/RhineArray.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,6BAA8B;AAE7C,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;CAElE"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- class RhineArray {
3
+ class RhineArray extends Array {
4
4
  }
5
5
  exports.default = RhineArray;
@@ -0,0 +1,4 @@
1
+ import RhineVar from "../../proxy/RhineVar";
2
+ export default class RhineVarArray<T> extends Array<T | RhineVar<T[]>> {
3
+ }
4
+ //# sourceMappingURL=RhineVarArray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RhineVarArray.d.ts","sourceRoot":"","sources":["../../../../src/core/class/array/RhineVarArray.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,6BAA8B;AAE7C,MAAM,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;CAErE"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class RhineVarArray extends Array {
4
+ }
5
+ exports.default = RhineVarArray;
@@ -16,6 +16,7 @@ export default class WebsocketRhineConnector {
16
16
  addSyncedListener(listener: SyncedListener): void;
17
17
  removeSyncedListener(listener: SyncedListener): void;
18
18
  emitSynced(synced: boolean): void;
19
+ afterSynced(callback: () => void): void;
19
20
  waitSynced(): Promise<void>;
20
21
  constructor(url?: string);
21
22
  bind(defaultValue: Native, overwrite?: boolean): any;
@@ -1 +1 @@
1
- {"version":3,"file":"WebsocketRhineConnector.d.ts","sourceRoot":"","sources":["../../../src/core/connector/WebsocketRhineConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,IAAI,IAAI,EAAmB,GAAG,IAAI,IAAI,EAAC,MAAM,KAAK,CAAC;AAC9D,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAC,eAAe,EAAC,0BAAyC;AAEjE,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAE5C,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAEtD,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAE1C,MAAM,CAAC,SAAS,SAAU;IAE1B,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,GAAG,EAAE,MAAM,CAAK;IAEhB,QAAQ,SAAK;IACb,MAAM,UAAQ;IAEd,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAO;IACzC,eAAe,EAAE,eAAe,CAA+B;IAG/D,eAAe,EAAE,cAAc,EAAE,CAAK;IACtC,iBAAiB,CAAC,QAAQ,EAAE,cAAc;IAG1C,oBAAoB,CAAC,QAAQ,EAAE,cAAc;IAG7C,UAAU,CAAC,MAAM,EAAE,OAAO;IAI1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;gBAcf,GAAG,SAAK;IAMpB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe;IAc/C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4C1C;AAGD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,2BAMhD"}
1
+ {"version":3,"file":"WebsocketRhineConnector.d.ts","sourceRoot":"","sources":["../../../src/core/connector/WebsocketRhineConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,IAAI,IAAI,EAAmB,GAAG,IAAI,IAAI,EAAC,MAAM,KAAK,CAAC;AAC9D,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAC,eAAe,EAAC,0BAAyC;AAEjE,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAE5C,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAEtD,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAE1C,MAAM,CAAC,SAAS,SAAU;IAE1B,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,GAAG,EAAE,MAAM,CAAK;IAEhB,QAAQ,SAAK;IACb,MAAM,UAAQ;IAEd,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAO;IACzC,eAAe,EAAE,eAAe,CAA+B;IAG/D,eAAe,EAAE,cAAc,EAAE,CAAK;IACtC,iBAAiB,CAAC,QAAQ,EAAE,cAAc;IAG1C,oBAAoB,CAAC,QAAQ,EAAE,cAAc;IAG7C,UAAU,CAAC,MAAM,EAAE,OAAO;IAI1B,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI;IAahC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;gBAOf,GAAG,SAAK;IAMpB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe;IAc/C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4C1C;AAGD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,2BAMhD"}
@@ -15,17 +15,23 @@ class WebsocketRhineConnector {
15
15
  emitSynced(synced) {
16
16
  this.syncedListeners.forEach(listener => listener(synced));
17
17
  }
18
- waitSynced() {
19
- return new Promise((resolve) => {
20
- if (this.synced)
21
- return true;
18
+ afterSynced(callback) {
19
+ if (this.synced) {
20
+ callback();
21
+ }
22
+ else {
22
23
  const listener = (synced) => {
23
24
  if (synced) {
24
25
  this.removeSyncedListener(listener);
25
- resolve();
26
+ callback();
26
27
  }
27
28
  };
28
29
  this.addSyncedListener(listener);
30
+ }
31
+ }
32
+ waitSynced() {
33
+ return new Promise((resolve) => {
34
+ this.afterSynced(resolve);
29
35
  });
30
36
  }
31
37
  constructor(url = '') {
@@ -1 +1 @@
1
- {"version":3,"file":"Callback.d.ts","sourceRoot":"","sources":["../../../src/core/event/Callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,qBAAgC;AACnD,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAExD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACjB,GAAG,EAAE,MAAM,CAAC,EACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAC9C,iBAAiB,EAAE,WAAW,KAC3B,IAAI,CAAA"}
1
+ {"version":3,"file":"Callback.d.ts","sourceRoot":"","sources":["../../../src/core/event/Callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,qBAAgC;AACnD,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAGxD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACjB,GAAG,EAAE,MAAM,CAAC,EACZ,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAC9C,iBAAiB,EAAE,WAAW,KAC3B,IAAI,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { Native } from "./Native";
2
2
  export declare function isNative(value: any): boolean;
3
3
  export declare function nativeSet(target: Native, key: string | symbol, value: any): boolean;
4
+ export declare function nativeHas(target: Native, key: string | symbol): boolean;
5
+ export declare function nativeOwnKeys(target: Native): string[];
4
6
  export declare function nativeDelete(target: Native, key: string | symbol): boolean;
5
7
  export declare function nativeGet(target: Native, key: string | symbol): any | undefined;
6
8
  export declare function jsonToNative(data: any): Native | any;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeUtils.d.ts","sourceRoot":"","sources":["../../../src/core/native/NativeUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,iBAA6B;AAI5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAuBnF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAwB1E;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,CAgB/E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,GAAG,CAgBpD"}
1
+ {"version":3,"file":"NativeUtils.d.ts","sourceRoot":"","sources":["../../../src/core/native/NativeUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,iBAA6B;AAI5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAuBnF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAkBvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAYtD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAwB1E;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,CAgB/E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,GAAG,GAAG,CAgBpD"}
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isNative = isNative;
4
4
  exports.nativeSet = nativeSet;
5
+ exports.nativeHas = nativeHas;
6
+ exports.nativeOwnKeys = nativeOwnKeys;
5
7
  exports.nativeDelete = nativeDelete;
6
8
  exports.nativeGet = nativeGet;
7
9
  exports.jsonToNative = jsonToNative;
@@ -35,6 +37,40 @@ function nativeSet(target, key, value) {
35
37
  }
36
38
  return false;
37
39
  }
40
+ function nativeHas(target, key) {
41
+ if (typeof key !== 'string') {
42
+ return false;
43
+ }
44
+ try {
45
+ if (target instanceof yjs_1.Map) {
46
+ return target.has(key);
47
+ }
48
+ else if (target instanceof yjs_1.Array) {
49
+ const index = parseInt(key);
50
+ if (!isNaN(index)) {
51
+ return index < target.length && index >= 0;
52
+ }
53
+ }
54
+ }
55
+ catch (e) {
56
+ console.error('RhineVar nativeHas.error:', e);
57
+ }
58
+ return false;
59
+ }
60
+ function nativeOwnKeys(target) {
61
+ let keys = [];
62
+ if (target instanceof yjs_1.Map) {
63
+ target.forEach((value, key) => {
64
+ keys.push(key);
65
+ });
66
+ }
67
+ else if (target instanceof yjs_1.Array) {
68
+ for (let i = 0; i < target.length; i++) {
69
+ keys.push(String(i));
70
+ }
71
+ }
72
+ return keys;
73
+ }
38
74
  function nativeDelete(target, key) {
39
75
  if (typeof key !== 'string') {
40
76
  return false;
@@ -2,5 +2,6 @@ import RhineVar from "./RhineVar";
2
2
  export type RecursiveCrossRhineVar<T> = {
3
3
  [K in keyof T]: T[K] extends object ? RecursiveCrossRhineVar<T[K]> & RhineVar<T[K]> : T[K];
4
4
  };
5
- export type ProxiedRhineVar<T> = T & RecursiveCrossRhineVar<T> & RhineVar<T>;
5
+ export type StoredRhineVar<T> = T & RecursiveCrossRhineVar<T> & RhineVar<T>;
6
+ export type ProxiedRhineVar<T> = StoredRhineVar<T>;
6
7
  //# sourceMappingURL=ProxiedRhineVar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProxiedRhineVar.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/ProxiedRhineVar.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,mBAA8B;AAE7C,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;KACrC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC3F,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"ProxiedRhineVar.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/ProxiedRhineVar.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,mBAA8B;AAE7C,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;KACrC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC3F,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;AAE3E,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import WebsocketRhineConnector from "../connector/WebsocketRhineConnector";
2
2
  import { ProxiedRhineVar } from "./ProxiedRhineVar";
3
3
  import { Native } from "../native/Native";
4
- export declare function rhineProxy<T extends object>(data: T, connector?: WebsocketRhineConnector | string | null, overwrite?: boolean): ProxiedRhineVar<T>;
4
+ export declare const PROTOCOL_LIST: string[];
5
+ export declare const DEFAULT_PROTOCOL_LIST: string;
6
+ export declare function rhineProxy<T extends object>(data: T, connector?: WebsocketRhineConnector | string | null, overwrite?: boolean | number): ProxiedRhineVar<T>;
5
7
  export declare function rhineProxyNative<T extends object>(target: Native): ProxiedRhineVar<T>;
6
8
  //# sourceMappingURL=Proxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Proxy.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/Proxy.ts"],"names":[],"mappings":"AACA,OAAO,uBAAgD,6CAAiD;AAKxG,OAAO,EAAC,eAAe,EAAC,0BAAqC;AAC7D,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAM5C,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,IAAI,EAAE,CAAC,EACP,SAAS,GAAE,uBAAuB,GAAG,MAAM,GAAG,IAAW,EACzD,SAAS,GAAE,OAAe,GACzB,eAAe,CAAC,CAAC,CAAC,CA6CpB;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CA8DrF"}
1
+ {"version":3,"file":"Proxy.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/Proxy.ts"],"names":[],"mappings":"AACA,OAAO,uBAAgD,6CAAiD;AAKxG,OAAO,EAAC,eAAe,EAAC,0BAAqC;AAC7D,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAY5C,eAAO,MAAM,aAAa,UAAsB,CAAA;AAChD,eAAO,MAAM,qBAAqB,QAAmB,CAAA;AAGrD,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,IAAI,EAAE,CAAC,EACP,SAAS,GAAE,uBAAuB,GAAG,MAAM,GAAG,IAAW,EACzD,SAAS,GAAE,OAAO,GAAG,MAAc,GAClC,eAAe,CAAC,CAAC,CAAC,CA6CpB;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAoErF"}
@@ -23,6 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.DEFAULT_PROTOCOL_LIST = exports.PROTOCOL_LIST = void 0;
26
27
  exports.rhineProxy = rhineProxy;
27
28
  exports.rhineProxyNative = rhineProxyNative;
28
29
  const yjs_1 = require("yjs");
@@ -32,17 +33,18 @@ const DataUtils_1 = require("../utils/DataUtils");
32
33
  const Logger_1 = require("../utils/Logger");
33
34
  const ConvertProperty_1 = require("../utils/ConvertProperty");
34
35
  const NativeUtils_1 = require("../native/NativeUtils");
35
- const DirectKey_1 = require("./DirectKey");
36
+ exports.PROTOCOL_LIST = ['ws://', "wss://"];
37
+ exports.DEFAULT_PROTOCOL_LIST = exports.PROTOCOL_LIST[0];
36
38
  function rhineProxy(data, connector = null, overwrite = false) {
37
39
  let target = (0, NativeUtils_1.jsonToNative)(data);
38
40
  if (connector) {
39
41
  if (typeof connector === 'string') {
40
- if (!connector.startsWith('ws://') && !connector.startsWith('wss://')) {
41
- connector = 'wss://' + connector;
42
+ if (exports.PROTOCOL_LIST.every(protocol => !connector.startsWith(protocol))) {
43
+ connector = exports.DEFAULT_PROTOCOL_LIST + connector;
42
44
  }
43
45
  connector = (0, WebsocketRhineConnector_1.websocketRhineConnect)(connector);
44
46
  }
45
- target = connector.bind(target, overwrite);
47
+ target = connector.bind(target, Boolean(overwrite));
46
48
  }
47
49
  connector = connector;
48
50
  const object = rhineProxyNative(target);
@@ -54,7 +56,7 @@ function rhineProxy(data, connector = null, overwrite = false) {
54
56
  if (!overwrite && connector.yBaseMap.has(WebsocketRhineConnector_1.default.STATE_KEY)) {
55
57
  syncedValue = connector.yBaseMap.get(WebsocketRhineConnector_1.default.STATE_KEY);
56
58
  object.native.forEach((value, key) => {
57
- Reflect.deleteProperty(object, (0, DirectKey_1.directKey)(key));
59
+ Reflect.deleteProperty(object.origin, key);
58
60
  });
59
61
  object.unobserve();
60
62
  object.native = syncedValue;
@@ -62,7 +64,7 @@ function rhineProxy(data, connector = null, overwrite = false) {
62
64
  (0, Logger_1.log)('Proxy.synced: Update synced native');
63
65
  syncedValue.forEach((value, key) => {
64
66
  if ((0, NativeUtils_1.isNative)(value)) {
65
- Reflect.set(object, (0, DirectKey_1.directKey)(key), rhineProxyNative(value));
67
+ Reflect.set(object.origin, key, rhineProxyNative(value));
66
68
  }
67
69
  });
68
70
  }
@@ -85,9 +87,7 @@ function rhineProxyNative(target) {
85
87
  });
86
88
  const handler = {
87
89
  get(proxy, p, receiver) {
88
- if ((0, DirectKey_1.isDirectKey)(p))
89
- return Reflect.get(object, (0, DirectKey_1.originKey)(p), receiver);
90
- if (RhineVar_1.RHINE_VAR_KEYS.has(p))
90
+ if (RhineVar_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p))
91
91
  return Reflect.get(object, p, receiver);
92
92
  (0, Logger_1.log)('Proxy.handler.get:', p, '\n', object, receiver);
93
93
  if (p in object)
@@ -97,7 +97,7 @@ function rhineProxyNative(target) {
97
97
  return result;
98
98
  if (object.native instanceof yjs_1.Array) {
99
99
  if (typeof p === 'string') {
100
- const f = (0, ConvertProperty_1.convertArrayProperty)(object.native, p, object);
100
+ const f = (0, ConvertProperty_1.convertArrayProperty)(p, object.native, object);
101
101
  if (f)
102
102
  return f;
103
103
  }
@@ -105,9 +105,7 @@ function rhineProxyNative(target) {
105
105
  return undefined;
106
106
  },
107
107
  set(proxy, p, value, receiver) {
108
- if ((0, DirectKey_1.isDirectKey)(p))
109
- return Reflect.set(object, (0, DirectKey_1.originKey)(p), value.data, receiver);
110
- if (RhineVar_1.RHINE_VAR_KEYS.has(p))
108
+ if (RhineVar_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p))
111
109
  return Reflect.set(object, p, value, receiver);
112
110
  (0, Logger_1.log)('Proxy.handler.set:', p, 'to', value, '\n', object, receiver);
113
111
  value = (0, DataUtils_1.ensureRhineVar)(value);
@@ -123,16 +121,22 @@ function rhineProxyNative(target) {
123
121
  return result;
124
122
  },
125
123
  deleteProperty(proxy, p) {
126
- if ((0, DirectKey_1.isDirectKey)(p))
127
- return Reflect.deleteProperty(object, (0, DirectKey_1.originKey)(p));
128
- if (RhineVar_1.RHINE_VAR_KEYS.has(p))
124
+ if (RhineVar_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p))
129
125
  return false;
130
126
  (0, Logger_1.log)('Proxy.handler.deleteProperty:', p);
131
127
  let result = (0, NativeUtils_1.nativeDelete)(object.native, p);
132
128
  if (!result)
133
129
  console.error('Failed to delete value');
134
130
  return result;
135
- }
131
+ },
132
+ has(proxy, p) {
133
+ if (RhineVar_1.RHINE_VAR_PREDEFINED_PROPERTIES.has(p))
134
+ return false;
135
+ return (0, NativeUtils_1.nativeHas)(object.native, p);
136
+ },
137
+ ownKeys(proxy) {
138
+ return (0, NativeUtils_1.nativeOwnKeys)(object.native);
139
+ },
136
140
  };
137
141
  object.observe();
138
142
  return new Proxy(object, handler);
@@ -3,21 +3,28 @@ import WebsocketRhineConnector from "../connector/WebsocketRhineConnector";
3
3
  import { Native } from "../native/Native";
4
4
  import { ChangeType } from "../event/ChangeType";
5
5
  import { Callback } from "../event/Callback";
6
+ import { StoredRhineVar } from "./ProxiedRhineVar";
6
7
  export default class RhineVar<T> {
7
8
  native: Native;
8
- constructor(native: Native);
9
+ origin: StoredRhineVar<T>;
10
+ constructor(native: Native, origin?: StoredRhineVar<T>);
9
11
  connector: WebsocketRhineConnector | null;
10
12
  json(): T;
13
+ toString(): string;
14
+ afterSynced(callback: () => void): void;
15
+ waitSynced(): Promise<void>;
11
16
  private listeners;
12
17
  subscribe(callback: Callback<T>): () => void;
13
18
  unsubscribe(callback: Callback<T>): void;
19
+ unsubscribeAll(): void;
14
20
  private keyListeners;
15
21
  subscribeKey(key: keyof T, callback: Callback<T>): () => void;
16
22
  unsubscribeKey(callback: Callback<T>): void;
23
+ unsubscribeAllKey(): void;
17
24
  emit(value: T[keyof T], key: keyof T, oldValue: T[keyof T], type: ChangeType, nativeEvent: YMapEvent<any> | YArrayEvent<any>, nativeTransaction: Transaction): void;
18
25
  observer: (event: YMapEvent<any> | YArrayEvent<any>, transaction: Transaction) => void;
19
26
  observe(): void;
20
27
  unobserve(): void;
21
28
  }
22
- export declare const RHINE_VAR_KEYS: Set<string | symbol>;
29
+ export declare const RHINE_VAR_PREDEFINED_PROPERTIES: Set<string | symbol>;
23
30
  //# sourceMappingURL=RhineVar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RhineVar.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/RhineVar.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAEtF,OAAO,uBAAuB,6CAAiD;AAG/E,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAC5C,OAAO,EAAC,UAAU,EAAC,4BAAgC;AACnD,OAAO,EAAC,QAAQ,EAAC,0BAA8B;AAG/C,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC;IAGpB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;IAGvB,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAO;IAEzC,IAAI,IAAI,CAAC;IAIhB,OAAO,CAAC,SAAS,CAAoB;IACrC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAI5C,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAIjC,OAAO,CAAC,YAAY,CAAyC;IAC7D,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAO7D,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAMpC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,WAAW;IAO5J,QAAQ,UAAW,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,WAAW,UAAO;IAGrF,OAAO;IA+BP,SAAS;CAMV;AAED,eAAO,MAAM,cAAc,sBAczB,CAAA"}
1
+ {"version":3,"file":"RhineVar.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/RhineVar.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,KAAK,CAAC;AAEtF,OAAO,uBAAuB,6CAAiD;AAG/E,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAC5C,OAAO,EAAC,UAAU,EAAC,4BAAgC;AACnD,OAAO,EAAC,QAAQ,EAAC,0BAA8B;AAC/C,OAAO,EAAC,cAAc,EAAC,0BAAqC;AAG5D,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC;IAGpB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;gBADzB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,cAAc,CAAC,CAAC,CAAe;IAGhD,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAO;IAEhD,IAAI,IAAI,CAAC;IAIT,QAAQ;IAIR,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI;IAK1B,UAAU;IAMhB,OAAO,CAAC,SAAS,CAAoB;IACrC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAI5C,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAGjC,cAAc;IAId,OAAO,CAAC,YAAY,CAAyC;IAC7D,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAO7D,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAKpC,iBAAiB;IAIjB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,WAAW;IAO5J,QAAQ,UAAW,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,WAAW,UAAO;IAGrF,OAAO;IA+BP,SAAS;CAKV;AAED,eAAO,MAAM,+BAA+B,sBAuB1C,CAAA"}
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RHINE_VAR_KEYS = void 0;
3
+ exports.RHINE_VAR_PREDEFINED_PROPERTIES = void 0;
4
4
  const yjs_1 = require("yjs");
5
5
  const Proxy_1 = require("./Proxy");
6
6
  const Logger_1 = require("../utils/Logger");
7
7
  const DataUtils_1 = require("../utils/DataUtils");
8
8
  const ChangeType_1 = require("../event/ChangeType");
9
9
  class RhineVar {
10
- constructor(native) {
10
+ constructor(native, origin = this) {
11
11
  this.native = native;
12
+ this.origin = origin;
12
13
  this.connector = null;
13
14
  this.listeners = [];
14
15
  this.keyListeners = new Map();
@@ -17,6 +18,19 @@ class RhineVar {
17
18
  json() {
18
19
  return this.native.toJSON();
19
20
  }
21
+ toString() {
22
+ return String(this.json());
23
+ }
24
+ afterSynced(callback) {
25
+ if (this.connector) {
26
+ this.connector.afterSynced(callback);
27
+ }
28
+ }
29
+ async waitSynced() {
30
+ if (this.connector) {
31
+ await this.connector.waitSynced();
32
+ }
33
+ }
20
34
  subscribe(callback) {
21
35
  this.listeners.push(callback);
22
36
  return () => this.unsubscribe(callback);
@@ -24,6 +38,9 @@ class RhineVar {
24
38
  unsubscribe(callback) {
25
39
  this.listeners = this.listeners.filter(listener => listener !== callback);
26
40
  }
41
+ unsubscribeAll() {
42
+ this.listeners = [];
43
+ }
27
44
  subscribeKey(key, callback) {
28
45
  if (!this.keyListeners.has(key)) {
29
46
  this.keyListeners.set(key, []);
@@ -36,6 +53,9 @@ class RhineVar {
36
53
  this.keyListeners.set(key, listeners.filter(listener => listener !== callback));
37
54
  });
38
55
  }
56
+ unsubscribeAllKey() {
57
+ this.keyListeners = new Map();
58
+ }
39
59
  emit(value, key, oldValue, type, nativeEvent, nativeTransaction) {
40
60
  this.listeners.forEach(listener => listener(value, key, oldValue, type, nativeEvent, nativeTransaction));
41
61
  if (this.keyListeners.has(key)) {
@@ -81,18 +101,24 @@ class RhineVar {
81
101
  }
82
102
  }
83
103
  exports.default = RhineVar;
84
- exports.RHINE_VAR_KEYS = new Set([
104
+ exports.RHINE_VAR_PREDEFINED_PROPERTIES = new Set([
105
+ 'origin',
85
106
  'native',
107
+ 'connector',
86
108
  'json',
109
+ 'toString',
110
+ 'afterSynced',
111
+ 'waitSynced',
87
112
  'listeners',
88
113
  'subscribe',
89
114
  'unsubscribe',
115
+ 'unsubscribeAll',
90
116
  'keyListeners',
91
117
  'subscribeKey',
92
118
  'unsubscribeKey',
119
+ 'unsubscribeAllKey',
93
120
  'emit',
94
121
  'observer',
95
122
  'observe',
96
123
  'unobserve',
97
- 'connector',
98
124
  ]);
@@ -1,4 +1,21 @@
1
1
  import { Array as YArray } from "yjs";
2
2
  import RhineVar from "../proxy/RhineVar";
3
- export declare function convertArrayProperty<T>(target: YArray<T>, name: string, object: RhineVar<T>): number | ((item: T | RhineVar<T>) => void) | ((...items: T[]) => number) | ((start: number, deleteCount: number, ...items: T[]) => T[]) | ((callback: (value: T, index: number, arr: YArray<any>) => void) => void) | ((item: T) => boolean) | undefined;
3
+ /**
4
+ * 提供类似于JS原生Array的函数 通过函数名 返回同时用于操作YArray和RhineVar的模拟函数
5
+ *
6
+ * @param name 函数名/属性名
7
+ * @param target 目标YArray
8
+ * @param object 目标RhineVar
9
+ *
10
+ *
11
+ * 添加元素类型: push
12
+ * 若输入元素未经过代理将自动代理 若输入元素为Native类型将Native代理
13
+ *
14
+ * 删除元素并返回类型: pop shift
15
+ * 从Native和RhineVar中删除对应元素 返回该元素 因该元素已不存在于RhineVar中 所以会自动转为json
16
+ *
17
+ */
18
+ export declare function convertArrayProperty<T>(name: string, target: YArray<any>, object: RhineVar<T>): number | ((...items: (T[keyof T] | RhineVar<T[keyof T]>)[]) => number) | ((start: number, deleteCount: number, ...items: (T[keyof T] | RhineVar<T[keyof T]>)[]) => any[]) | ((callback: (value: T[keyof T], index: number, arr: YArray<any>) => void) => void) | (<R>(callback: (value: T, index: number, arr: YArray<any>) => R) => R[]) | ((item: T[keyof T]) => number) | ((item: T[keyof T]) => boolean) | ((i: number) => T[keyof T]) | ((i: number, value: T[keyof T]) => RhineVar<T>) | ((str?: string) => string) | ((callback: (item: T[keyof T]) => boolean) => T[keyof T][]) | ((callback: (item: T[keyof T]) => boolean) => boolean) | ((callback: (item: T[keyof T]) => boolean) => T[keyof T] | undefined) | ((callback: (item: T[keyof T]) => boolean) => number) | undefined;
19
+ export declare const RHINE_VAR_ARRAY_SUPPORTED_PROPERTIES: Set<string | symbol>;
20
+ export declare const RHINE_VAR_ARRAY_UNSUPPORTED_PROPERTIES: Set<string | symbol>;
4
21
  //# sourceMappingURL=ConvertProperty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConvertProperty.d.ts","sourceRoot":"","sources":["../../../src/core/utils/ConvertProperty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,IAAI,MAAM,EAAC,MAAM,KAAK,CAAC;AACpC,OAAO,QAAQ,0BAA8B;AAK7C,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,oBAI1E,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAG,IAAI,gBAyBlB,CAAC,EAAE,wBASN,MAAM,eAAe,MAAM,YAAY,CAAC,EAAE,wBASvC,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,qBAevD,CAAC,0BAOlB"}
1
+ {"version":3,"file":"ConvertProperty.d.ts","sourceRoot":"","sources":["../../../src/core/utils/ConvertProperty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,IAAI,MAAM,EAAC,MAAM,KAAK,CAAC;AACpC,OAAO,QAAQ,0BAA8B;AAK7C;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAaxE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAG,MAAM,aAmDjD,MAAM,eAAe,MAAM,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,0BAgBzE,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,eAMtE,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,oBAQvD,CAAC,CAAC,MAAM,CAAC,CAAC,uBAOV,CAAC,CAAC,MAAM,CAAC,CAAC,qBAOb,MAAM,KAAG,CAAC,CAAC,MAAM,CAAC,CAAC,SAMnB,MAAM,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAG,QAAQ,CAAC,CAAC,CAAC,YAMrC,MAAM,KAAS,MAAM,gBAchB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,KAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,gBAS5C,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,KAAG,OAAO,gBAcvC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,KAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,gBAQtD,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,KAAG,MAAM,cA0E3D;AAED,eAAO,MAAM,oCAAoC,sBAyB/C,CAAA;AAEF,eAAO,MAAM,sCAAsC,sBAYjD,CAAA"}
@@ -1,29 +1,49 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RHINE_VAR_ARRAY_UNSUPPORTED_PROPERTIES = exports.RHINE_VAR_ARRAY_SUPPORTED_PROPERTIES = void 0;
6
4
  exports.convertArrayProperty = convertArrayProperty;
7
- const RhineVar_1 = __importDefault(require("../proxy/RhineVar"));
8
5
  const DataUtils_1 = require("./DataUtils");
9
6
  const NativeUtils_1 = require("../native/NativeUtils");
10
- function convertArrayProperty(target, name, object) {
7
+ /**
8
+ * 提供类似于JS原生Array的函数 通过函数名 返回同时用于操作YArray和RhineVar的模拟函数
9
+ *
10
+ * @param name 函数名/属性名
11
+ * @param target 目标YArray
12
+ * @param object 目标RhineVar
13
+ *
14
+ *
15
+ * 添加元素类型: push
16
+ * 若输入元素未经过代理将自动代理 若输入元素为Native类型将Native代理
17
+ *
18
+ * 删除元素并返回类型: pop shift
19
+ * 从Native和RhineVar中删除对应元素 返回该元素 因该元素已不存在于RhineVar中 所以会自动转为json
20
+ *
21
+ */
22
+ function convertArrayProperty(name, target, object) {
23
+ const get = (i) => {
24
+ if (i in object) {
25
+ return Reflect.get(object, i);
26
+ }
27
+ else {
28
+ return target.get(i);
29
+ }
30
+ };
11
31
  if (name === 'length') {
12
32
  return target.length;
13
33
  }
14
34
  if (name === 'push') {
15
- return (item) => {
16
- item = (0, DataUtils_1.ensureRhineVar)(item);
17
- if (item instanceof RhineVar_1.default) {
18
- target.push([item.native]);
19
- }
20
- else {
21
- target.push([item]);
35
+ return (...items) => {
36
+ for (let i = 0; i < items.length; i++) {
37
+ items[i] = (0, DataUtils_1.ensureNative)(items[i]);
22
38
  }
39
+ target.push(items);
40
+ return target.length;
23
41
  };
24
42
  }
25
43
  else if (name === 'pop') {
26
44
  return () => {
45
+ if (target.length === 0)
46
+ return undefined;
27
47
  let key = target.length - 1;
28
48
  let item = target.get(key);
29
49
  target.delete(key);
@@ -33,29 +53,59 @@ function convertArrayProperty(target, name, object) {
33
53
  return item;
34
54
  };
35
55
  }
36
- else if (name === 'shift') {
37
- return () => {
38
- let item = target.get(0);
39
- target.delete(0);
40
- return item;
41
- };
42
- }
43
56
  else if (name === 'unshift') {
44
57
  return (...items) => {
58
+ for (let i = 0; i < items.length; i++) {
59
+ items[i] = (0, DataUtils_1.ensureNative)(items[i]);
60
+ }
45
61
  target.unshift(items);
46
62
  return target.length;
47
63
  };
48
64
  }
65
+ else if (name === 'shift') {
66
+ return () => {
67
+ if (target.length === 0)
68
+ return undefined;
69
+ let key = 0;
70
+ let item = target.get(key);
71
+ target.delete(key);
72
+ if ((0, NativeUtils_1.isNative)(item)) {
73
+ return item.toJSON();
74
+ }
75
+ return item;
76
+ };
77
+ }
49
78
  else if (name === 'slice') {
50
79
  return (start, end) => {
51
- return target.slice(start, end);
80
+ if (end === undefined)
81
+ end = target.length;
82
+ if (start < 0)
83
+ start = target.length + start;
84
+ if (end < 0)
85
+ end = target.length + end;
86
+ if (start < 0)
87
+ start = 0;
88
+ if (end > target.length)
89
+ end = target.length;
90
+ let result = [];
91
+ for (let i = start; i < end; i++) {
92
+ result.push(get(i));
93
+ }
94
+ return result;
52
95
  };
53
96
  }
54
97
  else if (name === 'splice') {
55
98
  return (start, deleteCount, ...items) => {
56
- const removed = target.slice(start, start + deleteCount);
99
+ const removed = [];
100
+ for (let i = start; i < start + deleteCount; i++) {
101
+ let item = target.get(i);
102
+ removed.push((0, NativeUtils_1.isNative)(item) ? item.toJSON() : item);
103
+ }
57
104
  target.delete(start, deleteCount);
58
105
  if (items.length > 0) {
106
+ for (let i = 0; i < items.length; i++) {
107
+ items[i] = (0, DataUtils_1.ensureNative)(items[i]);
108
+ }
59
109
  target.insert(start, items);
60
110
  }
61
111
  return removed;
@@ -63,18 +113,24 @@ function convertArrayProperty(target, name, object) {
63
113
  }
64
114
  else if (name === 'forEach') {
65
115
  return (callback) => {
66
- return target.forEach(callback);
116
+ return target.forEach((yValue, yIndex, yArray) => {
117
+ callback(get(yIndex), yIndex, yArray);
118
+ });
67
119
  };
68
120
  }
69
121
  else if (name === 'map') {
70
122
  return (callback) => {
71
- return target.map(callback);
123
+ const result = [];
124
+ target.forEach((yValue, yIndex, yArray) => {
125
+ result.push(callback(get(yIndex), yIndex, yArray));
126
+ });
127
+ return result;
72
128
  };
73
129
  }
74
130
  else if (name === 'indexOf') {
75
131
  return (item) => {
76
132
  for (let i = 0; i < target.length; i++) {
77
- if (target.get(i) === item)
133
+ if (get(i) === item)
78
134
  return i;
79
135
  }
80
136
  return -1;
@@ -83,10 +139,210 @@ function convertArrayProperty(target, name, object) {
83
139
  else if (name === 'includes') {
84
140
  return (item) => {
85
141
  for (let i = 0; i < target.length; i++) {
86
- if (target.get(i) === item)
142
+ if (get(i) === item)
87
143
  return true;
88
144
  }
89
145
  return false;
90
146
  };
91
147
  }
148
+ else if (name === 'at') {
149
+ return (i) => {
150
+ if (i < 0)
151
+ i = target.length + i;
152
+ if (i < 0 || i >= target.length)
153
+ return undefined;
154
+ return get(i);
155
+ };
156
+ }
157
+ else if (name === 'with') {
158
+ return (i, value) => {
159
+ if (i < 0)
160
+ i = target.length + i;
161
+ if (i < 0 || i >= target.length)
162
+ throw 'RangeError: Unexpect index ' + i + ' in RhineVarArray(' + target.length + ')';
163
+ return object;
164
+ };
165
+ }
166
+ else if (name === 'join') {
167
+ return (str = ',') => {
168
+ let result = '';
169
+ for (let i = 0; i < target.length; i++) {
170
+ if (i > 0)
171
+ result += str;
172
+ let item = target.get(i);
173
+ if ((0, NativeUtils_1.isNative)(item)) {
174
+ result += item.toJSON();
175
+ }
176
+ else {
177
+ result += item;
178
+ }
179
+ }
180
+ return result;
181
+ };
182
+ }
183
+ else if (name === 'filter') {
184
+ return (callback) => {
185
+ let result = [];
186
+ for (let i = 0; i < target.length; i++) {
187
+ let item = get(i);
188
+ if (callback(item))
189
+ result.push(item);
190
+ }
191
+ return result;
192
+ };
193
+ }
194
+ else if (name === 'some') {
195
+ return (callback) => {
196
+ for (let i = 0; i < target.length; i++) {
197
+ if (callback(get(i)))
198
+ return true;
199
+ }
200
+ return false;
201
+ };
202
+ }
203
+ else if (name === 'every') {
204
+ return (callback) => {
205
+ for (let i = 0; i < target.length; i++) {
206
+ if (!callback(get(i)))
207
+ return false;
208
+ }
209
+ return true;
210
+ };
211
+ }
212
+ else if (name === 'find') {
213
+ return (callback) => {
214
+ for (let i = 0; i < target.length; i++) {
215
+ let item = get(i);
216
+ if (callback(item))
217
+ return item;
218
+ }
219
+ return undefined;
220
+ };
221
+ }
222
+ else if (name === 'findIndex') {
223
+ return (callback) => {
224
+ for (let i = 0; i < target.length; i++) {
225
+ if (callback(get(i)))
226
+ return i;
227
+ }
228
+ return -1;
229
+ };
230
+ }
231
+ else if (name === 'findLast') {
232
+ return (callback) => {
233
+ for (let i = target.length - 1; i >= 0; i--) {
234
+ let item = get(i);
235
+ if (callback(item))
236
+ return item;
237
+ }
238
+ return undefined;
239
+ };
240
+ }
241
+ else if (name === 'findLastIndex') {
242
+ return (callback) => {
243
+ for (let i = target.length - 1; i >= 0; i--) {
244
+ if (callback(get(i)))
245
+ return i;
246
+ }
247
+ return -1;
248
+ };
249
+ }
250
+ else if (name === 'entries') {
251
+ return () => {
252
+ let i = 0;
253
+ return {
254
+ next() {
255
+ if (i < target.length) {
256
+ return { value: [i, get(i++)], done: false };
257
+ }
258
+ else {
259
+ return { value: undefined, done: true };
260
+ }
261
+ },
262
+ [Symbol.iterator]() {
263
+ return this;
264
+ }
265
+ };
266
+ };
267
+ }
268
+ else if (name === 'keys') {
269
+ return () => {
270
+ let i = 0;
271
+ return {
272
+ next() {
273
+ if (i < target.length) {
274
+ return { value: i++, done: false };
275
+ }
276
+ else {
277
+ return { value: undefined, done: true };
278
+ }
279
+ },
280
+ [Symbol.iterator]() {
281
+ return this;
282
+ },
283
+ };
284
+ };
285
+ }
286
+ else if (name === 'values') {
287
+ return () => {
288
+ let i = 0;
289
+ return {
290
+ next() {
291
+ if (i < target.length) {
292
+ return { value: get(i++), done: false };
293
+ }
294
+ else {
295
+ return { value: undefined, done: true };
296
+ }
297
+ },
298
+ [Symbol.iterator]() {
299
+ return this;
300
+ },
301
+ };
302
+ };
303
+ }
304
+ else if (exports.RHINE_VAR_ARRAY_UNSUPPORTED_PROPERTIES.has(name)) {
305
+ return () => {
306
+ console.error('Unsupported method "' + name + '" in RhineVarArray. Please call json() to convert to a native JS Array object before proceeding.');
307
+ };
308
+ }
92
309
  }
310
+ exports.RHINE_VAR_ARRAY_SUPPORTED_PROPERTIES = new Set([
311
+ 'length',
312
+ 'push',
313
+ 'pop',
314
+ 'unshift',
315
+ 'shift',
316
+ 'slice',
317
+ 'splice',
318
+ 'forEach',
319
+ 'map',
320
+ 'indexOf',
321
+ 'includes',
322
+ 'at',
323
+ 'with',
324
+ 'join',
325
+ 'filter',
326
+ 'some',
327
+ 'every',
328
+ 'find',
329
+ 'findIndex',
330
+ 'findLast',
331
+ 'findLastIndex',
332
+ 'entries',
333
+ 'keys',
334
+ 'values',
335
+ ]);
336
+ exports.RHINE_VAR_ARRAY_UNSUPPORTED_PROPERTIES = new Set([
337
+ 'contact',
338
+ 'copyWithin',
339
+ 'flat',
340
+ 'flatMap',
341
+ 'reduce',
342
+ 'reduceRight',
343
+ 'reverse',
344
+ 'sort',
345
+ 'toReversed',
346
+ 'toSorted',
347
+ 'toSpliced',
348
+ ]);
@@ -1,7 +1,9 @@
1
- import { ProxiedRhineVar } from "../proxy/ProxiedRhineVar";
1
+ import { StoredRhineVar } from "../proxy/ProxiedRhineVar";
2
+ import RhineVar from "../proxy/RhineVar";
2
3
  import { Native } from "../native/Native";
3
4
  export declare function isObject(value: any): boolean;
4
5
  export declare function isArray(value: any): value is any[];
5
6
  export declare function isObjectOrArray(value: any): boolean;
6
- export declare function ensureRhineVar<T>(value: T | Native): ProxiedRhineVar<T> | any;
7
+ export declare function ensureRhineVar<T>(value: T | Native): StoredRhineVar<T> | any;
8
+ export declare function ensureNative<T>(value: T | RhineVar<T>): Native | any;
7
9
  //# sourceMappingURL=DataUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataUtils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/DataUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,iCAAqC;AAI7D,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAE5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,WAElC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,kBAEjC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,WAEzC;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,GAAG,CAU7E"}
1
+ {"version":3,"file":"DataUtils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/DataUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,iCAAqC;AAE5D,OAAO,QAAQ,0BAA8B;AAE7C,OAAO,EAAC,MAAM,EAAC,yBAA6B;AAE5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,WAElC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,kBAEjC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,WAEzC;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAU5E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,CAQpE"}
@@ -7,6 +7,7 @@ exports.isObject = isObject;
7
7
  exports.isArray = isArray;
8
8
  exports.isObjectOrArray = isObjectOrArray;
9
9
  exports.ensureRhineVar = ensureRhineVar;
10
+ exports.ensureNative = ensureNative;
10
11
  const NativeUtils_1 = require("../native/NativeUtils");
11
12
  const RhineVar_1 = __importDefault(require("../proxy/RhineVar"));
12
13
  const Proxy_1 = require("../proxy/Proxy");
@@ -30,3 +31,12 @@ function ensureRhineVar(value) {
30
31
  }
31
32
  return value;
32
33
  }
34
+ function ensureNative(value) {
35
+ if (value instanceof RhineVar_1.default) {
36
+ return value.native;
37
+ }
38
+ if (isObjectOrArray(value)) {
39
+ return (0, NativeUtils_1.jsonToNative)(value);
40
+ }
41
+ return value;
42
+ }
package/dist/index.d.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  import { rhineProxy, rhineProxyNative } from "./core/proxy/Proxy";
2
2
  import RhineVar from "./core/proxy/RhineVar";
3
- import { ProxiedRhineVar, RecursiveCrossRhineVar } from "./core/proxy/ProxiedRhineVar";
4
- import DirectPackage from "./core/proxy/DirectKey";
3
+ import { StoredRhineVar, ProxiedRhineVar, RecursiveCrossRhineVar } from "./core/proxy/ProxiedRhineVar";
5
4
  import WebsocketRhineConnector from "./core/connector/WebsocketRhineConnector";
6
5
  import useRhine from "./react/hooks/useRhine";
7
6
  import useSynced from "./react/hooks/useSynced";
8
- export { WebsocketRhineConnector, rhineProxy, rhineProxyNative, RhineVar, ProxiedRhineVar, RecursiveCrossRhineVar, DirectPackage, useRhine, useSynced, };
7
+ export { WebsocketRhineConnector, rhineProxy, rhineProxyNative, RhineVar, StoredRhineVar, ProxiedRhineVar, RecursiveCrossRhineVar, useRhine, useSynced, };
9
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,2BAA2B;AAChE,OAAO,QAAQ,8BAA8B;AAC7C,OAAO,EAAC,eAAe,EAAE,sBAAsB,EAAC,qCAAqC;AACrF,OAAO,aAAa,+BAA+B;AACnD,OAAO,uBAAuB,iDAAiD;AAC/E,OAAO,QAAQ,+BAA8B;AAC7C,OAAO,SAAS,gCAA+B;AAE/C,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,QAAQ,EACR,SAAS,GACV,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,2BAA2B;AAChE,OAAO,QAAQ,8BAA8B;AAC7C,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAC,qCAAqC;AACrG,OAAO,uBAAuB,iDAAiD;AAC/E,OAAO,QAAQ,+BAA8B;AAC7C,OAAO,SAAS,gCAA+B;AAE/C,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,QAAQ,EACR,SAAS,GACV,CAAA"}
package/dist/index.js CHANGED
@@ -3,14 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.useSynced = exports.useRhine = exports.DirectPackage = exports.RhineVar = exports.rhineProxyNative = exports.rhineProxy = exports.WebsocketRhineConnector = void 0;
6
+ exports.useSynced = exports.useRhine = exports.RhineVar = exports.rhineProxyNative = exports.rhineProxy = exports.WebsocketRhineConnector = void 0;
7
7
  const Proxy_1 = require("./core/proxy/Proxy");
8
8
  Object.defineProperty(exports, "rhineProxy", { enumerable: true, get: function () { return Proxy_1.rhineProxy; } });
9
9
  Object.defineProperty(exports, "rhineProxyNative", { enumerable: true, get: function () { return Proxy_1.rhineProxyNative; } });
10
10
  const RhineVar_1 = __importDefault(require("./core/proxy/RhineVar"));
11
11
  exports.RhineVar = RhineVar_1.default;
12
- const DirectKey_1 = __importDefault(require("./core/proxy/DirectKey"));
13
- exports.DirectPackage = DirectKey_1.default;
14
12
  const WebsocketRhineConnector_1 = __importDefault(require("./core/connector/WebsocketRhineConnector"));
15
13
  exports.WebsocketRhineConnector = WebsocketRhineConnector_1.default;
16
14
  const useRhine_1 = __importDefault(require("./react/hooks/useRhine"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rhine-var",
3
- "version": "0.2.0",
3
+ "version": "0.3.2",
4
4
  "description": "Variables that support multi-user collaboration and persistence, making collaboration and variable operations as simple as possible, with strict and well-defined type hints.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",