@casual-simulation/aux-vm-client 3.0.1 → 3.0.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@casual-simulation/aux-vm-client",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "A set of utilities required to securely run an AUX as a client.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"aux"
|
|
@@ -40,17 +40,18 @@
|
|
|
40
40
|
"url": "https://github.com/casual-simulation/casualos/issues"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@casual-simulation/aux-common": "^3.0.
|
|
44
|
-
"@casual-simulation/aux-vm": "^3.0.
|
|
45
|
-
"@casual-simulation/causal-tree-client-apiary": "^3.0.
|
|
46
|
-
"@casual-simulation/causal-tree-client-websocket": "^3.0.
|
|
47
|
-
"@casual-simulation/causal-trees": "^3.0.
|
|
43
|
+
"@casual-simulation/aux-common": "^3.0.2",
|
|
44
|
+
"@casual-simulation/aux-vm": "^3.0.2",
|
|
45
|
+
"@casual-simulation/causal-tree-client-apiary": "^3.0.2",
|
|
46
|
+
"@casual-simulation/causal-tree-client-websocket": "^3.0.2",
|
|
47
|
+
"@casual-simulation/causal-trees": "^3.0.2",
|
|
48
48
|
"@casual-simulation/crypto": "^3.0.0",
|
|
49
|
+
"@casual-simulation/timesync": "^3.0.2",
|
|
49
50
|
"@casual-simulation/websocket": "^3.0.0",
|
|
50
51
|
"axios": "0.25.0",
|
|
51
52
|
"lodash": "4.17.21",
|
|
52
53
|
"rxjs": "^6.5.2",
|
|
53
54
|
"uuid": "^8.3.2"
|
|
54
55
|
},
|
|
55
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "9279acf4466028afeea70ee650edb78243fec8a0"
|
|
56
57
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { User } from '@casual-simulation/causal-trees';
|
|
2
2
|
import { CausalRepoClient } from '@casual-simulation/causal-trees/core2';
|
|
3
3
|
import { PartitionConfig, RemoteCausalRepoPartition, BotPartition, OtherPlayersPartition, RemoteCausalRepoProtocol, YjsPartition } from '@casual-simulation/aux-common';
|
|
4
|
+
import { AuxTimeSyncConfiguration } from '@casual-simulation/aux-vm';
|
|
5
|
+
import { TimeSyncController } from '@casual-simulation/timesync';
|
|
4
6
|
/**
|
|
5
7
|
* Gets the causal repo client that should be used for the given host.
|
|
6
8
|
* @param host The host.
|
|
@@ -33,4 +35,5 @@ export declare function createRemoteYjsPartition(config: PartitionConfig, user:
|
|
|
33
35
|
*/
|
|
34
36
|
export declare function createOtherPlayersRepoPartition(config: PartitionConfig, user: User, useCache?: boolean): Promise<OtherPlayersPartition>;
|
|
35
37
|
export declare function createBotPartition(config: PartitionConfig): Promise<BotPartition>;
|
|
38
|
+
export declare function createTimeSyncController(config: AuxTimeSyncConfiguration, user: User): TimeSyncController;
|
|
36
39
|
//# sourceMappingURL=PartitionFactories.d.ts.map
|
|
@@ -7,12 +7,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { CausalRepoClient } from '@casual-simulation/causal-trees/core2';
|
|
10
|
+
import { CausalRepoClient, CausalRepoClientTimeSyncConnection } from '@casual-simulation/causal-trees/core2';
|
|
11
11
|
import { BotHttpClient } from './BotHttpClient';
|
|
12
12
|
import { RemoteCausalRepoPartitionImpl, BotPartitionImpl, OtherPlayersPartitionImpl, RemoteYjsPartitionImpl, } from '@casual-simulation/aux-common';
|
|
13
13
|
import { AwsSocket, ApiaryConnectionClient, } from '@casual-simulation/causal-tree-client-apiary';
|
|
14
14
|
import { WebSocketConnectionClient } from '@casual-simulation/causal-tree-client-websocket';
|
|
15
15
|
import { SocketManager as WebSocketManager } from '@casual-simulation/websocket';
|
|
16
|
+
import { TimeSyncController } from '@casual-simulation/timesync';
|
|
16
17
|
/**
|
|
17
18
|
* A map of hostnames to CausalRepoClients.
|
|
18
19
|
* Helps prevent duplicating websocket connections to the same host.
|
|
@@ -130,4 +131,11 @@ export function createBotPartition(config) {
|
|
|
130
131
|
return undefined;
|
|
131
132
|
});
|
|
132
133
|
}
|
|
134
|
+
export function createTimeSyncController(config, user) {
|
|
135
|
+
if (config.host) {
|
|
136
|
+
const client = getClientForHostAndProtocol(config.host, user, config.connectionProtocol);
|
|
137
|
+
return new TimeSyncController(new CausalRepoClientTimeSyncConnection(client));
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
133
141
|
//# sourceMappingURL=PartitionFactories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PartitionFactories.js","sourceRoot":"","sources":["PartitionFactories.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"PartitionFactories.js","sourceRoot":"","sources":["PartitionFactories.ts"],"names":[],"mappings":"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"}
|
package/vm/RemoteAuxChannel.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { LocalActions, PartitionConfig, AuxPartition } from '@casual-simulation/aux-common';
|
|
2
2
|
import { AuxConfig, BaseAuxChannel, AuxUser, AuxChannelOptions } from '@casual-simulation/aux-vm';
|
|
3
|
+
import { TimeSyncController } from '@casual-simulation/timesync';
|
|
3
4
|
export interface RemoteAuxChannelOptions extends AuxChannelOptions {
|
|
4
5
|
}
|
|
5
6
|
export declare class RemoteAuxChannel extends BaseAuxChannel {
|
|
6
7
|
constructor(user: AuxUser, config: AuxConfig, options: RemoteAuxChannelOptions);
|
|
7
8
|
protected _createPartition(config: PartitionConfig): Promise<AuxPartition>;
|
|
9
|
+
protected _createTimeSyncController(): TimeSyncController;
|
|
8
10
|
protected _handleError(error: any): void;
|
|
9
11
|
protected _handleLocalEvents(e: LocalActions[]): void;
|
|
10
12
|
}
|
package/vm/RemoteAuxChannel.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { createAuxPartition, createMemoryPartition, createCausalRepoPartition, createCausalRepoClientPartition, createCausalRepoHistoryClientPartition, createBotClientPartition, iteratePartitions, createOtherPlayersClientPartition, createYjsPartition, createRemoteClientYjsPartition, } from '@casual-simulation/aux-common';
|
|
11
11
|
import { BaseAuxChannel, } from '@casual-simulation/aux-vm';
|
|
12
|
-
import { createBotPartition, createRemoteCausalRepoPartition, createOtherPlayersRepoPartition, createRemoteYjsPartition, } from '../partitions';
|
|
12
|
+
import { createBotPartition, createRemoteCausalRepoPartition, createOtherPlayersRepoPartition, createRemoteYjsPartition, createTimeSyncController, } from '../partitions';
|
|
13
13
|
export class RemoteAuxChannel extends BaseAuxChannel {
|
|
14
14
|
constructor(user, config, options) {
|
|
15
15
|
super(user, config, options);
|
|
@@ -19,6 +19,13 @@ export class RemoteAuxChannel extends BaseAuxChannel {
|
|
|
19
19
|
return yield createAuxPartition(config, createMemoryPartition, (config) => createCausalRepoPartition(config, this.user), (config) => createRemoteCausalRepoPartition(config, this.user), (config) => createCausalRepoClientPartition(config, this.user), (config) => createCausalRepoHistoryClientPartition(config, this.user), (config) => createBotPartition(config), (config) => createBotClientPartition(config), (config) => createOtherPlayersClientPartition(config, this.user), (config) => createOtherPlayersRepoPartition(config, this.user), (config) => createYjsPartition(config), (config) => createRemoteYjsPartition(config, this.user), (config) => createRemoteClientYjsPartition(config, this.user));
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
+
_createTimeSyncController() {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
if ((_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.timesync) {
|
|
25
|
+
return ((_c = createTimeSyncController(this._config.config.timesync, this.user)) !== null && _c !== void 0 ? _c : super._createTimeSyncController());
|
|
26
|
+
}
|
|
27
|
+
return super._createTimeSyncController();
|
|
28
|
+
}
|
|
22
29
|
_handleError(error) {
|
|
23
30
|
if (error instanceof Error) {
|
|
24
31
|
super._handleError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteAuxChannel.js","sourceRoot":"","sources":["RemoteAuxChannel.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAIH,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,sCAAsC,EACtC,wBAAwB,EACxB,iBAAiB,EACjB,iCAAiC,EACjC,kBAAkB,EAClB,8BAA8B,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEH,cAAc,GAGjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,kBAAkB,EAClB,+BAA+B,EAC/B,+BAA+B,EAC/B,wBAAwB,GAC3B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"RemoteAuxChannel.js","sourceRoot":"","sources":["RemoteAuxChannel.ts"],"names":[],"mappings":"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"}
|