rhine-var 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/modules.xml +8 -0
- package/.idea/rhine-var.iml +13 -0
- package/.idea/vcs.xml +6 -0
- package/README.md +42 -0
- package/dist/core/class/array/RhineArray.d.ts +3 -0
- package/dist/core/class/array/RhineArray.d.ts.map +1 -0
- package/dist/core/class/array/RhineArray.js +5 -0
- package/dist/core/connector/ConnectorStatus.d.ts +6 -0
- package/dist/core/connector/ConnectorStatus.d.ts.map +1 -0
- package/dist/core/connector/ConnectorStatus.js +9 -0
- package/dist/core/connector/WebsocketRhineConnector.d.ts +25 -0
- package/dist/core/connector/WebsocketRhineConnector.d.ts.map +1 -0
- package/dist/core/connector/WebsocketRhineConnector.js +98 -0
- package/dist/core/event/Callback.d.ts +4 -0
- package/dist/core/event/Callback.d.ts.map +1 -0
- package/dist/core/event/Callback.js +2 -0
- package/dist/core/event/ChangeType.d.ts +6 -0
- package/dist/core/event/ChangeType.d.ts.map +1 -0
- package/dist/core/event/ChangeType.js +9 -0
- package/dist/core/native/Native.d.ts +3 -0
- package/dist/core/native/Native.d.ts.map +1 -0
- package/dist/core/native/Native.js +2 -0
- package/dist/core/native/NativeUtils.d.ts +8 -0
- package/dist/core/native/NativeUtils.d.ts.map +1 -0
- package/dist/core/native/NativeUtils.js +98 -0
- package/dist/core/proxy/DirectPackage.d.ts +6 -0
- package/dist/core/proxy/DirectPackage.d.ts.map +1 -0
- package/dist/core/proxy/DirectPackage.js +12 -0
- package/dist/core/proxy/ProxiedRhineVar.d.ts +6 -0
- package/dist/core/proxy/ProxiedRhineVar.d.ts.map +1 -0
- package/dist/core/proxy/ProxiedRhineVar.js +2 -0
- package/dist/core/proxy/Proxy.d.ts +6 -0
- package/dist/core/proxy/Proxy.d.ts.map +1 -0
- package/dist/core/proxy/Proxy.js +135 -0
- package/dist/core/proxy/RhineVar.d.ts +25 -0
- package/dist/core/proxy/RhineVar.d.ts.map +1 -0
- package/dist/core/proxy/RhineVar.js +98 -0
- package/dist/core/utils/ConvertProperty.d.ts +4 -0
- package/dist/core/utils/ConvertProperty.d.ts.map +1 -0
- package/dist/core/utils/ConvertProperty.js +88 -0
- package/dist/core/utils/DataUtils.d.ts +6 -0
- package/dist/core/utils/DataUtils.d.ts.map +1 -0
- package/dist/core/utils/DataUtils.js +32 -0
- package/dist/core/utils/Logger.d.ts +2 -0
- package/dist/core/utils/Logger.d.ts.map +1 -0
- package/dist/core/utils/Logger.js +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/react/hooks/useRhine.d.ts +3 -0
- package/dist/react/hooks/useRhine.d.ts.map +1 -0
- package/dist/react/hooks/useRhine.js +18 -0
- package/dist/react/hooks/useSynced.d.ts +4 -0
- package/dist/react/hooks/useSynced.d.ts.map +1 -0
- package/dist/react/hooks/useSynced.js +33 -0
- package/package.json +38 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/rhine-var.iml" filepath="$PROJECT_DIR$/.idea/rhine-var.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
|
+
</project>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="WEB_MODULE" version="4">
|
|
3
|
+
<component name="NewModuleRootManager">
|
|
4
|
+
<content url="file://$MODULE_DIR$">
|
|
5
|
+
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
+
<excludeFolder url="file://$MODULE_DIR$/dist" />
|
|
7
|
+
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
8
|
+
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
9
|
+
</content>
|
|
10
|
+
<orderEntry type="inheritedJdk" />
|
|
11
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
12
|
+
</component>
|
|
13
|
+
</module>
|
package/.idea/vcs.xml
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
# Most concise and rigorous strongly-typed collaborative library for multiple users
|
|
3
|
+
|
|
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
|
+
|
|
6
|
+
## Install
|
|
7
|
+
```bash
|
|
8
|
+
npm i rhine-var
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
```typescript jsx
|
|
15
|
+
const defaultValue = {value: 0}
|
|
16
|
+
const count = rhineProxy(defaultValue, 'RhineAI.com/ws/room-0')
|
|
17
|
+
|
|
18
|
+
function EasyCounter() {
|
|
19
|
+
|
|
20
|
+
const countSnap = useRhine(count)
|
|
21
|
+
|
|
22
|
+
return <div className='page'>
|
|
23
|
+
<button onClick={() => count.value-- }> - 1 </button>
|
|
24
|
+
<span>{countSnap.value}</span>
|
|
25
|
+
<button onClick={() => count.value++ }> + 1 </button>
|
|
26
|
+
</div>
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
<br/>
|
|
31
|
+
|
|
32
|
+
## Develop With US
|
|
33
|
+
|
|
34
|
+
Start Debug Mode
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run watch
|
|
38
|
+
cd test/debug/next-app
|
|
39
|
+
npm run dev
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
<br/>
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectorStatus.d.ts","sourceRoot":"","sources":["../../../src/core/connector/ConnectorStatus.ts"],"names":[],"mappings":"AACA,oBAAY,eAAe;IACzB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectorStatus = void 0;
|
|
4
|
+
var ConnectorStatus;
|
|
5
|
+
(function (ConnectorStatus) {
|
|
6
|
+
ConnectorStatus["CONNECTING"] = "connecting";
|
|
7
|
+
ConnectorStatus["CONNECTED"] = "connected";
|
|
8
|
+
ConnectorStatus["DISCONNECTED"] = "disconnected";
|
|
9
|
+
})(ConnectorStatus || (exports.ConnectorStatus = ConnectorStatus = {}));
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Map as YMap, Doc as YDoc } from "yjs";
|
|
2
|
+
import { WebsocketProvider } from "y-websocket";
|
|
3
|
+
import { ConnectorStatus } from "./ConnectorStatus";
|
|
4
|
+
import { Native } from "../native/Native";
|
|
5
|
+
export type SyncedListener = (synced: boolean) => void;
|
|
6
|
+
export default class WebsocketRhineConnector {
|
|
7
|
+
static STATE_KEY: string;
|
|
8
|
+
yDoc: YDoc;
|
|
9
|
+
yBaseMap: YMap<any>;
|
|
10
|
+
url: string;
|
|
11
|
+
clientId: number;
|
|
12
|
+
synced: boolean;
|
|
13
|
+
provider: WebsocketProvider | null;
|
|
14
|
+
websocketStatus: ConnectorStatus;
|
|
15
|
+
syncedListeners: SyncedListener[];
|
|
16
|
+
addSyncedListener(listener: SyncedListener): void;
|
|
17
|
+
removeSyncedListener(listener: SyncedListener): void;
|
|
18
|
+
emitSynced(synced: boolean): void;
|
|
19
|
+
waitSynced(): Promise<void>;
|
|
20
|
+
constructor(url?: string);
|
|
21
|
+
bind(defaultValue: Native, overwrite?: boolean): any;
|
|
22
|
+
connect(url: string): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare function websocketRhineConnect(url: string): WebsocketRhineConnector;
|
|
25
|
+
//# sourceMappingURL=WebsocketRhineConnector.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.websocketRhineConnect = websocketRhineConnect;
|
|
4
|
+
const yjs_1 = require("yjs");
|
|
5
|
+
const y_websocket_1 = require("y-websocket");
|
|
6
|
+
const ConnectorStatus_1 = require("./ConnectorStatus");
|
|
7
|
+
const Logger_1 = require("../utils/Logger");
|
|
8
|
+
class WebsocketRhineConnector {
|
|
9
|
+
addSyncedListener(listener) {
|
|
10
|
+
this.syncedListeners.push(listener);
|
|
11
|
+
}
|
|
12
|
+
removeSyncedListener(listener) {
|
|
13
|
+
this.syncedListeners = this.syncedListeners.filter(l => l !== listener);
|
|
14
|
+
}
|
|
15
|
+
emitSynced(synced) {
|
|
16
|
+
this.syncedListeners.forEach(listener => listener(synced));
|
|
17
|
+
}
|
|
18
|
+
waitSynced() {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
if (this.synced)
|
|
21
|
+
return true;
|
|
22
|
+
const listener = (synced) => {
|
|
23
|
+
if (synced) {
|
|
24
|
+
this.removeSyncedListener(listener);
|
|
25
|
+
resolve();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
this.addSyncedListener(listener);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
constructor(url = '') {
|
|
32
|
+
this.url = '';
|
|
33
|
+
this.clientId = -1;
|
|
34
|
+
this.synced = false;
|
|
35
|
+
this.provider = null;
|
|
36
|
+
this.websocketStatus = ConnectorStatus_1.ConnectorStatus.DISCONNECTED;
|
|
37
|
+
this.syncedListeners = [];
|
|
38
|
+
this.yDoc = new yjs_1.Doc();
|
|
39
|
+
this.yBaseMap = this.yDoc.getMap();
|
|
40
|
+
url && this.connect(url);
|
|
41
|
+
}
|
|
42
|
+
bind(defaultValue, overwrite = false) {
|
|
43
|
+
if (this.synced) {
|
|
44
|
+
if (!overwrite && this.yBaseMap.has(WebsocketRhineConnector.STATE_KEY)) {
|
|
45
|
+
return this.yBaseMap.get(WebsocketRhineConnector.STATE_KEY);
|
|
46
|
+
}
|
|
47
|
+
this.yBaseMap.set(WebsocketRhineConnector.STATE_KEY, defaultValue);
|
|
48
|
+
return defaultValue;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const tempMap = new yjs_1.Doc().getMap();
|
|
52
|
+
tempMap.set(WebsocketRhineConnector.STATE_KEY, defaultValue);
|
|
53
|
+
return defaultValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async connect(url) {
|
|
57
|
+
this.url = url;
|
|
58
|
+
let li = this.url.lastIndexOf('/');
|
|
59
|
+
if (li == -1 || li == this.url.length - 1 || !this.url.startsWith('ws')) {
|
|
60
|
+
console.error('UnSupport URL for Connect Room');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
this.provider = new y_websocket_1.WebsocketProvider(this.url.slice(0, li), this.url.slice(li + 1), this.yDoc);
|
|
65
|
+
this.provider.shouldConnect = true;
|
|
66
|
+
this.provider.on('status', (event) => {
|
|
67
|
+
this.websocketStatus = event.status;
|
|
68
|
+
(0, Logger_1.log)('WebsocketRhineConnector.event status:', event.status);
|
|
69
|
+
});
|
|
70
|
+
this.provider.on('sync', (synced) => {
|
|
71
|
+
(0, Logger_1.log)('WebsocketRhineConnector.event sync:', synced);
|
|
72
|
+
if (synced) {
|
|
73
|
+
this.synced = true;
|
|
74
|
+
this.clientId = this.yDoc.clientID;
|
|
75
|
+
this.emitSynced(synced);
|
|
76
|
+
resolve();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
this.provider.on('connection-close', (e) => {
|
|
80
|
+
this.websocketStatus = ConnectorStatus_1.ConnectorStatus.DISCONNECTED;
|
|
81
|
+
(0, Logger_1.log)('WebsocketRhineConnector.event connection-close:', e);
|
|
82
|
+
});
|
|
83
|
+
this.provider.on('connection-error', (error) => {
|
|
84
|
+
this.websocketStatus = ConnectorStatus_1.ConnectorStatus.DISCONNECTED;
|
|
85
|
+
(0, Logger_1.log)('WebsocketRhineConnector.event connection-error:', error);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
WebsocketRhineConnector.STATE_KEY = 'state';
|
|
91
|
+
exports.default = WebsocketRhineConnector;
|
|
92
|
+
function websocketRhineConnect(url) {
|
|
93
|
+
const connector = new WebsocketRhineConnector();
|
|
94
|
+
if (typeof window !== 'undefined') {
|
|
95
|
+
connector.connect(url);
|
|
96
|
+
}
|
|
97
|
+
return connector;
|
|
98
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ChangeType } from "./ChangeType";
|
|
2
|
+
import { Transaction, YArrayEvent, YMapEvent } from "yjs";
|
|
3
|
+
export type Callback = (value: any, key: string, oldValue: any, type: ChangeType, nativeEvent: YMapEvent<any> | YArrayEvent<any>, nativeTransaction: Transaction) => void;
|
|
4
|
+
//# sourceMappingURL=Callback.d.ts.map
|
|
@@ -0,0 +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,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,WAAW,KAAK,IAAI,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeType.d.ts","sourceRoot":"","sources":["../../../src/core/event/ChangeType.ts"],"names":[],"mappings":"AACA,oBAAY,UAAU;IACpB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChangeType = void 0;
|
|
4
|
+
var ChangeType;
|
|
5
|
+
(function (ChangeType) {
|
|
6
|
+
ChangeType["Add"] = "add";
|
|
7
|
+
ChangeType["Update"] = "update";
|
|
8
|
+
ChangeType["Delete"] = "delete";
|
|
9
|
+
})(ChangeType || (exports.ChangeType = ChangeType = {}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Native.d.ts","sourceRoot":"","sources":["../../../src/core/native/Native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,IAAI,EAAC,MAAM,KAAK,CAAC;AAEjD,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Map as YMap, Array as YArray } from "yjs";
|
|
2
|
+
import { Native } from "./Native";
|
|
3
|
+
export declare function isYMapOrYArray(value: any): value is YMap<any> | YArray<any>;
|
|
4
|
+
export declare function nativeSet(target: Native, key: string | symbol, value: any): boolean;
|
|
5
|
+
export declare function nativeDelete(target: Native, key: string | symbol): boolean;
|
|
6
|
+
export declare function nativeGet(target: Native, key: string | symbol): any;
|
|
7
|
+
export declare function jsonToNative(data: any): any;
|
|
8
|
+
//# sourceMappingURL=NativeUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeUtils.d.ts","sourceRoot":"","sources":["../../../src/core/native/NativeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,MAAM,EAAC,MAAM,KAAK,CAAA;AAChD,OAAO,EAAC,MAAM,EAAC,iBAA6B;AAI5C,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,oCAExC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,WAuBzE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,WAwBhE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,OAgB7D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,OAgBrC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isYMapOrYArray = isYMapOrYArray;
|
|
4
|
+
exports.nativeSet = nativeSet;
|
|
5
|
+
exports.nativeDelete = nativeDelete;
|
|
6
|
+
exports.nativeGet = nativeGet;
|
|
7
|
+
exports.jsonToNative = jsonToNative;
|
|
8
|
+
const yjs_1 = require("yjs");
|
|
9
|
+
const DataUtils_1 = require("../utils/DataUtils");
|
|
10
|
+
function isYMapOrYArray(value) {
|
|
11
|
+
return (value instanceof yjs_1.Map) || (value instanceof yjs_1.Array);
|
|
12
|
+
}
|
|
13
|
+
function nativeSet(target, key, value) {
|
|
14
|
+
if (typeof key !== 'string') {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
if (target instanceof yjs_1.Map) {
|
|
19
|
+
target.set(key, value);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
else if (target instanceof yjs_1.Array) {
|
|
23
|
+
const index = parseInt(key);
|
|
24
|
+
if (!isNaN(index)) {
|
|
25
|
+
if (target.length - 1 >= index) {
|
|
26
|
+
target.delete(index, 1);
|
|
27
|
+
}
|
|
28
|
+
target.insert(index, [value]);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error('RhineVar nativeSet.error:', e);
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
function nativeDelete(target, key) {
|
|
39
|
+
if (typeof key !== 'string') {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
if (target instanceof yjs_1.Map) {
|
|
44
|
+
if (target.has(key)) {
|
|
45
|
+
target.delete(key);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (target instanceof yjs_1.Array) {
|
|
50
|
+
const pn = parseInt(key);
|
|
51
|
+
if (!isNaN(pn)) {
|
|
52
|
+
if (target.length > pn && pn >= 0) {
|
|
53
|
+
target.delete(pn, 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
console.error('RhineVar nativeDelete.error:', e);
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
function nativeGet(target, key) {
|
|
64
|
+
if (typeof key !== 'string') {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
if (target instanceof yjs_1.Map) {
|
|
69
|
+
return target.get(key);
|
|
70
|
+
}
|
|
71
|
+
else if (target instanceof yjs_1.Array) {
|
|
72
|
+
const pn = parseInt(key);
|
|
73
|
+
if (!isNaN(pn))
|
|
74
|
+
return target.get(pn);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error('RhineVar nativeGet.error:', e);
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
function jsonToNative(data) {
|
|
83
|
+
if ((0, DataUtils_1.isObject)(data)) {
|
|
84
|
+
let map = new yjs_1.Map();
|
|
85
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
86
|
+
map.set(key, jsonToNative(value));
|
|
87
|
+
});
|
|
88
|
+
return map;
|
|
89
|
+
}
|
|
90
|
+
if ((0, DataUtils_1.isArray)(data)) {
|
|
91
|
+
let array = new yjs_1.Array();
|
|
92
|
+
data.forEach((value, index) => {
|
|
93
|
+
array.push([jsonToNative(value)]);
|
|
94
|
+
});
|
|
95
|
+
return array;
|
|
96
|
+
}
|
|
97
|
+
return data;
|
|
98
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectPackage.d.ts","sourceRoot":"","sources":["../../../src/core/proxy/DirectPackage.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,OAAO,aAAa;IAEvB,IAAI,EAAE,GAAG;gBAAT,IAAI,EAAE,GAAG;CAEnB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,iBAEtC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.directPackage = directPackage;
|
|
4
|
+
class DirectPackage {
|
|
5
|
+
constructor(data) {
|
|
6
|
+
this.data = data;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.default = DirectPackage;
|
|
10
|
+
function directPackage(data) {
|
|
11
|
+
return new DirectPackage(data);
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import RhineVar from "./RhineVar";
|
|
2
|
+
export type RecursiveCrossRhineVar<T> = {
|
|
3
|
+
[K in keyof T]: T[K] extends object ? RecursiveCrossRhineVar<T[K]> & RhineVar : T[K];
|
|
4
|
+
};
|
|
5
|
+
export type ProxiedRhineVar<T> = T & RecursiveCrossRhineVar<T> & RhineVar;
|
|
6
|
+
//# sourceMappingURL=ProxiedRhineVar.d.ts.map
|
|
@@ -0,0 +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,GAAG,CAAC,CAAC,CAAC,CAAC;CACrF,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import WebsocketRhineConnector from "../connector/WebsocketRhineConnector";
|
|
2
|
+
import { ProxiedRhineVar } from "./ProxiedRhineVar";
|
|
3
|
+
import { Native } from "../native/Native";
|
|
4
|
+
export declare function rhineProxy<T extends object>(data: T, connector?: WebsocketRhineConnector | string | null, overwrite?: boolean): ProxiedRhineVar<T>;
|
|
5
|
+
export declare function rhineProxyNative<T extends object>(target: Native): ProxiedRhineVar<T>;
|
|
6
|
+
//# sourceMappingURL=Proxy.d.ts.map
|
|
@@ -0,0 +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;AAK5C,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,CA2CpB;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CA4DrF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.rhineProxy = rhineProxy;
|
|
27
|
+
exports.rhineProxyNative = rhineProxyNative;
|
|
28
|
+
const yjs_1 = require("yjs");
|
|
29
|
+
const WebsocketRhineConnector_1 = __importStar(require("../connector/WebsocketRhineConnector"));
|
|
30
|
+
const RhineVar_1 = __importStar(require("./RhineVar"));
|
|
31
|
+
const DataUtils_1 = require("../utils/DataUtils");
|
|
32
|
+
const Logger_1 = require("../utils/Logger");
|
|
33
|
+
const ConvertProperty_1 = require("../utils/ConvertProperty");
|
|
34
|
+
const NativeUtils_1 = require("../native/NativeUtils");
|
|
35
|
+
const DirectPackage_1 = __importStar(require("./DirectPackage"));
|
|
36
|
+
function rhineProxy(data, connector = null, overwrite = false) {
|
|
37
|
+
let target = (0, NativeUtils_1.jsonToNative)(data);
|
|
38
|
+
if (connector) {
|
|
39
|
+
if (typeof connector === 'string') {
|
|
40
|
+
if (!connector.startsWith('ws://') && !connector.startsWith('wss://')) {
|
|
41
|
+
connector = 'wss://' + connector;
|
|
42
|
+
}
|
|
43
|
+
connector = (0, WebsocketRhineConnector_1.websocketRhineConnect)(connector);
|
|
44
|
+
}
|
|
45
|
+
target = connector.bind(target, overwrite);
|
|
46
|
+
}
|
|
47
|
+
connector = connector;
|
|
48
|
+
const object = rhineProxyNative(target);
|
|
49
|
+
object.connector = connector;
|
|
50
|
+
if (connector && !connector.synced) {
|
|
51
|
+
connector.addSyncedListener((synced) => {
|
|
52
|
+
if (!synced)
|
|
53
|
+
return;
|
|
54
|
+
let syncedValue = target.clone();
|
|
55
|
+
if (!overwrite && connector.yBaseMap.has(WebsocketRhineConnector_1.default.STATE_KEY)) {
|
|
56
|
+
syncedValue = connector.yBaseMap.get(WebsocketRhineConnector_1.default.STATE_KEY);
|
|
57
|
+
object.native.forEach((value, key) => {
|
|
58
|
+
Reflect.deleteProperty(object, key);
|
|
59
|
+
});
|
|
60
|
+
object.unobserve();
|
|
61
|
+
object.native = syncedValue;
|
|
62
|
+
object.observe();
|
|
63
|
+
(0, Logger_1.log)('Proxy.synced: Update synced native');
|
|
64
|
+
syncedValue.forEach((value, key) => {
|
|
65
|
+
if ((0, NativeUtils_1.isYMapOrYArray)(value)) {
|
|
66
|
+
Reflect.set(object, key, (0, DirectPackage_1.directPackage)(rhineProxyNative(value)));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
connector.yBaseMap.set(WebsocketRhineConnector_1.default.STATE_KEY, syncedValue);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return object;
|
|
76
|
+
}
|
|
77
|
+
function rhineProxyNative(target) {
|
|
78
|
+
// log('rhineProxyNative', target)
|
|
79
|
+
const object = new RhineVar_1.default(target);
|
|
80
|
+
object.native.forEach((value, keyString) => {
|
|
81
|
+
let key = keyString;
|
|
82
|
+
if ((0, NativeUtils_1.isYMapOrYArray)(value)) {
|
|
83
|
+
Reflect.set(object, key, rhineProxyNative(value));
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const handler = {
|
|
87
|
+
get(proxy, p, receiver) {
|
|
88
|
+
if (RhineVar_1.RHINE_VAR_KEYS.has(p))
|
|
89
|
+
return Reflect.get(object, p, receiver);
|
|
90
|
+
(0, Logger_1.log)('Proxy.handler.get:', p, '\n', object, receiver);
|
|
91
|
+
if (p in object)
|
|
92
|
+
return Reflect.get(object, p, receiver);
|
|
93
|
+
let result = (0, NativeUtils_1.nativeGet)(object.native, p);
|
|
94
|
+
if (result)
|
|
95
|
+
return result;
|
|
96
|
+
if (object.native instanceof yjs_1.Array) {
|
|
97
|
+
if (typeof p === 'string') {
|
|
98
|
+
const f = (0, ConvertProperty_1.convertArrayProperty)(object.native, p, object);
|
|
99
|
+
if (f)
|
|
100
|
+
return f;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
},
|
|
105
|
+
set(proxy, p, value, receiver) {
|
|
106
|
+
if (RhineVar_1.RHINE_VAR_KEYS.has(p))
|
|
107
|
+
return Reflect.set(object, p, value, receiver);
|
|
108
|
+
if (value instanceof DirectPackage_1.default)
|
|
109
|
+
return Reflect.set(object, p, value.data, receiver);
|
|
110
|
+
(0, Logger_1.log)('Proxy.handler.set:', p, 'to', value, '\n', object, receiver);
|
|
111
|
+
value = (0, DataUtils_1.ensureRhineVar)(value);
|
|
112
|
+
let result = false;
|
|
113
|
+
if ((0, DataUtils_1.isObjectOrArray)(value)) {
|
|
114
|
+
result = (0, NativeUtils_1.nativeSet)(object.native, p, value.native);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
result = (0, NativeUtils_1.nativeSet)(object.native, p, value);
|
|
118
|
+
}
|
|
119
|
+
if (!result)
|
|
120
|
+
console.error('Failed to set value');
|
|
121
|
+
return result;
|
|
122
|
+
},
|
|
123
|
+
deleteProperty(proxy, p) {
|
|
124
|
+
if (RhineVar_1.RHINE_VAR_KEYS.has(p))
|
|
125
|
+
return false;
|
|
126
|
+
(0, Logger_1.log)('Proxy.handler.deleteProperty:', p);
|
|
127
|
+
let result = (0, NativeUtils_1.nativeDelete)(object.native, p);
|
|
128
|
+
if (!result)
|
|
129
|
+
console.error('Failed to delete value');
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
object.observe();
|
|
134
|
+
return new Proxy(object, handler);
|
|
135
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Transaction, YArrayEvent, YMapEvent } from "yjs";
|
|
2
|
+
import WebsocketRhineConnector from "../connector/WebsocketRhineConnector";
|
|
3
|
+
import { Native } from "../native/Native";
|
|
4
|
+
import { ChangeType } from "../event/ChangeType";
|
|
5
|
+
import { Callback } from "../event/Callback";
|
|
6
|
+
export default class RhineVar {
|
|
7
|
+
native: Native;
|
|
8
|
+
constructor(native: Native);
|
|
9
|
+
connector: WebsocketRhineConnector | null;
|
|
10
|
+
json(): any[] | {
|
|
11
|
+
[x: string]: any;
|
|
12
|
+
};
|
|
13
|
+
private listeners;
|
|
14
|
+
subscribe(callback: Callback): () => void;
|
|
15
|
+
unsubscribe(callback: Callback): void;
|
|
16
|
+
private keyListeners;
|
|
17
|
+
subscribeKey(key: string, callback: Callback): () => void;
|
|
18
|
+
unsubscribeKey(callback: Callback): void;
|
|
19
|
+
emit(value: any, key: string, oldValue: any, type: ChangeType, nativeEvent: YMapEvent<any> | YArrayEvent<any>, nativeTransaction: Transaction): void;
|
|
20
|
+
observer: (event: YMapEvent<any> | YArrayEvent<any>, transaction: Transaction) => void;
|
|
21
|
+
observe(): void;
|
|
22
|
+
unobserve(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare const RHINE_VAR_KEYS: Set<string | symbol>;
|
|
25
|
+
//# sourceMappingURL=RhineVar.d.ts.map
|
|
@@ -0,0 +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;IAGlB,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;IAGvB,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAO;IAEzC,IAAI;;;IAIX,OAAO,CAAC,SAAS,CAAiB;IAClC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAIzC,WAAW,CAAC,QAAQ,EAAE,QAAQ;IAI9B,OAAO,CAAC,YAAY,CAAqC;IACzD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI;IAOzD,cAAc,CAAC,QAAQ,EAAE,QAAQ;IAMjC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,WAAW;IAO7I,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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RHINE_VAR_KEYS = void 0;
|
|
4
|
+
const yjs_1 = require("yjs");
|
|
5
|
+
const Proxy_1 = require("./Proxy");
|
|
6
|
+
const Logger_1 = require("../utils/Logger");
|
|
7
|
+
const DataUtils_1 = require("../utils/DataUtils");
|
|
8
|
+
const ChangeType_1 = require("../event/ChangeType");
|
|
9
|
+
class RhineVar {
|
|
10
|
+
constructor(native) {
|
|
11
|
+
this.native = native;
|
|
12
|
+
this.connector = null;
|
|
13
|
+
this.listeners = [];
|
|
14
|
+
this.keyListeners = new Map();
|
|
15
|
+
this.observer = (event, transaction) => { };
|
|
16
|
+
}
|
|
17
|
+
json() {
|
|
18
|
+
return this.native.toJSON();
|
|
19
|
+
}
|
|
20
|
+
subscribe(callback) {
|
|
21
|
+
this.listeners.push(callback);
|
|
22
|
+
return () => this.unsubscribe(callback);
|
|
23
|
+
}
|
|
24
|
+
unsubscribe(callback) {
|
|
25
|
+
this.listeners = this.listeners.filter(listener => listener !== callback);
|
|
26
|
+
}
|
|
27
|
+
subscribeKey(key, callback) {
|
|
28
|
+
if (!this.keyListeners.has(key)) {
|
|
29
|
+
this.keyListeners.set(key, []);
|
|
30
|
+
}
|
|
31
|
+
this.keyListeners.get(key).push(callback);
|
|
32
|
+
return () => this.unsubscribeKey(callback);
|
|
33
|
+
}
|
|
34
|
+
unsubscribeKey(callback) {
|
|
35
|
+
this.keyListeners.forEach((listeners, key) => {
|
|
36
|
+
this.keyListeners.set(key, listeners.filter(listener => listener !== callback));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
emit(value, key, oldValue, type, nativeEvent, nativeTransaction) {
|
|
40
|
+
this.listeners.forEach(listener => listener(value, key, oldValue, type, nativeEvent, nativeTransaction));
|
|
41
|
+
if (this.keyListeners.has(key)) {
|
|
42
|
+
this.keyListeners.get(key).forEach(listener => listener(value, key, oldValue, type, nativeEvent, nativeTransaction));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 开始观察当前Native的内容变化
|
|
46
|
+
observe() {
|
|
47
|
+
const target = this.native;
|
|
48
|
+
if (target instanceof yjs_1.Map) {
|
|
49
|
+
this.observer = (event, transaction) => {
|
|
50
|
+
event.changes.keys.forEach(({ action, oldValue }, key) => {
|
|
51
|
+
(0, Logger_1.log)(`Proxy.event: Map ${action} ${key}: ${oldValue} -> ${target.get(key)}`);
|
|
52
|
+
let value = target.get(key);
|
|
53
|
+
if (action === 'add' || action === 'update') {
|
|
54
|
+
if ((0, DataUtils_1.isObjectOrArray)(value)) {
|
|
55
|
+
Reflect.set(this, key, (0, Proxy_1.rhineProxyNative)(value));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (action === 'delete') {
|
|
59
|
+
Reflect.deleteProperty(this, key);
|
|
60
|
+
}
|
|
61
|
+
this.emit(target.get(key), key, oldValue, action, event, transaction);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
else if (target instanceof yjs_1.Array) {
|
|
66
|
+
this.observer = (event, transaction) => {
|
|
67
|
+
(0, Logger_1.log)(`Proxy.event: Array changed.`, event, transaction);
|
|
68
|
+
const { added, deleted, delta } = event.changes;
|
|
69
|
+
this.emit(delta, '', undefined, ChangeType_1.ChangeType.Update, event, transaction);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (this.observer) {
|
|
73
|
+
target.observe(this.observer);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 当存在观察者时 结束观察当前native的内容变化
|
|
77
|
+
unobserve() {
|
|
78
|
+
if (this.observer) {
|
|
79
|
+
this.native.unobserve(this.observer);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.default = RhineVar;
|
|
84
|
+
exports.RHINE_VAR_KEYS = new Set([
|
|
85
|
+
'native',
|
|
86
|
+
'json',
|
|
87
|
+
'listeners',
|
|
88
|
+
'subscribe',
|
|
89
|
+
'unsubscribe',
|
|
90
|
+
'keyListeners',
|
|
91
|
+
'subscribeKey',
|
|
92
|
+
'unsubscribeKey',
|
|
93
|
+
'emit',
|
|
94
|
+
'observer',
|
|
95
|
+
'observe',
|
|
96
|
+
'unobserve',
|
|
97
|
+
'connector',
|
|
98
|
+
]);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Array as YArray } from "yjs";
|
|
2
|
+
import RhineVar from "../proxy/RhineVar";
|
|
3
|
+
export declare function convertArrayProperty<T>(target: YArray<T>, name: string, object: RhineVar): number | ((item: T | RhineVar) => 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;
|
|
4
|
+
//# sourceMappingURL=ConvertProperty.d.ts.map
|
|
@@ -0,0 +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;AAG7C,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,oBAIvE,CAAC,GAAG,QAAQ,yBAsBR,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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.convertArrayProperty = convertArrayProperty;
|
|
7
|
+
const RhineVar_1 = __importDefault(require("../proxy/RhineVar"));
|
|
8
|
+
const DataUtils_1 = require("./DataUtils");
|
|
9
|
+
function convertArrayProperty(target, name, object) {
|
|
10
|
+
if (name === 'length') {
|
|
11
|
+
return target.length;
|
|
12
|
+
}
|
|
13
|
+
if (name === 'push') {
|
|
14
|
+
return (item) => {
|
|
15
|
+
item = (0, DataUtils_1.ensureRhineVar)(item);
|
|
16
|
+
if (item instanceof RhineVar_1.default) {
|
|
17
|
+
target.push([item.native]);
|
|
18
|
+
Reflect.set(object, target.length - 1, item);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
target.push([item]);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
else if (name === 'pop') {
|
|
26
|
+
return () => {
|
|
27
|
+
let item = target.get(target.length - 1);
|
|
28
|
+
target.delete(target.length - 1);
|
|
29
|
+
return item;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
else if (name === 'shift') {
|
|
33
|
+
return () => {
|
|
34
|
+
let item = target.get(0);
|
|
35
|
+
target.delete(0);
|
|
36
|
+
return item;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else if (name === 'unshift') {
|
|
40
|
+
return (...items) => {
|
|
41
|
+
target.unshift(items);
|
|
42
|
+
return target.length;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
else if (name === 'slice') {
|
|
46
|
+
return (start, end) => {
|
|
47
|
+
return target.slice(start, end);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
else if (name === 'splice') {
|
|
51
|
+
return (start, deleteCount, ...items) => {
|
|
52
|
+
const removed = target.slice(start, start + deleteCount);
|
|
53
|
+
target.delete(start, deleteCount);
|
|
54
|
+
if (items.length > 0) {
|
|
55
|
+
target.insert(start, items);
|
|
56
|
+
}
|
|
57
|
+
return removed;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else if (name === 'forEach') {
|
|
61
|
+
return (callback) => {
|
|
62
|
+
return target.forEach(callback);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
else if (name === 'map') {
|
|
66
|
+
return (callback) => {
|
|
67
|
+
return target.map(callback);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
else if (name === 'indexOf') {
|
|
71
|
+
return (item) => {
|
|
72
|
+
for (let i = 0; i < target.length; i++) {
|
|
73
|
+
if (target.get(i) === item)
|
|
74
|
+
return i;
|
|
75
|
+
}
|
|
76
|
+
return -1;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (name === 'includes') {
|
|
80
|
+
return (item) => {
|
|
81
|
+
for (let i = 0; i < target.length; i++) {
|
|
82
|
+
if (target.get(i) === item)
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ProxiedRhineVar } from "../proxy/ProxiedRhineVar";
|
|
2
|
+
export declare function isObject(value: any): boolean;
|
|
3
|
+
export declare function isArray(value: any): value is any[];
|
|
4
|
+
export declare function isObjectOrArray(value: any): boolean;
|
|
5
|
+
export declare function ensureRhineVar<T>(value: T | ProxiedRhineVar<T>): ProxiedRhineVar<T> | any;
|
|
6
|
+
//# sourceMappingURL=DataUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataUtils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/DataUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,iCAAqC;AAK7D,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,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,GAAG,CAUzF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isObject = isObject;
|
|
7
|
+
exports.isArray = isArray;
|
|
8
|
+
exports.isObjectOrArray = isObjectOrArray;
|
|
9
|
+
exports.ensureRhineVar = ensureRhineVar;
|
|
10
|
+
const NativeUtils_1 = require("../native/NativeUtils");
|
|
11
|
+
const RhineVar_1 = __importDefault(require("../proxy/RhineVar"));
|
|
12
|
+
const Proxy_1 = require("../proxy/Proxy");
|
|
13
|
+
function isObject(value) {
|
|
14
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
function isArray(value) {
|
|
17
|
+
return Array.isArray(value);
|
|
18
|
+
}
|
|
19
|
+
function isObjectOrArray(value) {
|
|
20
|
+
return value !== null && typeof value === 'object';
|
|
21
|
+
}
|
|
22
|
+
function ensureRhineVar(value) {
|
|
23
|
+
if ((0, NativeUtils_1.isYMapOrYArray)(value)) {
|
|
24
|
+
return (0, Proxy_1.rhineProxyNative)(value);
|
|
25
|
+
}
|
|
26
|
+
if (isObjectOrArray(value)) {
|
|
27
|
+
if (!(value instanceof RhineVar_1.default)) {
|
|
28
|
+
return (0, Proxy_1.rhineProxy)(value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/core/utils/Logger.ts"],"names":[],"mappings":"AAGA,wBAAgB,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,QAIlC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { rhineProxy, rhineProxyNative } from "./core/proxy/Proxy";
|
|
2
|
+
import RhineVar from "./core/proxy/RhineVar";
|
|
3
|
+
import { ProxiedRhineVar, RecursiveCrossRhineVar } from "./core/proxy/ProxiedRhineVar";
|
|
4
|
+
import DirectPackage from "./core/proxy/DirectPackage";
|
|
5
|
+
import WebsocketRhineConnector from "./core/connector/WebsocketRhineConnector";
|
|
6
|
+
import useRhine from "./react/hooks/useRhine";
|
|
7
|
+
import useSynced from "./react/hooks/useSynced";
|
|
8
|
+
export { WebsocketRhineConnector, rhineProxy, rhineProxyNative, RhineVar, ProxiedRhineVar, RecursiveCrossRhineVar, DirectPackage, useRhine, useSynced, };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,mCAAmC;AACvD,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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.useSynced = exports.useRhine = exports.DirectPackage = exports.RhineVar = exports.rhineProxyNative = exports.rhineProxy = exports.WebsocketRhineConnector = void 0;
|
|
7
|
+
const Proxy_1 = require("./core/proxy/Proxy");
|
|
8
|
+
Object.defineProperty(exports, "rhineProxy", { enumerable: true, get: function () { return Proxy_1.rhineProxy; } });
|
|
9
|
+
Object.defineProperty(exports, "rhineProxyNative", { enumerable: true, get: function () { return Proxy_1.rhineProxyNative; } });
|
|
10
|
+
const RhineVar_1 = __importDefault(require("./core/proxy/RhineVar"));
|
|
11
|
+
exports.RhineVar = RhineVar_1.default;
|
|
12
|
+
const DirectPackage_1 = __importDefault(require("./core/proxy/DirectPackage"));
|
|
13
|
+
exports.DirectPackage = DirectPackage_1.default;
|
|
14
|
+
const WebsocketRhineConnector_1 = __importDefault(require("./core/connector/WebsocketRhineConnector"));
|
|
15
|
+
exports.WebsocketRhineConnector = WebsocketRhineConnector_1.default;
|
|
16
|
+
const useRhine_1 = __importDefault(require("./react/hooks/useRhine"));
|
|
17
|
+
exports.useRhine = useRhine_1.default;
|
|
18
|
+
const useSynced_1 = __importDefault(require("./react/hooks/useSynced"));
|
|
19
|
+
exports.useSynced = useSynced_1.default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRhine.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useRhine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,eAAe,EAAC,yCAAqC;AAE7D,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAc3E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.default = useRhine;
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
function useRhine(proxy) {
|
|
7
|
+
const [state, setState] = (0, react_1.useState)(proxy.json());
|
|
8
|
+
(0, react_1.useEffect)(() => {
|
|
9
|
+
var _a;
|
|
10
|
+
proxy.subscribe(() => {
|
|
11
|
+
setState(proxy.json());
|
|
12
|
+
});
|
|
13
|
+
(_a = proxy.connector) === null || _a === void 0 ? void 0 : _a.addSyncedListener(() => {
|
|
14
|
+
setState(proxy.json());
|
|
15
|
+
});
|
|
16
|
+
}, []);
|
|
17
|
+
return state;
|
|
18
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import WebsocketRhineConnector from "../../core/connector/WebsocketRhineConnector";
|
|
2
|
+
import { ProxiedRhineVar } from "../../core/proxy/ProxiedRhineVar";
|
|
3
|
+
export default function useSynced(target?: WebsocketRhineConnector | ProxiedRhineVar<any>): boolean | undefined;
|
|
4
|
+
//# sourceMappingURL=useSynced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSynced.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useSynced.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,qDAAiD;AAE/E,OAAO,EAAC,eAAe,EAAC,yCAAqC;AAE7D,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,eAAe,CAAC,GAAG,CAAC,uBA0BxF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = useSynced;
|
|
7
|
+
const WebsocketRhineConnector_1 = __importDefault(require("../../core/connector/WebsocketRhineConnector"));
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
function useSynced(target) {
|
|
10
|
+
let connector = null;
|
|
11
|
+
if (target) {
|
|
12
|
+
if (target instanceof WebsocketRhineConnector_1.default) {
|
|
13
|
+
connector = target;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
connector = target.connector;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const [synced, setSynced] = (0, react_1.useState)(connector === null || connector === void 0 ? void 0 : connector.synced);
|
|
20
|
+
(0, react_1.useEffect)(() => {
|
|
21
|
+
let listener = null;
|
|
22
|
+
if (connector) {
|
|
23
|
+
listener = (synced) => setSynced(synced);
|
|
24
|
+
connector.addSyncedListener(listener);
|
|
25
|
+
}
|
|
26
|
+
return () => {
|
|
27
|
+
if (listener && connector) {
|
|
28
|
+
connector.removeSyncedListener(listener);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}, []);
|
|
32
|
+
return synced;
|
|
33
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rhine-var",
|
|
3
|
+
"version": "0.1.0",
|
|
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
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"watch": "tsc --watch",
|
|
10
|
+
"prepare": "ts-patch install -s",
|
|
11
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [],
|
|
14
|
+
"author": "",
|
|
15
|
+
"license": "ISC",
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@testing-library/jest-dom": "^6.5.0",
|
|
18
|
+
"@testing-library/react": "^16.0.1",
|
|
19
|
+
"@testing-library/react-hooks": "^8.0.1",
|
|
20
|
+
"@types/jest": "^29.5.12",
|
|
21
|
+
"@types/puppeteer": "^7.0.4",
|
|
22
|
+
"@types/react": "^18.3.5",
|
|
23
|
+
"@types/react-dom": "^18.3.0",
|
|
24
|
+
"jest": "^29.7.0",
|
|
25
|
+
"jest-puppeteer": "^10.1.1",
|
|
26
|
+
"puppeteer": "^23.3.0",
|
|
27
|
+
"ts-jest": "^29.2.5",
|
|
28
|
+
"ts-node": "^10.9.2",
|
|
29
|
+
"ts-patch": "^3.2.1",
|
|
30
|
+
"typescript": "^5.5.4"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"react": "^18.3.1",
|
|
34
|
+
"typescript-transform-paths": "^3.5.0",
|
|
35
|
+
"y-websocket": "^2.0.4",
|
|
36
|
+
"yjs": "^13.6.18"
|
|
37
|
+
}
|
|
38
|
+
}
|