@xrengine/server-core
Version:
Shared components for XREngine server
80 lines (68 loc) • 2.28 kB
text/typescript
import { OpenMatchTicket, OpenMatchTicketAssignment } from '@xrengine/matchmaking/src/interfaces'
async function waitAndGetMatchUser(app, ticketId, userId, timeout) {
return new Promise<any>((resolve, reject) => {
setTimeout(async () => {
const matchUserResult = await app.service('match-user').find({
query: {
ticketId,
userId
}
})
if (Array.isArray(matchUserResult) || matchUserResult.data.length === 0) {
resolve(null)
return
}
resolve(matchUserResult.data[0])
}, timeout)
})
}
export async function emulate_createTicket(gamemode: string): Promise<OpenMatchTicket> {
return { id: Math.random().toString(), search_fields: { tags: [gamemode] } } as OpenMatchTicket
}
export async function emulate_getTicket(app, ticketId, userId): Promise<OpenMatchTicket | void> {
const matchUserResult = await app.service('match-user').find({
query: {
ticketId,
userId
}
})
if (Array.isArray(matchUserResult) || matchUserResult.data.length === 0) {
return
}
const matchUser = matchUserResult.data[0]
return {
id: ticketId,
search_fields: {
tags: [matchUser.gamemode]
}
}
}
export async function emulate_getTicketsAssignment(app, ticketId, userId): Promise<OpenMatchTicketAssignment> {
// emulate response from open-match-api
const matchUser = await waitAndGetMatchUser(app, ticketId, userId, 50)
if (!matchUser) {
// throw new BadRequest('MatchUser not found. ticket is outdated?')
// FIXME: not a valid Error format
throw { code: 5, message: `Ticket id: ${ticketId} not found` }
}
const connection = Math.random().toString()
await app.service('match-user').patch(matchUser.id, {
connection
})
return new Promise<OpenMatchTicketAssignment>((resolve, reject) => {
setTimeout(async () => {
try {
await app.service('match-user').get(matchUser.id)
} catch (e) {
reject({ code: 5, message: `Ticket id: ${ticketId} not found` })
}
const assignment: OpenMatchTicketAssignment = {
connection: connection,
extensions: {
GameMode: { type_url: '', value: matchUser.gamemode }
}
}
resolve(assignment)
}, 2000)
})
}