@dcl/sdk 7.3.31 → 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.
Files changed (46) hide show
  1. package/internal/transports/logger.js +7 -4
  2. package/internal/transports/rendererTransport.js +3 -2
  3. package/message-bus.js +8 -6
  4. package/network/binary-message-bus.d.ts +18 -0
  5. package/network/binary-message-bus.js +68 -0
  6. package/network/entities.d.ts +11 -0
  7. package/network/entities.js +77 -0
  8. package/network/filter.d.ts +2 -0
  9. package/network/filter.js +37 -0
  10. package/network/index.d.ts +2 -0
  11. package/network/index.js +7 -0
  12. package/network/message-bus-sync.d.ts +17 -0
  13. package/network/message-bus-sync.js +52 -0
  14. package/network/state.js +39 -0
  15. package/network/utils.d.ts +18 -0
  16. package/network/utils.js +69 -0
  17. package/package.json +6 -6
  18. package/src/internal/transports/logger.ts +9 -4
  19. package/src/internal/transports/rendererTransport.ts +2 -1
  20. package/src/message-bus.ts +7 -9
  21. package/src/network/README.md +122 -0
  22. package/src/network/binary-message-bus.ts +72 -0
  23. package/src/network/entities.ts +132 -0
  24. package/src/network/filter.ts +64 -0
  25. package/src/network/index.ts +13 -0
  26. package/src/network/message-bus-sync.ts +97 -0
  27. package/src/network/state.ts +65 -0
  28. package/src/network/utils.ts +145 -0
  29. package/network-transport/client.d.ts +0 -5
  30. package/network-transport/client.js +0 -68
  31. package/network-transport/index.d.ts +0 -10
  32. package/network-transport/index.js +0 -29
  33. package/network-transport/server.d.ts +0 -2
  34. package/network-transport/server.js +0 -62
  35. package/network-transport/state.js +0 -11
  36. package/network-transport/types.d.ts +0 -36
  37. package/network-transport/types.js +0 -7
  38. package/network-transport/utils.d.ts +0 -8
  39. package/network-transport/utils.js +0 -46
  40. package/src/network-transport/client.ts +0 -77
  41. package/src/network-transport/index.ts +0 -45
  42. package/src/network-transport/server.ts +0 -66
  43. package/src/network-transport/state.ts +0 -13
  44. package/src/network-transport/types.ts +0 -41
  45. package/src/network-transport/utils.ts +0 -67
  46. /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,5 +0,0 @@
1
- import { NetworkManager } from './types';
2
- export type ClientTransportConfig = {
3
- serverUrl: string;
4
- };
5
- export declare function createClientTransport({ serverUrl }: ClientTransportConfig): Promise<NetworkManager>;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25ldHdvcmstdHJhbnNwb3J0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEYsT0FBTyxFQUFhLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBMEIsTUFBTSxTQUFTLENBQUE7QUFNN0QsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxFQUFFLFNBQVMsRUFBeUI7SUFDOUUsTUFBTSxpQkFBaUIsR0FBaUIsRUFBRSxDQUFBO0lBRTFDLE9BQU8sSUFBSSxPQUFPLENBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JELElBQUk7WUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQVcsQ0FBQTtZQUM3QyxFQUFFLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQTtZQUU3QixFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUE7Z0JBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFDL0UsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFFOUUsTUFBTSxTQUFT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ZU5ldHdvcmtNYW5hZ2VyLCBlbmNvZGVTdHJpbmcsIHN5bmNGaWx0ZXIgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgVHJhbnNwb3J0LCBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tICd+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,2 +0,0 @@
1
- import { NetworkManager, ServerTransportConfig } from './types';
2
- export declare function createServerTransport(config: ServerTransportConfig): Promise<NetworkManager>;
@@ -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