Skip to content

Commit

Permalink
Refactor data models to improve type safety and code usability (#1064)
Browse files Browse the repository at this point in the history
* refactor ServerMessage type

* apply it to ClientMessage

* apply changes

* lfg

* refactoring Web3Request

* Web3Response

* help git

* improvements

* introducing SupportedWeb3Methods

* cleanup RelayMessage

* apply Web3Response changes

* no need to be exported RelayMessageType

* sync

* comment

* support case of request and response having different method

* consolidate RelayMessage

* wtf

* no error on relay

* fix provider

* cleaner

* rename relay message to be `WalletLinkEventData`

* fix tests

* revert rename

* clarify param

* apply change to selectProvider

* WalletLinkEventType

* cleanup

* fi xWalletUI

* cleanup

* apply to HTTP API
  • Loading branch information
bangtoven authored Nov 16, 2023
1 parent 23f4f9e commit 13f0b5a
Show file tree
Hide file tree
Showing 27 changed files with 764 additions and 1,104 deletions.
100 changes: 33 additions & 67 deletions packages/wallet-sdk/src/connection/ClientMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,70 +3,36 @@

import { IntNumber } from '../types';

export interface ClientMessage {
type: string;
id: IntNumber;
}

export interface ClientMessageHostSession extends ClientMessage {
type: 'HostSession';
sessionId: string;
sessionKey: string;
}

export function ClientMessageHostSession(
params: Omit<ClientMessageHostSession, 'type'>
): ClientMessageHostSession {
return { type: 'HostSession', ...params };
}

export interface ClientMessageIsLinked extends ClientMessage {
type: 'IsLinked';
sessionId: string;
}

export function ClientMessageIsLinked(
params: Omit<ClientMessageIsLinked, 'type'>
): ClientMessageIsLinked {
return { type: 'IsLinked', ...params };
}

export interface ClientMessageGetSessionConfig extends ClientMessage {
type: 'GetSessionConfig';
sessionId: string;
}

export function ClientMessageGetSessionConfig(
params: Omit<ClientMessageGetSessionConfig, 'type'>
): ClientMessageGetSessionConfig {
return { type: 'GetSessionConfig', ...params };
}

export interface ClientMessageSetSessionConfig extends ClientMessage {
type: 'SetSessionConfig';
id: IntNumber;
sessionId: string;
webhookId?: string | null;
webhookUrl?: string | null;
metadata?: { [key: string]: string | null };
}

export function ClientMessageSetSessionConfig(
params: Omit<ClientMessageSetSessionConfig, 'type'>
): ClientMessageSetSessionConfig {
return { type: 'SetSessionConfig', ...params };
}

export interface ClientMessagePublishEvent extends ClientMessage {
type: 'PublishEvent';
sessionId: string;
event: string;
data: string;
callWebhook: boolean;
}

export function ClientMessagePublishEvent(
params: Omit<ClientMessagePublishEvent, 'type'>
): ClientMessagePublishEvent {
return { type: 'PublishEvent', ...params };
}
export type ClientMessage =
| {
type: 'HostSession';
id: IntNumber;
sessionId: string;
sessionKey: string;
}
| {
type: 'IsLinked';
id: IntNumber;
sessionId: string;
}
| {
type: 'GetSessionConfig';
id: IntNumber;
sessionId: string;
}
| {
type: 'SetSessionConfig';
id: IntNumber;
sessionId: string;
webhookId?: string | null;
webhookUrl?: string | null;
metadata?: { [key: string]: string | null };
}
| {
type: 'PublishEvent';
id: IntNumber;
sessionId: string;
event: string;
data: string;
callWebhook: boolean;
};
9 changes: 4 additions & 5 deletions packages/wallet-sdk/src/connection/DiagnosticLogger.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
// DiagnosticLogger for debugging purposes only

import { Web3RequestMessage } from '../relay/Web3RequestMessage';
import { Web3ResponseMessage } from '../relay/Web3ResponseMessage';
import { ServerMessage, ServerMessageIsLinkedOK } from './ServerMessage';
import { WalletLinkEventData } from '../relay/RelayMessage';
import { ServerMessage } from './ServerMessage';
import { ConnectionState } from './WalletLinkWebSocket';

export type LogProperties = {
addresses_length?: number; // number of eth addresses
alreadyDestroyed?: boolean; // error flag if metadata is already destroyed on resetAndReload
eventId?: Web3RequestMessage['id'] | Web3ResponseMessage['id'];
eventId?: WalletLinkEventData['id'];
isSessionMismatched?: string; // storedSession does not match sessionId
linked?: ServerMessageIsLinkedOK['linked'];
linked?: ServerMessage<'IsLinkedOK'>['linked'];
message?: string; // error message
metadata_keys?: string[]; // session config metadata keys
method?: string; // method throwing error message
Expand Down
143 changes: 61 additions & 82 deletions packages/wallet-sdk/src/connection/ServerMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,87 +3,66 @@

import { IntNumber } from '../types';

export interface ServerMessage {
type: string;
id?: IntNumber;
}
export type ServerMessage<T extends Type = Type> = Extract<_ServerMessage, { type: T }>;

export interface ServerMessageOK extends ServerMessage {
type: 'OK';
id: IntNumber;
sessionId: string;
}
export type ServerMessageType = Type;
type Type = _ServerMessage['type'];

export interface ServerMessageFail extends ServerMessage {
type: 'Fail';
id: IntNumber;
sessionId: string;
error: string;
}

export function isServerMessageFail(msg: any): msg is ServerMessageFail {
return (
msg &&
msg.type === 'Fail' &&
typeof msg.id === 'number' &&
typeof msg.sessionId === 'string' &&
typeof msg.error === 'string'
);
}

export interface ServerMessageIsLinkedOK extends ServerMessage {
type: 'IsLinkedOK';
id: IntNumber;
sessionId: string;
linked: boolean;
onlineGuests: number;
}

export interface ServerMessageLinked extends ServerMessage {
type: 'Linked';
sessionId: string;
onlineGuests: number;
}

export interface ServerMessageGetSessionConfigOK extends ServerMessage {
type: 'GetSessionConfigOK';
id: IntNumber;
sessionId: string;
webhookId: string;
webhookUrl: string;
metadata: { [field: string]: string };
}

export interface ServerMessageSessionConfigUpdated extends ServerMessage {
type: 'SessionConfigUpdated';
sessionId: string;
webhookId: string;
webhookUrl: string;
metadata: { [field: string]: string };
}

export interface ServerMessagePublishEventOK extends ServerMessage {
type: 'PublishEventOK';
id: IntNumber;
sessionId: string;
eventId: string;
}

export interface ServerMessageEvent extends ServerMessage {
type: 'Event';
sessionId: string;
eventId: string;
event: string;
data: string;
}

export function isServerMessageEvent(msg: any): msg is ServerMessageEvent {
return (
msg &&
msg.type === 'Event' &&
typeof msg.sessionId === 'string' &&
typeof msg.eventId === 'string' &&
typeof msg.event === 'string' &&
typeof msg.data === 'string'
);
}
type _ServerMessage =
| {
type: 'Heartbeat'; // TODO: remove. it's client side only virtual message.
}
| {
type: 'OK';
id: IntNumber;
sessionId: string;
}
| {
type: 'Fail';
id: IntNumber;
sessionId: string;
error: string;
}
| {
type: 'IsLinkedOK';
id: IntNumber;
sessionId: string;
linked: boolean;
onlineGuests: number;
}
| {
type: 'Linked';
id?: IntNumber;
sessionId: string;
onlineGuests: number;
}
| {
type: 'GetSessionConfigOK';
id: IntNumber;
sessionId: string;
webhookId: string;
webhookUrl: string;
metadata: { [field: string]: string };
}
| {
type: 'SessionConfigUpdated';
id?: IntNumber;
sessionId: string;
webhookId: string;
webhookUrl: string;
metadata: { [field: string]: string };
}
| {
type: 'PublishEventOK';
id: IntNumber;
sessionId: string;
eventId: string;
}
| {
type: 'Event';
id?: IntNumber;
sessionId: string;
eventId: string;
event: string;
data: string;
};
Loading

0 comments on commit 13f0b5a

Please sign in to comment.