Мои настройки:
Пользователи, подключенные к Firebase через WEB.
Я пытаюсь найти способ сообщить пользователю, что документ базы данных был отредактирован. Как мне этого добиться?
Я пытаюсь создать систему организации матчей, но я не уверен, как использовать Cloud Functions и Firestore для достижения этой цели.
Пользователь A начинает поиск совпадений и обнаруживает, что ни у одного из игроков нет доступных документов, поэтому он начинает с создания документа в коллекции «совпадений», и в этом документе всего 1 игрок, это происходит посредством транзакции во избежание проблем параллелизма (отдельная проблема). Затем пользователь A ожидает присоединения другого пользователя.
Пользователь B пытается найти совпадения и находит документ в коллекции «совпадений», и в этом документе достаточно места (максимум 2 игрока), чтобы пользователь B мог присоединиться, и ответ в HTTP-запросе отправляет ответ пользователю B с идентификатором документа. и другой идентификатор пользователя в комнате.
Моя проблема в том, что я не знаю, как уведомить пользователя А о новом пользователе, который присоединился к комнате.
Между тем, я не могу использовать Web Push, так как он не поддерживается в iOS и других версиях браузера.
Я пробовал Web Push, он не работает. И я использую Firebase Web SDK.
db.runTransaction(async t=>{
// console.log('S T A R T - T R A N S A C T I O N ', vUser);
const dref = await db.collection('matches').where('totalPlayers', '==', 1).get();
if (dref.size > 0) {
const d = await t.get(dref.docs[0].ref);
// console.log(d.data());
let doc = d;
// console.log('G O T - D O C for ', vUser);
let data = doc.data();
if (data.totalPlayers + 1 > 2) {
return Promise.reject('too many players');
}
else {
data.totalPlayers+=1;
data.players.push(vUser);
// console.log({_id:doc.id});
let returnData = {_id:doc.id, data:data};
t.update(doc.ref, data);
return Promise.resolve(returnData);
}
}
else {
let docData = {
'players': [vUser], totalPlayers: 1,
created: admin.firestore.Timestamp.now()._seconds
};
let matchRef = db.collection('matches').doc();
t.set(matchRef, docData);
return Promise.resolve(docData);
});
}
}).then((result)=>{
console.log('transaction S U C C E S S ', vUser, result);
response.status(200).send(result);
}).catch(err=>{
console.log('transaction F A I L ', vUser, err);
})
}```