Skip to content

Commit

Permalink
Update Chat Methods (#405)
Browse files Browse the repository at this point in the history
* rename getState and setState to getMemberState and setMemberState

* make channels optional in chat.member.get_state

* update member object payload

* update event payloads used in tests

* allow memberId to be passed to setMemberState

* update chat Member and Message contracts

* add changeset

* memberId required and updated playground chat
  • Loading branch information
Edoardo Gallo authored Jan 13, 2022
1 parent 7c688bb commit 6d234cc
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 81 deletions.
6 changes: 6 additions & 0 deletions .changeset/gorgeous-lies-kneel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@signalwire/core': patch
'@signalwire/js': patch
---

[internal] Review chat payloads and interfaces
24 changes: 22 additions & 2 deletions internal/playground-js/src/chat/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,37 @@ window.connect = async ({ channels, host, token }) => {

chat.on('message', (message) => {
console.debug('Inbound Message', message)

// message.id
// message.channel
// message.member
// message.member.id
// message.member.channel
// message.member.state
// message.publishedAt
// message.content
// message.meta // {}
_appendMessage(message)
})

chat.on('member.joined', (member) => {
console.debug('Member Joined a channel', member.id, member.channel)
console.debug(
'Member Joined a channel',
member.id,
member.channel,
member.state
)
})
chat.on('member.updated', (member) => {
console.debug('Member Updated', member.id, member.channel, member.state)
})
chat.on('member.left', (member) => {
console.debug('Member Left a channel', member.id, member.channel)
console.debug(
'Member Left a channel',
member.id,
member.channel,
member.state
)
})

await chat.subscribe(channels)
Expand Down
56 changes: 13 additions & 43 deletions packages/core/src/chat/BaseChat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ import type {
ChatChannel,
} from '../types/chat'

type ChatMemberEvent =
| ChatMemberJoinedEvent
| ChatMemberLeftEvent
| ChatMemberUpdatedEvent
export type BaseChatApiEventsHandlerMapping = Record<
ChatMessageEventName,
(message: ChatMessage) => void
Expand Down Expand Up @@ -133,50 +137,16 @@ export class BaseChatConsumer extends BaseConsumer<BaseChatApiEvents> {
},
],
[
['member.joined', 'member.left'],
['member.joined', 'member.left', 'member.updated'],
{
type: 'chatMessage',
instanceFactory: (
payload: ChatMemberJoinedEvent | ChatMemberLeftEvent
) => {
const { channel, member } = payload.params
const params = {
...toExternalJSON(member),
channel,
}
return new ChatMember(params)
},
payloadTransform: (
payload: ChatMemberJoinedEvent | ChatMemberLeftEvent
) => {
const { channel, member } = payload.params
return {
...toExternalJSON(member),
channel,
}
instanceFactory: (payload: ChatMemberEvent) => {
const { member } = payload.params
return new ChatMember(toExternalJSON(member))
},
},
],
[
['member.updated'],
{
type: 'chatMessage',
instanceFactory: (payload: ChatMemberUpdatedEvent) => {
const { channel, member, state = {} } = payload.params
const params = {
...toExternalJSON(member),
channel,
state,
}
return new ChatMember(params)
},
payloadTransform: (payload: ChatMemberUpdatedEvent) => {
const { channel, member, state = {} } = payload.params
return {
...toExternalJSON(member),
channel,
state,
}
payloadTransform: (payload: ChatMemberEvent) => {
const { member } = payload.params
return toExternalJSON(member)
},
},
],
Expand Down Expand Up @@ -235,8 +205,8 @@ export const BaseChatAPI = extendComponent<BaseChatConsumer, ChatMethods>(
publish: chatMethods.publish,
getMembers: chatMethods.getMembers,
getMessages: chatMethods.getMessages,
setState: chatMethods.setState,
getState: chatMethods.getState,
setMemberState: chatMethods.setMemberState,
getMemberState: chatMethods.getMemberState,
}
)

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/chat/ChatMember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ export class ChatMember implements ChatMemberContract {
}

get state(): any {
return this.payload?.state ?? {}
return this.payload.state ?? {}
}
}
6 changes: 3 additions & 3 deletions packages/core/src/chat/ChatMessage.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ChatMessageContract } from '..'
import { ChatMessageContract, ChatMemberContract } from '..'

export class ChatMessage implements ChatMessageContract {
constructor(private payload: ChatMessageContract) {}
Expand All @@ -7,8 +7,8 @@ export class ChatMessage implements ChatMessageContract {
return this.payload.id
}

get senderId(): string {
return this.payload.senderId
get member(): ChatMemberContract {
return this.payload.member
}

get channel(): string {
Expand Down
13 changes: 8 additions & 5 deletions packages/core/src/chat/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,18 @@ export const getMembers = createChatMethod<{ members: any[] }>(
}),
}
)
export const setState = createChatMethod<any, void>('chat.presence.set_state', {
transformResolve: () => {},
})

/**
* Chat Member Methods
*/
export const getState = createChatMemberMethod<{ channels: any }>(
'chat.presence.get_state',
export const setMemberState = createChatMemberMethod<any, void>(
'chat.member.set_state',
{
transformResolve: () => {},
}
)
export const getMemberState = createChatMemberMethod<{ channels: any }>(
'chat.member.get_state',
{
transformResolve: (payload) => ({ channels: payload.channels }),
}
Expand Down
40 changes: 24 additions & 16 deletions packages/core/src/types/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,27 +23,33 @@ export type ChatEventNames = ChatMessageEventName | ChatMemberEventNames

export type ChatChannel = string | string[]

export interface ChatSubscribeParams {
message: any
channel: string
meta?: Record<any, any>
}
export interface ChatPublishParams {
message: any
channel: string
meta?: Record<any, any>
}
export interface ChatSetStateParams {
interface ChatSetMemberStateParams {
memberId: string
channels: ChatChannel
state: Record<any, any>
}
export interface ChatGetStateParams {
channels: ChatChannel
interface ChatGetMemberStateParams {
memberId: string
channels?: ChatChannel
}
export interface ChatGetMessagesParams {
interface ChatGetMessagesParams {
channel: string
cursor?: {
after?: string
before?: string
}
}
export interface ChatGetMembersParams {
interface ChatGetMembersParams {
channel: string
}
export interface ChatContract {
Expand All @@ -52,8 +58,8 @@ export interface ChatContract {
publish(params: ChatPublishParams): Promise<any>
getMessages(params: ChatGetMessagesParams): Promise<any>
getMembers(params: ChatGetMembersParams): Promise<any>
setState(params: ChatSetStateParams): Promise<any>
getState(params: ChatGetStateParams): Promise<any>
setMemberState(params: ChatSetMemberStateParams): Promise<any>
getMemberState(params: ChatGetMemberStateParams): Promise<any>
}

export type ChatEntity = OnlyStateProperties<ChatContract>
Expand All @@ -64,8 +70,8 @@ export type ChatMethods = Omit<

export interface ChatMessageContract {
id: string
senderId: string
channel: string
member: ChatMemberContract
content: any
publishedAt: Date
meta?: any
Expand All @@ -78,17 +84,20 @@ export type InternalChatMessageEntity = {
[K in NonNullable<
keyof ChatMessageEntity
> as CamelToSnakeCase<K>]: ChatMessageEntity[K]
}
} & { member: InternalChatMemberEntity }

export interface ChatMemberContract {
id: string
channel: string
state?: Record<any, any>
state: Record<any, any>
}

// Not using OnlyStateProperties because Member for now is just an id..
export interface InternalChatMemberEntity {
id: string
export type ChatMemberEntity = OnlyStateProperties<ChatMemberContract>

export type InternalChatMemberEntity = {
[K in NonNullable<
keyof ChatMemberEntity
> as CamelToSnakeCase<K>]: ChatMemberEntity[K]
}

/**
Expand Down Expand Up @@ -133,7 +142,6 @@ export interface ChatMemberJoinedEvent extends SwEvent {
export interface ChatMemberUpdatedEventParams {
channel: string
member: InternalChatMemberEntity
state: Record<any, any>
}

export interface ChatMemberUpdatedEvent extends SwEvent {
Expand Down Expand Up @@ -176,8 +184,8 @@ export type ChatJSONRPCMethod =
| 'chat.subscribe'
| 'chat.publish'
| 'chat.unsubscribe'
| 'chat.presence.set_state'
| 'chat.presence.get_state'
| 'chat.member.set_state'
| 'chat.member.get_state'
| 'chat.members.get'
| 'chat.messages.get'

Expand Down
Loading

0 comments on commit 6d234cc

Please sign in to comment.