Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.

Commit c6160b7

Browse files
author
Alexandros Semelidis
committed
First idea on sending a single file
1 parent 16d6a4d commit c6160b7

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

src/client/public/index.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,16 @@ $(function onload() {
121121
showUsers();
122122
break;
123123
}
124+
case 'sendFilesResp': {
125+
const data = objData.d;
126+
const encoder = new TextEncoder();
127+
const uint8Array = encoder.encode(data[0].fileData);
128+
const url = URL.createObjectURL(new Blob([uint8Array]));
129+
const tEl = `<a href="${url}" download="${data[0].fileName}"></a>`;
130+
chatWriteLine(`${username}: ${tEl}`);
131+
txtMessage.val('').focus();
132+
break;
133+
}
124134
case 'join': {
125135
const username = objData.d;
126136
chatWriteLine(`User connect (${username})`);
@@ -178,20 +188,19 @@ $(function onload() {
178188
}
179189
});
180190

181-
btnSendFiles.click(() => {
191+
btnSendFiles.click(async () => {
182192
const lFiles = document.getElementById('btnUpload').files;
183193
if (lFiles.length > 0) {
184-
const reader = new FileReader();
185194
const decoder = new TextDecoder('utf-8');
186-
const lFileString = [];
187-
reader.onload = (e) => {
188-
lFileString.push(
189-
decoder.decode(new Uint8Array(e.target.result))
190-
);
191-
};
192-
for (let i = 0, l = lFiles.length; i < l; i++) {
193-
reader.readAsArrayBuffer(lFiles[i]);
194-
}
195+
const tArrBuffer = await lFiles[0].arrayBuffer();
196+
const fileData = decoder.decode(new Uint8Array(tArrBuffer));
197+
const fileName = btnUpload.val().split('\\').pop();
198+
const lFileString = [
199+
{
200+
fileData,
201+
fileName,
202+
},
203+
];
195204
ws.send(
196205
JSON.stringify({
197206
h: 'sendFiles',

src/server/WebSocket.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ type WSMsgJoin = { h: 'join'; d: string };
2525
type WSMsgLeave = { h: 'leave'; d: string };
2626
type WSMsgChat = { h: 'chat'; s: string; d: string };
2727
type WSMsgGetUsers = { h: 'getUsers' };
28-
type WSMsgSendFiles = { h: 'sendFiles'; d: Array<string> };
28+
type WSMsgSendFiles = {
29+
h: 'sendFiles';
30+
d: Array<{ fileData: string; fileName: string }>;
31+
};
2932
type WSMessageClient =
3033
| WSMsgJoin
3134
| WSMsgLeave
@@ -41,12 +44,17 @@ type WSMsgGetUsersResp = {
4144
h: 'getUsersResp';
4245
userList: Array<string>;
4346
};
47+
type WSMsgSendFilesResp = {
48+
h: 'sendFilesResp';
49+
d: Array<{ fileData: string; fileName: string }>;
50+
};
4451
type WSMessageServer =
4552
| WSMsgConnectResp
4653
| WSMsgJoinResp
4754
| WSMsgLeaveResp
4855
| WSMsgChatResp
49-
| WSMsgGetUsersResp;
56+
| WSMsgGetUsersResp
57+
| WSMsgSendFilesResp;
5058

5159
type WSMessage = WSMessageClient | WSMessageServer;
5260

@@ -100,6 +108,7 @@ export async function HandleWSConn(pWebSocket: WebSocket): Promise<void> {
100108
break;
101109
}
102110
case 'sendFiles': {
111+
await RespondSendFiles(_connInfo, objEvent.d);
103112
break;
104113
}
105114
default: {
@@ -172,6 +181,16 @@ async function RespondGetUsers(pConnInfo: ConnInfo) {
172181
});
173182
}
174183

184+
async function RespondSendFiles(
185+
pConnInfo: ConnInfo,
186+
pData: Array<{ fileData: string; fileName: string }>
187+
) {
188+
return Respond(pConnInfo, {
189+
h: 'sendFilesResp',
190+
d: pData,
191+
});
192+
}
193+
175194
function BroadcastJoin(pSrcInfo: ConnInfo) {
176195
const { id: _SenderId, conn: _SenderConn } = pSrcInfo;
177196
const { name: _SenderName } = _SenderConn;

0 commit comments

Comments
 (0)