import { WS } from '@fastify-modular/route'; import { pito } from 'pito'; import { NeedLogin } from '../defines'; import { EventChatPayload, EventPayload, EventSystemPayload } from './event'; // ============================================================================================= export const ConnectOption = pito.Obj({}); export type ConnectOption = pito.Type; // ============================================================================================= export const ConnectReceive = pito.Uobj('type') .case('broadcast', ({ roomId: pito.UUID(), content: pito.Str() })) // .case('message', pito.Obj({ content: pito.Str(), receiver: pito.Num() })) .end(); export type ConnectReceive = pito.Type; // ============================================================================================= export const ConnectSend = pito.Uobj('namespace') .case('chat', ({ msgId: pito.UUID(), roomId: pito.UUID(), event: EventChatPayload })) .case('system', ({ msgId: pito.UUID(), roomId: pito.UUID(), event: EventSystemPayload })) .end(); export type ConnectSend = pito.Type; // ============================================================================================= export const RoomDefine = pito.Uobj('type') .case('system', ({ roomId : pito.UUID(), userId : pito.Int(), title : pito.Str(), description: pito.Str(), })) .case('one-to-one', ({ roomId : pito.UUID(), title : pito.Str(), description: pito.Str(), userId0 : pito.Int(), userId1 : pito.Int(), })) .end(); export type RoomDefine = pito.Type; // ============================================================================================= export const Connect = WS('/api/v1/auth/connect', 'auth') .query(ConnectOption) .send(ConnectSend) .recv(ConnectReceive) .response({ 'subscribes': { args : [], return: pito.Arr(RoomDefine), }, 'connect': { args: [ pito.Uobj('target') .case('user', ({ userId: pito.Num() })) .end(), ], return: pito.Uobj('result') .case('ok', ({ value: RoomDefine })) .case('fail', ({ cause: pito.Ulit('connected', 'unknown'), })) .end(), }, 'disconnect': { args : [pito.UUID()], return: pito.Any(), }, 'listChat': { // roomId, option args: [pito.UUID(), pito.Obj({ pageSize: pito.Opt(pito.Int({ minimum: 0, maximum: 100 })), pageNo : pito.Opt(pito.Int({ minimum: 1 })), // limit: pito.Opt(pito.Int({ minimum: 1, maximum: 100 })), // offset: pito.Int({}) })], return: pito.Obj({ found: pito.Arr(EventPayload), }), }, }) .presets(NeedLogin) .build(); // =============================================================================================