Skip to content

Commit

Permalink
$effects feature
Browse files Browse the repository at this point in the history
  • Loading branch information
RSamaium committed Jul 14, 2023
1 parent 3c43b7d commit 01b1bf1
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 5 deletions.
23 changes: 22 additions & 1 deletion sync-server/src/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ export class Room {
return obj.$default !== undefined ||
obj.$syncWithClient !== undefined ||
obj.$permanent !== undefined ||
obj.$validate !== undefined
obj.$validate !== undefined ||
obj.$effects !== undefined
}

static toDict(schema, room?) {
Expand Down Expand Up @@ -160,6 +161,26 @@ export class Room {
return true
}
if (infoDict) {
if (infoDict.$effects) {
for (let propEffect of infoDict.$effects) {
let pathEffect = ''
if (propEffect.startsWith('$this')) {
// replace last property in string. Example: users.test.name by users.test.fullname
if (p) {
const pSplit = p.split('.')
pSplit[pSplit.length - 1] = propEffect.replace('$this.', '')
pathEffect = pSplit.join('.')
}
else {
pathEffect = propEffect.replace('$this.', '')
}
}
else {
pathEffect = propEffect
}
set(self.memoryObject, pathEffect, get(room, pathEffect))
}
}
let newObj
if (Utils.isObject(infoDict) && val != null && !Room.hasExtraProp(infoDict)) {
newObj = Room.extractObjectOfRoom(val, infoDict)
Expand Down
95 changes: 91 additions & 4 deletions sync-server/tests/prop.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ test('Test with extra properties', async () => {
}
}
const value: any = await testSend(room)
expect(value[2].keys).toMatchObject({ a: { public: 5 }})
expect(value[2].keys).toMatchObject({ a: { public: 5 } })
})

test('Change with extra properties', async () => {
Expand All @@ -78,7 +78,7 @@ test('Change with extra properties', async () => {
private: 'other'
}
const value: any = await testSend(room)
expect(value[2].keys).toMatchObject({ a: { public: 10 }})
expect(value[2].keys).toMatchObject({ a: { public: 10 } })
})

describe('Snapshot', () => {
Expand All @@ -102,9 +102,8 @@ describe('Snapshot', () => {
}
}
room = World.addRoom('room', Room)

})

test('Snapshot Room', async () => {
await testSend(room)
const user = room.users['test']
Expand Down Expand Up @@ -135,4 +134,92 @@ describe('Snapshot', () => {
expect(snapshot.secret).toBe('aaa')
expect(snapshot.items[0]).toHaveProperty('info', 'bbb')
})
})

describe('Sync properties dependencies', () => {
test('dependencies is sync', () => {
class Room {
$schema = {
a: {
$effects: ['result']
},
b: Number
}

a = 1
b = 2

get result() {
return this.a + this.b
}
}
room = World.addRoom('room', Room)

return new Promise(async (resolve: any, reject) => {
await testSend(room)
const user = room.users['test']

room.a = 10

user._socket.emit = (ev, value) => {
try {
const object = value[2]
expect(object.result).toBeDefined()
expect(object.result).toBe(12)
resolve()
}
catch (e) {
reject(e)
}
}

World.send()
})
})

test('Test object dependencies', async () => {

class UserClass {
name = 'test'

get fullname() {
return this.name + ' yo'
}
}

World.setUserClass(UserClass)

class Room {
$schema = {
users: [{
name: {
$effects: ['$this.fullname']
}
}]
}
}
room = World.addRoom('room', Room)

return new Promise(async (resolve: any, reject) => {
await testSend(room)
const user = room.users['test']

user.name = 'frank'

user._socket.emit = (ev, value) => {
try {
const object = value[2].users.test
expect(object.fullname).toBeDefined()
expect(object.name).toBe('frank')
expect(object.fullname).toBe('frank yo')
resolve()
}
catch (e) {
reject(e)
}
}

World.send()
})
})
})

0 comments on commit 01b1bf1

Please sign in to comment.