( api: SocketAPIData<T, U, EVENT>, data: SocketRequestData | SocketResponseData<unknown>, event: EVENT, )
| 91 | } |
| 92 | |
| 93 | export async function api_handle_message< |
| 94 | T extends T_BASE, |
| 95 | U extends U_BASE<T>, |
| 96 | EVENT extends EVENT_BASE |
| 97 | >( |
| 98 | api: SocketAPIData<T, U, EVENT>, |
| 99 | data: SocketRequestData | SocketResponseData<unknown>, |
| 100 | event: EVENT, |
| 101 | ): Promise<[ |
| 102 | SocketResponseData<unknown> | undefined, // Incoming response (resolve/reject promise) |
| 103 | SocketResponseData<unknown> | undefined, // Outgoing response (send this) |
| 104 | ]> { |
| 105 | |
| 106 | if ('type' in data) { // Request |
| 107 | // Handle message |
| 108 | for (let i = 0; i < api.registered_any.length; i++) { |
| 109 | const callback_any = api.registered_any[i]; |
| 110 | callback_any(event, data.type as T, data.args); |
| 111 | } |
| 112 | |
| 113 | const callback = api.registered[data.type]; |
| 114 | let result: any; |
| 115 | let error: any; |
| 116 | if (callback) { |
| 117 | try { |
| 118 | result = await callback(event, ...data.args as any); |
| 119 | } catch (e) { |
| 120 | // console.error(`An error was thrown from inside a callback (type: ${data.type}).`, e); |
| 121 | error = (e as Error).toString(); |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | // Respond |
| 126 | if (data.id !== undefined) { |
| 127 | if (typeof data.id === 'number') { |
| 128 | let response: SocketResponseData<T>; |
| 129 | if (result !== undefined) { |
| 130 | response = { |
| 131 | id: data.id, |
| 132 | result: result |
| 133 | }; |
| 134 | } else { |
| 135 | response = { |
| 136 | id: data.id, |
| 137 | error: error |
| 138 | }; |
| 139 | } |
| 140 | |
| 141 | return [undefined, response]; |
| 142 | } else { |
| 143 | console.error(`Socket Client - Failed to respond to request, request ID is not of type "number" (type: "${typeof data.id}").`); |
| 144 | } |
| 145 | } |
| 146 | } else { // Response |
| 147 | return [data, undefined]; |
| 148 | } |
| 149 | |
| 150 | return [undefined, undefined]; |
no test coverage detected