Skip to content

Instantly share code, notes, and snippets.

@saroar
Last active October 27, 2020 17:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saroar/9c245201a1c4c0e717f8f0fbd76761c7 to your computer and use it in GitHub Desktop.
Save saroar/9c245201a1c4c0e717f8f0fbd76761c7 to your computer and use it in GitHub Desktop.
final class WebsocketClients {
let lock: Lock
var eventLoop: EventLoop
var allCliendts: [ObjectId: WebSocketClient]
let logger: Logger
func send(_ msg: Message.Item, req: Request) {
let chatClients = self.activeClients.compactMap { $0 as? ChatClient }
for client in chatClients where client.id != msg.sender!.id {
client.send(msg, req)
}
// should i move here
}
}
final class ChatClient: WebSocketClient, Hashable {
let logger: Logger = Logger(label: "ChatClient")
override init(id: ObjectId, socket: WebSocket) {
super.init(id: id, socket: socket)
}
....
// here i am creating multiple time msg
// if 3 uesr connect in chat room then in database create msg 3 time
func send(_ message: Message.Item, _ req: Request) {
guard req.loggedIn != false else {
logger.error("\(#line) Unauthorized send message")
return
}
///todo: will not create msg if messageBody will empty " " <-
let messageCreate = Message(message, senderId: req.payload.userId, receipientId: nil)
req.db.withConnection { _ in
messageCreate.save(on: req.db)
}.whenComplete { [self] res in
let success: Bool
switch res {
case .failure(let err):
self.logger.report(error: err)
success = false
case .success:
self.logger.info("success true")
success = true
}
messageCreate.isDelivered = success
messageCreate.update(on: req.db)
Message.query(on: req.db)
.with(\.$sender)
.with(\.$recipient)
.filter(\.$id == messageCreate.id!)
.first()
.unwrap(or: Abort(.notFound, reason: "No Message found! by id: \(id)"))
.map { original in
let message = ChatOutGoingEvent.message(original.response).jsonString
let lastMessage = ChatOutGoingEvent.conversation(original.response).jsonString
logger.info("\(#line): \(message)")
self.socket.send(message ?? "")
self.socket.send(lastMessage ?? "")
// if let msgJsonString = original.response.jsonString {
// logger.info("\(#line): \(original)")
// }
}
}
}
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment