@dcl/sdk 7.3.31-7169243942.commit-5f044c6 → 7.3.32-7170667436.commit-11a2181
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/internal/transports/logger.js +7 -4
- package/internal/transports/rendererTransport.js +3 -2
- package/message-bus.js +8 -6
- package/network/binary-message-bus.d.ts +18 -0
- package/network/binary-message-bus.js +68 -0
- package/network/entities.d.ts +11 -0
- package/network/entities.js +77 -0
- package/network/filter.d.ts +2 -0
- package/network/filter.js +37 -0
- package/network/index.d.ts +2 -0
- package/network/index.js +7 -0
- package/network/message-bus-sync.d.ts +17 -0
- package/network/message-bus-sync.js +52 -0
- package/network/state.js +39 -0
- package/network/utils.d.ts +18 -0
- package/network/utils.js +69 -0
- package/package.json +6 -6
- package/src/internal/transports/logger.ts +9 -4
- package/src/internal/transports/rendererTransport.ts +2 -1
- package/src/message-bus.ts +7 -9
- package/src/network/README.md +122 -0
- package/src/network/binary-message-bus.ts +72 -0
- package/src/network/entities.ts +132 -0
- package/src/network/filter.ts +64 -0
- package/src/network/index.ts +13 -0
- package/src/network/message-bus-sync.ts +97 -0
- package/src/network/state.ts +65 -0
- package/src/network/utils.ts +145 -0
- package/network-transport/client.d.ts +0 -5
- package/network-transport/client.js +0 -68
- package/network-transport/index.d.ts +0 -10
- package/network-transport/index.js +0 -29
- package/network-transport/server.d.ts +0 -2
- package/network-transport/server.js +0 -62
- package/network-transport/state.js +0 -11
- package/network-transport/types.d.ts +0 -36
- package/network-transport/types.js +0 -7
- package/network-transport/utils.d.ts +0 -8
- package/network-transport/utils.js +0 -46
- package/src/network-transport/client.ts +0 -77
- package/src/network-transport/index.ts +0 -45
- package/src/network-transport/server.ts +0 -66
- package/src/network-transport/state.ts +0 -13
- package/src/network-transport/types.ts +0 -41
- package/src/network-transport/utils.ts +0 -67
- /package/{network-transport → network}/state.d.ts +0 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
import { IEngine, Transport } from '@dcl/ecs'
|
2
|
+
import type { SendBinaryRequest, SendBinaryResponse } from '~system/CommunicationsController'
|
3
|
+
|
4
|
+
import { syncFilter } from './filter'
|
5
|
+
import { engineToCrdt } from './state'
|
6
|
+
import { serializeCrdtMessages } from '../internal/transports/logger'
|
7
|
+
import { BinaryMessageBus, CommsMessage } from './binary-message-bus'
|
8
|
+
import {
|
9
|
+
definePlayersInScene,
|
10
|
+
fetchProfile,
|
11
|
+
oldestUser as _oldestUser,
|
12
|
+
setInitialized,
|
13
|
+
stateInitialized,
|
14
|
+
stateInitializedChecker,
|
15
|
+
syncTransportIsReady
|
16
|
+
} from './utils'
|
17
|
+
import { entityUtils } from './entities'
|
18
|
+
import { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
|
19
|
+
|
20
|
+
export type IProfile = { networkId: number; userId: string }
|
21
|
+
// user that we asked for the inital crdt state
|
22
|
+
export function addSyncTransport(
|
23
|
+
engine: IEngine,
|
24
|
+
sendBinary: (msg: SendBinaryRequest) => Promise<SendBinaryResponse>,
|
25
|
+
getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>
|
26
|
+
) {
|
27
|
+
definePlayersInScene(engine)
|
28
|
+
// Profile Info
|
29
|
+
const myProfile: IProfile = {} as IProfile
|
30
|
+
fetchProfile(myProfile!, getUserData)
|
31
|
+
|
32
|
+
// Entity utils
|
33
|
+
const entityDefinitions = entityUtils(engine, myProfile)
|
34
|
+
|
35
|
+
// List of MessageBuss messsages to be sent on every frame to comms
|
36
|
+
const pendingMessageBusMessagesToSend: Uint8Array[] = []
|
37
|
+
const binaryMessageBus = BinaryMessageBus((message) => pendingMessageBusMessagesToSend.push(message))
|
38
|
+
function getMessagesToSend() {
|
39
|
+
const messages = [...pendingMessageBusMessagesToSend]
|
40
|
+
pendingMessageBusMessagesToSend.length = 0
|
41
|
+
return messages
|
42
|
+
}
|
43
|
+
|
44
|
+
// Add Sync Transport
|
45
|
+
const transport: Transport = {
|
46
|
+
filter: syncFilter(engine),
|
47
|
+
send: async (message: Uint8Array) => {
|
48
|
+
if (syncTransportIsReady(engine) && message.byteLength) {
|
49
|
+
// console.log(Array.from(serializeCrdtMessages('[send CRDT]: ', message, engine)))
|
50
|
+
binaryMessageBus.emit(CommsMessage.CRDT, message)
|
51
|
+
}
|
52
|
+
const messages = getMessagesToSend()
|
53
|
+
const response = await sendBinary({ data: messages })
|
54
|
+
binaryMessageBus.__processMessages(response.data)
|
55
|
+
},
|
56
|
+
type: 'network'
|
57
|
+
}
|
58
|
+
engine.addTransport(transport)
|
59
|
+
// End add sync transport
|
60
|
+
|
61
|
+
// Add state intialized checker
|
62
|
+
engine.addSystem(() => stateInitializedChecker(engine, myProfile, entityDefinitions.syncEntity))
|
63
|
+
|
64
|
+
// Request initial state
|
65
|
+
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
|
66
|
+
|
67
|
+
// If we dont have any state initialized, and recieve a state message.
|
68
|
+
binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => {
|
69
|
+
// console.log(Array.from(serializeCrdtMessages('[binaryMessageBus]: ', value, engine)))
|
70
|
+
if (!stateInitialized) {
|
71
|
+
setInitialized()
|
72
|
+
transport.onmessage!(value)
|
73
|
+
}
|
74
|
+
})
|
75
|
+
|
76
|
+
// If we are the oldest user and we recieve a req of a state we send it.
|
77
|
+
binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, () => {
|
78
|
+
// TODO: oldest not working because connectedPlayers returns players that are not in the scene.
|
79
|
+
// Not working :sadcat:
|
80
|
+
// const oldest = oldestUser(engine, myProfile, entityDefinitions.syncEntity)
|
81
|
+
if (stateInitialized) {
|
82
|
+
binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, engineToCrdt(engine))
|
83
|
+
}
|
84
|
+
})
|
85
|
+
|
86
|
+
// Process CRDT messages here
|
87
|
+
binaryMessageBus.on(CommsMessage.CRDT, (value) => {
|
88
|
+
// console.log(Array.from(serializeCrdtMessages('[CRDT on]: ', value, engine)))
|
89
|
+
|
90
|
+
transport.onmessage!(value)
|
91
|
+
})
|
92
|
+
|
93
|
+
return {
|
94
|
+
...entityDefinitions,
|
95
|
+
myProfile
|
96
|
+
}
|
97
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer'
|
2
|
+
import {
|
3
|
+
CrdtMessageHeader,
|
4
|
+
CrdtMessageProtocol,
|
5
|
+
CrdtMessageType,
|
6
|
+
IEngine,
|
7
|
+
PutComponentOperation,
|
8
|
+
PutNetworkComponentOperation,
|
9
|
+
SyncComponents as _SyncComponents,
|
10
|
+
NetworkEntity as _NetworkEntity,
|
11
|
+
ISyncComponents,
|
12
|
+
INetowrkEntity
|
13
|
+
} from '@dcl/ecs'
|
14
|
+
|
15
|
+
export function engineToCrdt(engine: IEngine): Uint8Array {
|
16
|
+
const crdtBuffer = new ReadWriteByteBuffer()
|
17
|
+
const networkBuffer = new ReadWriteByteBuffer()
|
18
|
+
const SyncComponents = engine.getComponent(_SyncComponents.componentId) as ISyncComponents
|
19
|
+
const NetworkEntity = engine.getComponent(_NetworkEntity.componentId) as INetowrkEntity
|
20
|
+
|
21
|
+
for (const itComponentDefinition of engine.componentsIter()) {
|
22
|
+
itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
|
23
|
+
const isNetworkEntity = NetworkEntity.has(entity)
|
24
|
+
if (!isNetworkEntity) {
|
25
|
+
return false
|
26
|
+
}
|
27
|
+
const isDynamicEntity = NetworkEntity.get(entity).networkId
|
28
|
+
if (isDynamicEntity) {
|
29
|
+
return true
|
30
|
+
}
|
31
|
+
// For the static entities we only send the updates of the SyncComponents
|
32
|
+
return SyncComponents.get(entity).componentIds.includes(itComponentDefinition.componentId)
|
33
|
+
})
|
34
|
+
}
|
35
|
+
|
36
|
+
let header: CrdtMessageHeader | null
|
37
|
+
while ((header = CrdtMessageProtocol.getHeader(crdtBuffer))) {
|
38
|
+
if (header.type === CrdtMessageType.PUT_COMPONENT) {
|
39
|
+
const message = PutComponentOperation.read(crdtBuffer)!
|
40
|
+
const networkEntity = NetworkEntity.getOrNull(message.entityId)
|
41
|
+
if (networkEntity) {
|
42
|
+
PutNetworkComponentOperation.write(
|
43
|
+
networkEntity.entityId,
|
44
|
+
message.timestamp,
|
45
|
+
message.componentId,
|
46
|
+
networkEntity.networkId,
|
47
|
+
message.data,
|
48
|
+
networkBuffer
|
49
|
+
)
|
50
|
+
} else {
|
51
|
+
PutComponentOperation.write(
|
52
|
+
message.entityId,
|
53
|
+
message.timestamp,
|
54
|
+
message.componentId,
|
55
|
+
message.data,
|
56
|
+
networkBuffer
|
57
|
+
)
|
58
|
+
}
|
59
|
+
} else {
|
60
|
+
crdtBuffer.incrementReadOffset(header.length)
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
return networkBuffer.toBinary()
|
65
|
+
}
|
@@ -0,0 +1,145 @@
|
|
1
|
+
import {
|
2
|
+
EngineInfo as _EngineInfo,
|
3
|
+
Entity,
|
4
|
+
IEngine,
|
5
|
+
NetworkEntity as _NetworkEntity,
|
6
|
+
Schemas,
|
7
|
+
LastWriteWinElementSetComponentDefinition,
|
8
|
+
PBEngineInfo
|
9
|
+
} from '@dcl/ecs'
|
10
|
+
import { componentNumberFromName } from '@dcl/ecs/dist/components/component-number'
|
11
|
+
|
12
|
+
import type { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
|
13
|
+
import { SyncEntity } from './entities'
|
14
|
+
import { IProfile } from './message-bus-sync'
|
15
|
+
|
16
|
+
// Component to track all the players and when they enter to the scene.
|
17
|
+
// Know who is in charge of sending the initial state (oldest one)
|
18
|
+
export const definePlayersInScene = (engine: IEngine) =>
|
19
|
+
engine.defineComponent('players-scene', {
|
20
|
+
timestamp: Schemas.Number,
|
21
|
+
userId: Schemas.String
|
22
|
+
})
|
23
|
+
|
24
|
+
// Already initialized my state. Ignore new states messages.
|
25
|
+
export let stateInitialized = false
|
26
|
+
|
27
|
+
// My player entity to check if I'm the oldest player in the scend
|
28
|
+
export let playerSceneEntity: Entity
|
29
|
+
|
30
|
+
export function setInitialized() {
|
31
|
+
stateInitialized = true
|
32
|
+
}
|
33
|
+
|
34
|
+
// Flag to avoid sending over the wire all the initial messages that the engine add's to the rendererTransport
|
35
|
+
// INITIAL_CRDT_MESSAGES that are being processed on the onStart loop, before the onUpdate.
|
36
|
+
export let INITIAL_CRDT_RENDERER_MESSAGES_SENT = false
|
37
|
+
|
38
|
+
// Retrieve userId to start sending this info as the networkId
|
39
|
+
export function fetchProfile(
|
40
|
+
myProfile: IProfile,
|
41
|
+
getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>
|
42
|
+
) {
|
43
|
+
void getUserData({}).then(({ data }) => {
|
44
|
+
if (data?.userId) {
|
45
|
+
const userId = data.userId
|
46
|
+
const networkId = componentNumberFromName(data.userId)
|
47
|
+
myProfile.networkId = networkId
|
48
|
+
myProfile.userId = userId
|
49
|
+
} else {
|
50
|
+
throw new Error(`Couldn't fetch profile data`)
|
51
|
+
}
|
52
|
+
})
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Add's the user information about when he joined the scene.
|
57
|
+
* It's used to check who is the oldest one, to sync the state
|
58
|
+
*/
|
59
|
+
export function createPlayerTimestampData(engine: IEngine, profile: IProfile, syncEntity: SyncEntity) {
|
60
|
+
if (!profile?.userId) return undefined
|
61
|
+
const PlayersInScene = definePlayersInScene(engine)
|
62
|
+
const entity = engine.addEntity()
|
63
|
+
PlayersInScene.create(entity, { timestamp: Date.now(), userId: profile.userId })
|
64
|
+
syncEntity(entity, [PlayersInScene.componentId])
|
65
|
+
playerSceneEntity = entity
|
66
|
+
return playerSceneEntity
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Check if I'm the older user to send the initial state
|
71
|
+
*/
|
72
|
+
export function oldestUser(engine: IEngine, profile: IProfile, syncEntity: SyncEntity): boolean {
|
73
|
+
const PlayersInScene = definePlayersInScene(engine)
|
74
|
+
// When the user leaves the scene but it's still connected.
|
75
|
+
if (!PlayersInScene.has(playerSceneEntity)) {
|
76
|
+
createPlayerTimestampData(engine, profile, syncEntity)
|
77
|
+
return oldestUser(engine, profile, syncEntity)
|
78
|
+
}
|
79
|
+
const { timestamp } = PlayersInScene.get(playerSceneEntity)
|
80
|
+
for (const [_, player] of engine.getEntitiesWith(PlayersInScene)) {
|
81
|
+
if (player.timestamp < timestamp) return false
|
82
|
+
}
|
83
|
+
return true
|
84
|
+
}
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Ignore CRDT's initial messages from the renderer.
|
88
|
+
*/
|
89
|
+
export function syncTransportIsReady(engine: IEngine) {
|
90
|
+
const EngineInfo = engine.getComponent(
|
91
|
+
_EngineInfo.componentId
|
92
|
+
) as LastWriteWinElementSetComponentDefinition<PBEngineInfo>
|
93
|
+
if (!INITIAL_CRDT_RENDERER_MESSAGES_SENT) {
|
94
|
+
const engineInfo = EngineInfo.getOrNull(engine.RootEntity)
|
95
|
+
if (engineInfo && engineInfo.tickNumber > 2) {
|
96
|
+
INITIAL_CRDT_RENDERER_MESSAGES_SENT = true
|
97
|
+
}
|
98
|
+
}
|
99
|
+
return INITIAL_CRDT_RENDERER_MESSAGES_SENT
|
100
|
+
}
|
101
|
+
|
102
|
+
/**
|
103
|
+
* Check if we are already initialized
|
104
|
+
* Add the playerSceneData component and syncronize it till we receive the state.
|
105
|
+
* This fn should be added as a system so it runs on every tick
|
106
|
+
*/
|
107
|
+
// TODO: Had to comment all the logic because getConnectedPlayers was not working as expected
|
108
|
+
// A lot of raise conditions. For now we will go with the approach that every client that it's initialized will send his crdt state.
|
109
|
+
export function stateInitializedChecker(engine: IEngine, _profile: IProfile, _syncEntity: SyncEntity) {
|
110
|
+
// const PlayersInScene = definePlayersInScene(engine)
|
111
|
+
const EngineInfo = engine.getComponent(_EngineInfo.componentId) as typeof _EngineInfo
|
112
|
+
// const NetworkEntity = engine.getComponent(_NetworkEntity.componentId) as INetowrkEntity
|
113
|
+
async function enterScene() {
|
114
|
+
// if (!playerSceneEntity) {
|
115
|
+
// createPlayerTimestampData(engine, profile, syncEntity)
|
116
|
+
// }
|
117
|
+
|
118
|
+
/**
|
119
|
+
* Keeps PlayersInScene up-to-date with the current players.
|
120
|
+
*/
|
121
|
+
// const connectedPlayers = await getConnectedPlayers({})
|
122
|
+
// for (const [entity, player] of engine.getEntitiesWith(PlayersInScene)) {
|
123
|
+
// if (!connectedPlayers.players.find(($) => $.userId === player.userId)) {
|
124
|
+
// PlayersInScene.deleteFrom(entity)
|
125
|
+
// }
|
126
|
+
// }
|
127
|
+
|
128
|
+
// Wait for comms to be ready ?? ~3000ms
|
129
|
+
if ((EngineInfo.getOrNull(engine.RootEntity)?.tickNumber ?? 0) > 100) {
|
130
|
+
setInitialized()
|
131
|
+
return
|
132
|
+
}
|
133
|
+
|
134
|
+
// If we already have data from players, dont send the heartbeat messages
|
135
|
+
// if (connectedPlayers.players.length) return
|
136
|
+
|
137
|
+
// if (!stateInitialized && playerSceneEntity) {
|
138
|
+
// // Send this data to all the players connected (new and old)
|
139
|
+
// // So everyone can decide if it's the oldest one or no.
|
140
|
+
// // It's for the case that multiple users enters ~ at the same time.
|
141
|
+
// PlayersInScene.getMutable(playerSceneEntity)
|
142
|
+
// }
|
143
|
+
}
|
144
|
+
void enterScene()
|
145
|
+
}
|
@@ -1,68 +0,0 @@
|
|
1
|
-
import { craftMessage, createNetworkManager, encodeString, syncFilter } from './utils';
|
2
|
-
import { engine } from '@dcl/ecs';
|
3
|
-
import { getHeaders } from '~system/SignedFetch';
|
4
|
-
import { MessageType } from './types';
|
5
|
-
export async function createClientTransport({ serverUrl }) {
|
6
|
-
const messagesToProcess = [];
|
7
|
-
return new Promise((resolve, reject) => {
|
8
|
-
try {
|
9
|
-
const ws = new WebSocket(serverUrl);
|
10
|
-
ws.binaryType = 'arraybuffer';
|
11
|
-
ws.onopen = async () => {
|
12
|
-
console.log('WS Server Sync connected');
|
13
|
-
const { headers } = await getHeaders({ url: serverUrl, init: { headers: {} } });
|
14
|
-
ws.send(craftMessage(MessageType.Auth, encodeString(JSON.stringify(headers))));
|
15
|
-
const transport = {
|
16
|
-
filter: syncFilter,
|
17
|
-
send: async (message) => {
|
18
|
-
if (ws.readyState === WebSocket.OPEN) {
|
19
|
-
ws.send(craftMessage(MessageType.Crdt, message));
|
20
|
-
}
|
21
|
-
if (messagesToProcess && messagesToProcess.length) {
|
22
|
-
if (transport.onmessage) {
|
23
|
-
for (const byteArray of messagesToProcess) {
|
24
|
-
transport.onmessage(byteArray);
|
25
|
-
}
|
26
|
-
}
|
27
|
-
}
|
28
|
-
messagesToProcess.length = 0;
|
29
|
-
}
|
30
|
-
};
|
31
|
-
engine.addTransport(transport);
|
32
|
-
};
|
33
|
-
ws.onmessage = (event) => {
|
34
|
-
if (event.data.byteLength) {
|
35
|
-
let offset = 0;
|
36
|
-
const r = new Uint8Array(event.data);
|
37
|
-
const view = new DataView(r.buffer);
|
38
|
-
const msgType = view.getUint8(offset);
|
39
|
-
offset += 1;
|
40
|
-
if (msgType === MessageType.Crdt) {
|
41
|
-
messagesToProcess.push(r.subarray(offset));
|
42
|
-
}
|
43
|
-
else if (msgType === MessageType.Init) {
|
44
|
-
const start = view.getUint32(offset);
|
45
|
-
offset += 4;
|
46
|
-
const size = view.getUint32(offset);
|
47
|
-
offset += 4;
|
48
|
-
const localEntitiesReserved = view.getUint32(offset);
|
49
|
-
offset += 4;
|
50
|
-
resolve(createNetworkManager(localEntitiesReserved, [start, start + size]));
|
51
|
-
messagesToProcess.push(r.subarray(offset));
|
52
|
-
}
|
53
|
-
}
|
54
|
-
};
|
55
|
-
ws.onerror = (e) => {
|
56
|
-
console.error(e);
|
57
|
-
reject(e);
|
58
|
-
};
|
59
|
-
ws.onclose = () => {
|
60
|
-
reject(new Error('socket closed'));
|
61
|
-
};
|
62
|
-
}
|
63
|
-
catch (err) {
|
64
|
-
reject(err);
|
65
|
-
}
|
66
|
-
});
|
67
|
-
}
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25ldHdvcmstdHJhbnNwb3J0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEYsT0FBTyxFQUFhLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBMEIsTUFBTSxTQUFTLENBQUE7QUFNN0QsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxFQUFFLFNBQVMsRUFBeUI7SUFDOUUsTUFBTSxpQkFBaUIsR0FBaUIsRUFBRSxDQUFBO0lBRTFDLE9BQU8sSUFBSSxPQUFPLENBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JELElBQUk7WUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQVcsQ0FBQTtZQUM3QyxFQUFFLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQTtZQUU3QixFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUE7Z0JBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFDL0UsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFFOUUsTUFBTSxTQUFTLEdBQWM7b0JBQzNCLE1BQU0sRUFBRSxVQUFVO29CQUNsQixJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQW1CLEVBQUUsRUFBRTt3QkFDbEMsSUFBSSxFQUFFLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NEJBQ3BDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTt5QkFDakQ7d0JBQ0QsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7NEJBQ2pELElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtnQ0FDdkIsS0FBSyxNQUFNLFNBQVMsSUFBSSxpQkFBaUIsRUFBRTtvQ0FDekMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtpQ0FDL0I7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtvQkFDOUIsQ0FBQztpQkFDRixDQUFBO2dCQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDaEMsQ0FBQyxDQUFBO1lBRUQsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUN6QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7b0JBQ2QsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ3JDLE1BQU0sSUFBSSxDQUFDLENBQUE7b0JBRVgsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTt3QkFDaEMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtxQkFDM0M7eUJBQU0sSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTt3QkFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDcEMsTUFBTSxJQUFJLENBQUMsQ0FBQTt3QkFDWCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO3dCQUNuQyxNQUFNLElBQUksQ0FBQyxDQUFBO3dCQUNYLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDcEQsTUFBTSxJQUFJLENBQUMsQ0FBQTt3QkFDWCxPQUFPLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDM0UsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtxQkFDM0M7aUJBQ0Y7WUFDSCxDQUFDLENBQUE7WUFFRCxFQUFFLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNYLENBQUMsQ0FBQTtZQUNELEVBQUUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNoQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtZQUNwQyxDQUFDLENBQUE7U0FDRjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQ1o7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmFmdE1lc3NhZ2UsIGNyZWF0ZU5ldHdvcmtNYW5hZ2VyLCBlbmNvZGVTdHJpbmcsIHN5bmNGaWx0ZXIgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgVHJhbnNwb3J0LCBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tICd+c3lzdGVtL1NpZ25lZEZldGNoJ1xuXG5pbXBvcnQgeyBNZXNzYWdlVHlwZSwgTmV0d29ya01hbmFnZXIsIFNvY2tldCB9IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCB0eXBlIENsaWVudFRyYW5zcG9ydENvbmZpZyA9IHtcbiAgc2VydmVyVXJsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNsaWVudFRyYW5zcG9ydCh7IHNlcnZlclVybCB9OiBDbGllbnRUcmFuc3BvcnRDb25maWcpOiBQcm9taXNlPE5ldHdvcmtNYW5hZ2VyPiB7XG4gIGNvbnN0IG1lc3NhZ2VzVG9Qcm9jZXNzOiBVaW50OEFycmF5W10gPSBbXVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxOZXR3b3JrTWFuYWdlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQoc2VydmVyVXJsKSBhcyBTb2NrZXRcbiAgICAgIHdzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInXG5cbiAgICAgIHdzLm9ub3BlbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dTIFNlcnZlciBTeW5jIGNvbm5lY3RlZCcpXG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SGVhZGVycyh7IHVybDogc2VydmVyVXJsLCBpbml0OiB7IGhlYWRlcnM6IHt9IH0gfSlcbiAgICAgICAgd3Muc2VuZChjcmFmdE1lc3NhZ2UoTWVzc2FnZVR5cGUuQXV0aCwgZW5jb2RlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGhlYWRlcnMpKSkpXG5cbiAgICAgICAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgICAgICAgZmlsdGVyOiBzeW5jRmlsdGVyLFxuICAgICAgICAgIHNlbmQ6IGFzeW5jIChtZXNzYWdlOiBVaW50OEFycmF5KSA9PiB7XG4gICAgICAgICAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgd3Muc2VuZChjcmFmdE1lc3NhZ2UoTWVzc2FnZVR5cGUuQ3JkdCwgbWVzc2FnZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZXNUb1Byb2Nlc3MgJiYgbWVzc2FnZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQub25tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBieXRlQXJyYXkgb2YgbWVzc2FnZXNUb1Byb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5vbm1lc3NhZ2UoYnl0ZUFycmF5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVzc2FnZXNUb1Byb2Nlc3MubGVuZ3RoID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbmdpbmUuYWRkVHJhbnNwb3J0KHRyYW5zcG9ydClcbiAgICAgIH1cblxuICAgICAgd3Mub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5kYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gMFxuICAgICAgICAgIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheShldmVudC5kYXRhKVxuICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoci5idWZmZXIpXG4gICAgICAgICAgY29uc3QgbXNnVHlwZSA9IHZpZXcuZ2V0VWludDgob2Zmc2V0KVxuICAgICAgICAgIG9mZnNldCArPSAxXG5cbiAgICAgICAgICBpZiAobXNnVHlwZSA9PT0gTWVzc2FnZVR5cGUuQ3JkdCkge1xuICAgICAgICAgICAgbWVzc2FnZXNUb1Byb2Nlc3MucHVzaChyLnN1YmFycmF5KG9mZnNldCkpXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dUeXBlID09PSBNZXNzYWdlVHlwZS5Jbml0KSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHZpZXcuZ2V0VWludDMyKG9mZnNldClcbiAgICAgICAgICAgIG9mZnNldCArPSA0XG4gICAgICAgICAgICBjb25zdCBzaXplID0gdmlldy5nZXRVaW50MzIob2Zmc2V0KVxuICAgICAgICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsRW50aXRpZXNSZXNlcnZlZCA9IHZpZXcuZ2V0VWludDMyKG9mZnNldClcbiAgICAgICAgICAgIG9mZnNldCArPSA0XG4gICAgICAgICAgICByZXNvbHZlKGNyZWF0ZU5ldHdvcmtNYW5hZ2VyKGxvY2FsRW50aXRpZXNSZXNlcnZlZCwgW3N0YXJ0LCBzdGFydCArIHNpemVdKSlcbiAgICAgICAgICAgIG1lc3NhZ2VzVG9Qcm9jZXNzLnB1c2goci5zdWJhcnJheShvZmZzZXQpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3cy5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICByZWplY3QoZSlcbiAgICAgIH1cbiAgICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3NvY2tldCBjbG9zZWQnKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlamVjdChlcnIpXG4gICAgfVxuICB9KVxufVxuIl19
|
@@ -1,10 +0,0 @@
|
|
1
|
-
import { NetworkManager, ServerTransportConfig } from './types';
|
2
|
-
import { ClientTransportConfig } from './client';
|
3
|
-
export { NetworkManager } from './types';
|
4
|
-
export type NetworkTransportConfig = ClientTransportConfig & Partial<ServerTransportConfig>;
|
5
|
-
export declare let connected: boolean;
|
6
|
-
export declare let reservedLocalEntities: number;
|
7
|
-
export declare function createNetworkManager(config: NetworkTransportConfig): Promise<NetworkManager>;
|
8
|
-
export declare const PlayersConnected: import("@dcl/ecs").MapComponentDefinition<import("@dcl/ecs").MapResult<{
|
9
|
-
usersId: import("@dcl/ecs").ISchema<string[]>;
|
10
|
-
}>>;
|
@@ -1,29 +0,0 @@
|
|
1
|
-
import { isServer } from '~system/EngineApi';
|
2
|
-
import { Schemas, engine } from '@dcl/ecs';
|
3
|
-
import { createServerTransport } from './server';
|
4
|
-
import { createClientTransport } from './client';
|
5
|
-
export let connected = false;
|
6
|
-
const DEFAULT_NETWORK_ENTITY_LIMIT_SERVER = 512;
|
7
|
-
const DEFAULT_NETWORK_ENTITY_LIMIT_CLIENT = 100;
|
8
|
-
const DEFAULT_RESERVED_LOCAL_ENTITIES = 2560;
|
9
|
-
export let reservedLocalEntities;
|
10
|
-
export async function createNetworkManager(config) {
|
11
|
-
if (connected) {
|
12
|
-
throw new Error('Transport is already created');
|
13
|
-
}
|
14
|
-
const serverConfig = {
|
15
|
-
networkEntitiesLimit: config.networkEntitiesLimit ?? {
|
16
|
-
serverLimit: DEFAULT_NETWORK_ENTITY_LIMIT_SERVER,
|
17
|
-
clientLimit: DEFAULT_NETWORK_ENTITY_LIMIT_CLIENT
|
18
|
-
},
|
19
|
-
reservedLocalEntities: config.reservedLocalEntities || DEFAULT_RESERVED_LOCAL_ENTITIES
|
20
|
-
};
|
21
|
-
reservedLocalEntities = serverConfig.reservedLocalEntities;
|
22
|
-
const networkFactory = isServer && (await isServer({})).isServer ? createServerTransport(serverConfig) : createClientTransport(config);
|
23
|
-
connected = true;
|
24
|
-
return networkFactory;
|
25
|
-
}
|
26
|
-
export const PlayersConnected = engine.defineComponent('chore:network:players', {
|
27
|
-
usersId: Schemas.Array(Schemas.String)
|
28
|
-
});
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay10cmFuc3BvcnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNoRCxPQUFPLEVBQXlCLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBTXZFLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUE7QUFFNUIsTUFBTSxtQ0FBbUMsR0FBRyxHQUFHLENBQUE7QUFDL0MsTUFBTSxtQ0FBbUMsR0FBRyxHQUFHLENBQUE7QUFDL0MsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLENBQUE7QUFFNUMsTUFBTSxDQUFDLElBQUkscUJBQTZCLENBQUE7QUFLeEMsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxNQUE4QjtJQUN2RSxJQUFJLFNBQVMsRUFBRTtRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtLQUNoRDtJQUVELE1BQU0sWUFBWSxHQUFHO1FBQ25CLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSTtZQUNuRCxXQUFXLEVBQUUsbUNBQW1DO1lBQ2hELFdBQVcsRUFBRSxtQ0FBbUM7U0FDakQ7UUFDRCxxQkFBcUIsRUFBRSxNQUFNLENBQUMscUJBQXFCLElBQUksK0JBQStCO0tBQ3ZGLENBQUE7SUFDRCxxQkFBcUIsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUE7SUFFMUQsTUFBTSxjQUFjLEdBQ2xCLFFBQVEsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDakgsU0FBUyxHQUFHLElBQUksQ0FBQTtJQUNoQixPQUFPLGNBQWMsQ0FBQTtBQUN2QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRTtJQUM5RSxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0NBQ3ZDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU2VydmVyIH0gZnJvbSAnfnN5c3RlbS9FbmdpbmVBcGknXG5cbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBTZXJ2ZXJUcmFuc3BvcnRDb25maWcgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgU2NoZW1hcywgZW5naW5lIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXJUcmFuc3BvcnQgfSBmcm9tICcuL3NlcnZlcidcbmltcG9ydCB7IENsaWVudFRyYW5zcG9ydENvbmZpZywgY3JlYXRlQ2xpZW50VHJhbnNwb3J0IH0gZnJvbSAnLi9jbGllbnQnXG5cbmV4cG9ydCB7IE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IHR5cGUgTmV0d29ya1RyYW5zcG9ydENvbmZpZyA9IENsaWVudFRyYW5zcG9ydENvbmZpZyAmIFBhcnRpYWw8U2VydmVyVHJhbnNwb3J0Q29uZmlnPlxuXG5leHBvcnQgbGV0IGNvbm5lY3RlZCA9IGZhbHNlXG5cbmNvbnN0IERFRkFVTFRfTkVUV09SS19FTlRJVFlfTElNSVRfU0VSVkVSID0gNTEyXG5jb25zdCBERUZBVUxUX05FVFdPUktfRU5USVRZX0xJTUlUX0NMSUVOVCA9IDEwMFxuY29uc3QgREVGQVVMVF9SRVNFUlZFRF9MT0NBTF9FTlRJVElFUyA9IDI1NjBcblxuZXhwb3J0IGxldCByZXNlcnZlZExvY2FsRW50aXRpZXM6IG51bWJlclxuLyoqXG4gKiBAYWxwaGFcbiAqIENvbm5lY3QgdG8gQ1JEVCBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ldHdvcmtNYW5hZ2VyKGNvbmZpZzogTmV0d29ya1RyYW5zcG9ydENvbmZpZyk6IFByb21pc2U8TmV0d29ya01hbmFnZXI+IHtcbiAgaWYgKGNvbm5lY3RlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNwb3J0IGlzIGFscmVhZHkgY3JlYXRlZCcpXG4gIH1cblxuICBjb25zdCBzZXJ2ZXJDb25maWcgPSB7XG4gICAgbmV0d29ya0VudGl0aWVzTGltaXQ6IGNvbmZpZy5uZXR3b3JrRW50aXRpZXNMaW1pdCA/PyB7XG4gICAgICBzZXJ2ZXJMaW1pdDogREVGQVVMVF9ORVRXT1JLX0VOVElUWV9MSU1JVF9TRVJWRVIsXG4gICAgICBjbGllbnRMaW1pdDogREVGQVVMVF9ORVRXT1JLX0VOVElUWV9MSU1JVF9DTElFTlRcbiAgICB9LFxuICAgIHJlc2VydmVkTG9jYWxFbnRpdGllczogY29uZmlnLnJlc2VydmVkTG9jYWxFbnRpdGllcyB8fCBERUZBVUxUX1JFU0VSVkVEX0xPQ0FMX0VOVElUSUVTXG4gIH1cbiAgcmVzZXJ2ZWRMb2NhbEVudGl0aWVzID0gc2VydmVyQ29uZmlnLnJlc2VydmVkTG9jYWxFbnRpdGllc1xuXG4gIGNvbnN0IG5ldHdvcmtGYWN0b3J5ID1cbiAgICBpc1NlcnZlciAmJiAoYXdhaXQgaXNTZXJ2ZXIoe30pKS5pc1NlcnZlciA/IGNyZWF0ZVNlcnZlclRyYW5zcG9ydChzZXJ2ZXJDb25maWcpIDogY3JlYXRlQ2xpZW50VHJhbnNwb3J0KGNvbmZpZylcbiAgY29ubmVjdGVkID0gdHJ1ZVxuICByZXR1cm4gbmV0d29ya0ZhY3Rvcnlcbn1cblxuZXhwb3J0IGNvbnN0IFBsYXllcnNDb25uZWN0ZWQgPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdjaG9yZTpuZXR3b3JrOnBsYXllcnMnLCB7XG4gIHVzZXJzSWQ6IFNjaGVtYXMuQXJyYXkoU2NoZW1hcy5TdHJpbmcpXG59KVxuIl19
|
@@ -1,62 +0,0 @@
|
|
1
|
-
import { engine, SyncComponents } from '@dcl/ecs';
|
2
|
-
import { engineToCrdt } from './state';
|
3
|
-
import { syncFilter, createNetworkManager } from './utils';
|
4
|
-
import { PlayersConnected } from '.';
|
5
|
-
export async function createServerTransport(config) {
|
6
|
-
const connectedClients = new Set();
|
7
|
-
engine.addTransport({
|
8
|
-
send: async (message) => {
|
9
|
-
if (message.byteLength) {
|
10
|
-
globalThis.updateCRDTState(engineToCrdt(engine));
|
11
|
-
}
|
12
|
-
},
|
13
|
-
filter: syncFilter
|
14
|
-
});
|
15
|
-
let time = 0;
|
16
|
-
function initialCrdtState(dt) {
|
17
|
-
time += dt;
|
18
|
-
if (time >= 1) {
|
19
|
-
globalThis.updateCRDTState(engineToCrdt(engine));
|
20
|
-
engine.removeSystem(initialCrdtState);
|
21
|
-
}
|
22
|
-
}
|
23
|
-
engine.addSystem(initialCrdtState);
|
24
|
-
globalThis.registerScene(config, (event) => {
|
25
|
-
const { type } = event;
|
26
|
-
if (type === 'open') {
|
27
|
-
const { clientId, client } = event;
|
28
|
-
const transport = {
|
29
|
-
filter: (message) => {
|
30
|
-
if (!connectedClients.has(clientId))
|
31
|
-
return false;
|
32
|
-
return syncFilter(message);
|
33
|
-
},
|
34
|
-
send: async (message) => {
|
35
|
-
if (message.byteLength > 0) {
|
36
|
-
await client.sendCrdtMessage(message);
|
37
|
-
}
|
38
|
-
if (transport.onmessage) {
|
39
|
-
const messages = client.getMessages();
|
40
|
-
for (const byteArray of messages) {
|
41
|
-
transport.onmessage(byteArray);
|
42
|
-
}
|
43
|
-
}
|
44
|
-
}
|
45
|
-
};
|
46
|
-
engine.addTransport(transport);
|
47
|
-
connectedClients.add(event.clientId);
|
48
|
-
}
|
49
|
-
else if (type === 'close') {
|
50
|
-
connectedClients.delete(event.clientId);
|
51
|
-
}
|
52
|
-
PlayersConnected.createOrReplace(players, { usersId: [...connectedClients.values()].map(String) });
|
53
|
-
});
|
54
|
-
const networkEntityFactory = createNetworkManager(config.reservedLocalEntities, [
|
55
|
-
config.reservedLocalEntities,
|
56
|
-
config.reservedLocalEntities + config.networkEntitiesLimit.serverLimit
|
57
|
-
]);
|
58
|
-
const players = networkEntityFactory.addEntity();
|
59
|
-
SyncComponents.create(players, { componentIds: [PlayersConnected.componentId] });
|
60
|
-
return networkEntityFactory;
|
61
|
-
}
|
62
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25ldHdvcmstdHJhbnNwb3J0L3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBYSxNQUFNLFVBQVUsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQUMsTUFBNkI7SUFDdkUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO0lBQzFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDbEIsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3RCLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7YUFDakQ7UUFDSCxDQUFDO1FBQ0QsTUFBTSxFQUFFLFVBQVU7S0FDbkIsQ0FBQyxDQUFBO0lBRUYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0lBQ1osU0FBUyxnQkFBZ0IsQ0FBQyxFQUFVO1FBQ2xDLElBQUksSUFBSSxFQUFFLENBQUE7UUFDVixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDYixVQUFVLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDbEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUN6QyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNuQixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQTtZQUNsQyxNQUFNLFNBQVMsR0FBYztnQkFDM0IsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFBO29CQUNqRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDNUIsQ0FBQztnQkFDRCxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUN0QixJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO3dCQUMxQixNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7cUJBQ3RDO29CQUVELElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTt3QkFDdkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO3dCQUNyQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsRUFBRTs0QkFDaEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTt5QkFDL0I7cUJBQ0Y7Z0JBQ0gsQ0FBQzthQUNGLENBQUE7WUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzlCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7U0FDckM7YUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDM0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtTQUN4QztRQUNELGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNwRyxDQUFDLENBQUMsQ0FBQTtJQUVGLE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFO1FBQzlFLE1BQU0sQ0FBQyxxQkFBcUI7UUFDNUIsTUFBTSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXO0tBQ3ZFLENBQUMsQ0FBQTtJQUNGLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2hELGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLE9BQU8sb0JBQW9CLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuZ2luZSwgU3luY0NvbXBvbmVudHMsIFRyYW5zcG9ydCB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgZW5naW5lVG9DcmR0IH0gZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCB7IHN5bmNGaWx0ZXIsIGNyZWF0ZU5ldHdvcmtNYW5hZ2VyIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBTZXJ2ZXJUcmFuc3BvcnRDb25maWcgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgUGxheWVyc0Nvbm5lY3RlZCB9IGZyb20gJy4nXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZXJUcmFuc3BvcnQoY29uZmlnOiBTZXJ2ZXJUcmFuc3BvcnRDb25maWcpOiBQcm9taXNlPE5ldHdvcmtNYW5hZ2VyPiB7XG4gIGNvbnN0IGNvbm5lY3RlZENsaWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBlbmdpbmUuYWRkVHJhbnNwb3J0KHtcbiAgICBzZW5kOiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UuYnl0ZUxlbmd0aCkge1xuICAgICAgICBnbG9iYWxUaGlzLnVwZGF0ZUNSRFRTdGF0ZShlbmdpbmVUb0NyZHQoZW5naW5lKSlcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbHRlcjogc3luY0ZpbHRlclxuICB9KVxuXG4gIGxldCB0aW1lID0gMFxuICBmdW5jdGlvbiBpbml0aWFsQ3JkdFN0YXRlKGR0OiBudW1iZXIpIHtcbiAgICB0aW1lICs9IGR0XG4gICAgaWYgKHRpbWUgPj0gMSkge1xuICAgICAgZ2xvYmFsVGhpcy51cGRhdGVDUkRUU3RhdGUoZW5naW5lVG9DcmR0KGVuZ2luZSkpXG4gICAgICBlbmdpbmUucmVtb3ZlU3lzdGVtKGluaXRpYWxDcmR0U3RhdGUpXG4gICAgfVxuICB9XG5cbiAgZW5naW5lLmFkZFN5c3RlbShpbml0aWFsQ3JkdFN0YXRlKVxuICBnbG9iYWxUaGlzLnJlZ2lzdGVyU2NlbmUoY29uZmlnLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50XG4gICAgaWYgKHR5cGUgPT09ICdvcGVuJykge1xuICAgICAgY29uc3QgeyBjbGllbnRJZCwgY2xpZW50IH0gPSBldmVudFxuICAgICAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgICAgIGZpbHRlcjogKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbm5lY3RlZENsaWVudHMuaGFzKGNsaWVudElkKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHN5bmNGaWx0ZXIobWVzc2FnZSlcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZDogYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBpZiAobWVzc2FnZS5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmRDcmR0TWVzc2FnZShtZXNzYWdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmFuc3BvcnQub25tZXNzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGNsaWVudC5nZXRNZXNzYWdlcygpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJ5dGVBcnJheSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgICAgICB0cmFuc3BvcnQub25tZXNzYWdlKGJ5dGVBcnJheSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5naW5lLmFkZFRyYW5zcG9ydCh0cmFuc3BvcnQpXG4gICAgICBjb25uZWN0ZWRDbGllbnRzLmFkZChldmVudC5jbGllbnRJZClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIGNvbm5lY3RlZENsaWVudHMuZGVsZXRlKGV2ZW50LmNsaWVudElkKVxuICAgIH1cbiAgICBQbGF5ZXJzQ29ubmVjdGVkLmNyZWF0ZU9yUmVwbGFjZShwbGF5ZXJzLCB7IHVzZXJzSWQ6IFsuLi5jb25uZWN0ZWRDbGllbnRzLnZhbHVlcygpXS5tYXAoU3RyaW5nKSB9KVxuICB9KVxuXG4gIGNvbnN0IG5ldHdvcmtFbnRpdHlGYWN0b3J5ID0gY3JlYXRlTmV0d29ya01hbmFnZXIoY29uZmlnLnJlc2VydmVkTG9jYWxFbnRpdGllcywgW1xuICAgIGNvbmZpZy5yZXNlcnZlZExvY2FsRW50aXRpZXMsXG4gICAgY29uZmlnLnJlc2VydmVkTG9jYWxFbnRpdGllcyArIGNvbmZpZy5uZXR3b3JrRW50aXRpZXNMaW1pdC5zZXJ2ZXJMaW1pdFxuICBdKVxuICBjb25zdCBwbGF5ZXJzID0gbmV0d29ya0VudGl0eUZhY3RvcnkuYWRkRW50aXR5KClcbiAgU3luY0NvbXBvbmVudHMuY3JlYXRlKHBsYXllcnMsIHsgY29tcG9uZW50SWRzOiBbUGxheWVyc0Nvbm5lY3RlZC5jb21wb25lbnRJZF0gfSlcbiAgcmV0dXJuIG5ldHdvcmtFbnRpdHlGYWN0b3J5XG59XG4iXX0=
|
@@ -1,11 +0,0 @@
|
|
1
|
-
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
2
|
-
import { SyncComponents } from '@dcl/ecs';
|
3
|
-
export function engineToCrdt(engine) {
|
4
|
-
const crdtBuffer = new ReadWriteByteBuffer();
|
5
|
-
const syncEntities = new Set(Array.from(engine.getEntitiesWith(SyncComponents)).map(($) => $[0]));
|
6
|
-
for (const itComponentDefinition of engine.componentsIter()) {
|
7
|
-
itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => syncEntities.has(entity));
|
8
|
-
}
|
9
|
-
return crdtBuffer.toBinary();
|
10
|
-
}
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay10cmFuc3BvcnQvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUFXLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUVsRCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWU7SUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFBO0lBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVqRyxLQUFLLE1BQU0scUJBQXFCLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFO1FBQzNELHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0tBQzlGO0lBRUQsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7IElFbmdpbmUsIFN5bmNDb21wb25lbnRzIH0gZnJvbSAnQGRjbC9lY3MnXG5cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmVUb0NyZHQoZW5naW5lOiBJRW5naW5lKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNyZHRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IHN5bmNFbnRpdGllcyA9IG5ldyBTZXQoQXJyYXkuZnJvbShlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFN5bmNDb21wb25lbnRzKSkubWFwKCgkKSA9PiAkWzBdKSlcblxuICBmb3IgKGNvbnN0IGl0Q29tcG9uZW50RGVmaW5pdGlvbiBvZiBlbmdpbmUuY29tcG9uZW50c0l0ZXIoKSkge1xuICAgIGl0Q29tcG9uZW50RGVmaW5pdGlvbi5kdW1wQ3JkdFN0YXRlVG9CdWZmZXIoY3JkdEJ1ZmZlciwgKGVudGl0eSkgPT4gc3luY0VudGl0aWVzLmhhcyhlbnRpdHkpKVxuICB9XG5cbiAgcmV0dXJuIGNyZHRCdWZmZXIudG9CaW5hcnkoKVxufVxuIl19
|
@@ -1,36 +0,0 @@
|
|
1
|
-
/// <reference types="@dcl/js-runtime" />
|
2
|
-
import { Entity, engine } from '@dcl/ecs';
|
3
|
-
export type Socket = WebSocket & {
|
4
|
-
binaryType: string;
|
5
|
-
send(data: string | Uint8Array): void;
|
6
|
-
};
|
7
|
-
export type NetworkManager = {
|
8
|
-
addEntity(theEngine: typeof engine): Entity;
|
9
|
-
};
|
10
|
-
export declare enum MessageType {
|
11
|
-
Auth = 1,
|
12
|
-
Init = 2,
|
13
|
-
Crdt = 3
|
14
|
-
}
|
15
|
-
export type ServerTransportConfig = {
|
16
|
-
reservedLocalEntities: number;
|
17
|
-
networkEntitiesLimit: {
|
18
|
-
serverLimit: number;
|
19
|
-
clientLimit: number;
|
20
|
-
};
|
21
|
-
};
|
22
|
-
declare global {
|
23
|
-
type ClientEvent = {
|
24
|
-
type: 'open';
|
25
|
-
clientId: string;
|
26
|
-
client: {
|
27
|
-
sendCrdtMessage(message: Uint8Array): Promise<void>;
|
28
|
-
getMessages(): Uint8Array[];
|
29
|
-
};
|
30
|
-
} | {
|
31
|
-
type: 'close';
|
32
|
-
clientId: string;
|
33
|
-
};
|
34
|
-
var updateCRDTState: (crdt: Uint8Array) => void;
|
35
|
-
var registerScene: (serverConfig: ServerTransportConfig, fn: (event: ClientEvent) => void) => void;
|
36
|
-
}
|
@@ -1,7 +0,0 @@
|
|
1
|
-
export var MessageType;
|
2
|
-
(function (MessageType) {
|
3
|
-
MessageType[MessageType["Auth"] = 1] = "Auth";
|
4
|
-
MessageType[MessageType["Init"] = 2] = "Init";
|
5
|
-
MessageType[MessageType["Crdt"] = 3] = "Crdt";
|
6
|
-
})(MessageType || (MessageType = {}));
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay10cmFuc3BvcnQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxDQUFOLElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQiw2Q0FBUSxDQUFBO0lBQ1IsNkNBQVEsQ0FBQTtJQUNSLDZDQUFRLENBQUE7QUFDVixDQUFDLEVBSlcsV0FBVyxLQUFYLFdBQVcsUUFJdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIGVuZ2luZSB9IGZyb20gJ0BkY2wvZWNzJ1xuXG5leHBvcnQgdHlwZSBTb2NrZXQgPSBXZWJTb2NrZXQgJiB7XG4gIGJpbmFyeVR5cGU6IHN0cmluZ1xuICBzZW5kKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIE5ldHdvcmtNYW5hZ2VyID0ge1xuICBhZGRFbnRpdHkodGhlRW5naW5lOiB0eXBlb2YgZW5naW5lKTogRW50aXR5XG59XG5cbmV4cG9ydCBlbnVtIE1lc3NhZ2VUeXBlIHtcbiAgQXV0aCA9IDEsXG4gIEluaXQgPSAyLFxuICBDcmR0ID0gM1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJUcmFuc3BvcnRDb25maWcgPSB7XG4gIHJlc2VydmVkTG9jYWxFbnRpdGllczogbnVtYmVyXG4gIG5ldHdvcmtFbnRpdGllc0xpbWl0OiB7XG4gICAgc2VydmVyTGltaXQ6IG51bWJlclxuICAgIGNsaWVudExpbWl0OiBudW1iZXJcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHR5cGUgQ2xpZW50RXZlbnQgPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnb3BlbidcbiAgICAgICAgY2xpZW50SWQ6IHN0cmluZ1xuICAgICAgICBjbGllbnQ6IHtcbiAgICAgICAgICBzZW5kQ3JkdE1lc3NhZ2UobWVzc2FnZTogVWludDhBcnJheSk6IFByb21pc2U8dm9pZD5cbiAgICAgICAgICBnZXRNZXNzYWdlcygpOiBVaW50OEFycmF5W11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIHwgeyB0eXBlOiAnY2xvc2UnOyBjbGllbnRJZDogc3RyaW5nIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuICB2YXIgdXBkYXRlQ1JEVFN0YXRlOiAoY3JkdDogVWludDhBcnJheSkgPT4gdm9pZFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdmFyXG4gIHZhciByZWdpc3RlclNjZW5lOiAoc2VydmVyQ29uZmlnOiBTZXJ2ZXJUcmFuc3BvcnRDb25maWcsIGZuOiAoZXZlbnQ6IENsaWVudEV2ZW50KSA9PiB2b2lkKSA9PiB2b2lkXG59XG4iXX0=
|
@@ -1,8 +0,0 @@
|
|
1
|
-
import { TransportMessage } from '@dcl/ecs';
|
2
|
-
import { MessageType } from './types';
|
3
|
-
export declare function encodeString(s: string): Uint8Array;
|
4
|
-
export declare function craftMessage(msgType: MessageType, payload: Uint8Array): Uint8Array;
|
5
|
-
export declare function createNetworkManager(reservedLocalEntities: number, range: [number, number]): {
|
6
|
-
addEntity: () => import("@dcl/ecs").Entity;
|
7
|
-
};
|
8
|
-
export declare function syncFilter(message: Omit<TransportMessage, 'messageBuffer'>): boolean;
|
@@ -1,46 +0,0 @@
|
|
1
|
-
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
2
|
-
import { engine, PointerEventsResult, RESERVED_STATIC_ENTITIES, SyncComponents, CrdtMessageType, EntityUtils, GltfContainerLoadingState } from '@dcl/ecs';
|
3
|
-
import { connected, reservedLocalEntities } from '.';
|
4
|
-
export function encodeString(s) {
|
5
|
-
const buffer = new ReadWriteByteBuffer();
|
6
|
-
buffer.writeUtf8String(s);
|
7
|
-
return buffer.readBuffer();
|
8
|
-
}
|
9
|
-
export function craftMessage(msgType, payload) {
|
10
|
-
const msg = new Uint8Array(payload.byteLength + 1);
|
11
|
-
msg.set([msgType]);
|
12
|
-
msg.set(payload, 1);
|
13
|
-
return msg;
|
14
|
-
}
|
15
|
-
export function createNetworkManager(reservedLocalEntities, range) {
|
16
|
-
return engine.addNetworkManager(reservedLocalEntities, range);
|
17
|
-
}
|
18
|
-
export function syncFilter(message) {
|
19
|
-
if (!connected)
|
20
|
-
return false;
|
21
|
-
const componentId = message.componentId;
|
22
|
-
if ([PointerEventsResult.componentId, GltfContainerLoadingState.componentId].includes(componentId)) {
|
23
|
-
return false;
|
24
|
-
}
|
25
|
-
const [entityId] = EntityUtils.fromEntityId(message.entityId);
|
26
|
-
if (entityId < RESERVED_STATIC_ENTITIES) {
|
27
|
-
return false;
|
28
|
-
}
|
29
|
-
if (entityId < reservedLocalEntities) {
|
30
|
-
return false;
|
31
|
-
}
|
32
|
-
if (message.type === CrdtMessageType.DELETE_ENTITY) {
|
33
|
-
return true;
|
34
|
-
}
|
35
|
-
if (message.timestamp <= 1) {
|
36
|
-
return true;
|
37
|
-
}
|
38
|
-
const sync = SyncComponents.getOrNull(message.entityId);
|
39
|
-
if (!sync)
|
40
|
-
return false;
|
41
|
-
if (message.componentId && sync.componentIds.includes(message.componentId)) {
|
42
|
-
return true;
|
43
|
-
}
|
44
|
-
return false;
|
45
|
-
}
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay10cmFuc3BvcnQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUNMLE1BQU0sRUFFTixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsV0FBVyxFQUNYLHlCQUF5QixFQUMxQixNQUFNLFVBQVUsQ0FBQTtBQUVqQixPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sR0FBRyxDQUFBO0FBRXBELE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7SUFDeEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6QixPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFvQixFQUFFLE9BQW1CO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbkIsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLHFCQUE2QixFQUFFLEtBQXVCO0lBQ3pGLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQy9ELENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWdEO0lBQ3pFLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDNUIsTUFBTSxXQUFXLEdBQUksT0FBZSxDQUFDLFdBQVcsQ0FBQTtJQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUNsRyxPQUFPLEtBQUssQ0FBQTtLQUNiO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTdELElBQUksUUFBUSxHQUFHLHdCQUF3QixFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFBO0tBQ2I7SUFFRCxJQUFJLFFBQVEsR0FBRyxxQkFBcUIsRUFBRTtRQUNwQyxPQUFPLEtBQUssQ0FBQTtLQUNiO0lBR0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxhQUFhLEVBQUU7UUFDbEQsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUdELElBQUssT0FBZSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7UUFDbkMsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUVELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZELElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFdkIsSUFBSyxPQUFlLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFFLE9BQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUM1RixPQUFPLElBQUksQ0FBQTtLQUNaO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHtcbiAgZW5naW5lLFxuICBUcmFuc3BvcnRNZXNzYWdlLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSRVNFUlZFRF9TVEFUSUNfRU5USVRJRVMsXG4gIFN5bmNDb21wb25lbnRzLFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIEVudGl0eVV0aWxzLFxuICBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlXG59IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgY29ubmVjdGVkLCByZXNlcnZlZExvY2FsRW50aXRpZXMgfSBmcm9tICcuJ1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGJ1ZmZlci53cml0ZVV0ZjhTdHJpbmcocylcbiAgcmV0dXJuIGJ1ZmZlci5yZWFkQnVmZmVyKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyYWZ0TWVzc2FnZShtc2dUeXBlOiBNZXNzYWdlVHlwZSwgcGF5bG9hZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBtc2cgPSBuZXcgVWludDhBcnJheShwYXlsb2FkLmJ5dGVMZW5ndGggKyAxKVxuICBtc2cuc2V0KFttc2dUeXBlXSlcbiAgbXNnLnNldChwYXlsb2FkLCAxKVxuICByZXR1cm4gbXNnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXR3b3JrTWFuYWdlcihyZXNlcnZlZExvY2FsRW50aXRpZXM6IG51bWJlciwgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgcmV0dXJuIGVuZ2luZS5hZGROZXR3b3JrTWFuYWdlcihyZXNlcnZlZExvY2FsRW50aXRpZXMsIHJhbmdlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3luY0ZpbHRlcihtZXNzYWdlOiBPbWl0PFRyYW5zcG9ydE1lc3NhZ2UsICdtZXNzYWdlQnVmZmVyJz4pIHtcbiAgaWYgKCFjb25uZWN0ZWQpIHJldHVybiBmYWxzZVxuICBjb25zdCBjb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIGFueSkuY29tcG9uZW50SWRcbiAgaWYgKFtQb2ludGVyRXZlbnRzUmVzdWx0LmNvbXBvbmVudElkLCBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLmNvbXBvbmVudElkXS5pbmNsdWRlcyhjb21wb25lbnRJZCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IFtlbnRpdHlJZF0gPSBFbnRpdHlVdGlscy5mcm9tRW50aXR5SWQobWVzc2FnZS5lbnRpdHlJZClcbiAgLy8gZmlsdGVyIG1lc3NhZ2VzIGZyb20gcmVzZXJ2ZWQgZW50aXRpZXMuXG4gIGlmIChlbnRpdHlJZCA8IFJFU0VSVkVEX1NUQVRJQ19FTlRJVElFUykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGVudGl0eUlkIDwgcmVzZXJ2ZWRMb2NhbEVudGl0aWVzKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBOZXR3b3JrIEVudGl0eSBBbHdheXNcbiAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gVEJEOiBGaXJzdCBjb21wb25lbnRcbiAgaWYgKChtZXNzYWdlIGFzIGFueSkudGltZXN0YW1wIDw9IDEpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3Qgc3luYyA9IFN5bmNDb21wb25lbnRzLmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuICBpZiAoIXN5bmMpIHJldHVybiBmYWxzZVxuXG4gIGlmICgobWVzc2FnZSBhcyBhbnkpLmNvbXBvbmVudElkICYmIHN5bmMuY29tcG9uZW50SWRzLmluY2x1ZGVzKChtZXNzYWdlIGFzIGFueSkuY29tcG9uZW50SWQpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIl19
|