Làm sao dùng socket.io để gửi một TypedArray từ client lên server?

Mình chẳng biết đây là lỗi hay là tính năng nữa :disappointed_relieved:
(đã thử đăng issue trên github: https://github.com/socketio/socket.io/issues/3143)

Phía client:

let binary = new Uint8Array(5);
binary.fill(12);
socket.emit('binary', binary);

Phía server:

socket.on('binary', (binaryData) => {
   console.log(binaryData);
});

Phía server in ra như vầy (đã debug, breakpoint và xác nhận):

{ '0': 12,
  '1': 12,
  '2': 12,
  '3': 12,
  '4': 12,
  '5': 12 }

Socket.io bên server lại nhả ra một cục Object thông thường.

Chắc hỏi khó quá không ai trả lời được, thôi sau này không chơi với socket.io nữa :weary:

Emits an event to the socket identified by the string name. Any other parameters can be included. All serializable datastructures are supported, including Buffer.

Có vẻ TypedArray không phải. Mình đọc MDN không thấy nhắc tới, còn tra spec thì miễn :smile_cat:

> JSON.stringify(new Uint8Array(5))
"{"0":0,"1":0,"2":0,"3":0,"4":0}"
2 Likes

Xài cái lib này đắng lòng quá, tài liệu mù mờ :confounded: , mà hình như đa phần open source lib đều vậy nhỉ.

Viết docs thường thuộc giai đoạn đánh bóng sản phẩm, nó thường được làm sau cùng vì có vẻ không mấy thú vị với lập trình viên. Contributor không công người ta chỉ thích làm chuyện thú vị.
Còn các công ty phần mềm thường thuê technical writer chuyên viết docs. docs của qt cũng đầy đủ đấy.

Phần nữa là docs các lib khác nhau thì có định dạng và cách trình bày khác nhau nên bạn thấy mới lạ, không quen - cộng đồng nodejs càng là chúa làm màu. Các project của cùng một team thì sẽ giống nhau, như là các lib python của
pocoo.org

Riêng mình thấy viết docs rất thú vị :wink:

Thật ra mình thấy docs của họ không bao hết mọi trường hợp, lúc nào đọc mình cũng đều thấy có “kẽ hở”, docs ép lập trình viên phải tự test, không đúc kết đầy đủ :confounded: , mà nó chạy không đúng ý mình thì chả biết hỏi ai.

Then, you know, open an issue. :stuck_out_tongue_winking_eye:

I myself prefer write the missing pieces and open pull request.

3 Likes

Thật thì opensource phải có người đóng góp, nhưng ít ra tác giả gốc cũng phải có trách nhiệm.
Và mình cũng rất ghét đọc code dù là ltv, sau này nếu mình đưa chính code của mình lên github thì mình cũng sẽ đưa cả cái bản thiết kế lên luôn, không ép người khác đọc code.

1 Like

Bản thiết kế mà bạn nói là SDD. Cụ thể trong opensource người ta thường dùng unittest.
Đầy đủ unit testcase là đã biểu diễn được đầy đủ thiết kế của phần mềm. Không thừa không thiếu.
Một dự án muốn có thêm dev, contributor thì điều trên là bắt buộc.
Bạn trông đợi gì hơn ? UML ? Có khi thứ đó không hề tồn tại :smile_cat:. Mình không biết UML nhưng vẫn thiết kế được đó thôi, thiết kế ngu rồi không ngừng cải thiện :stuck_out_tongue_closed_eyes:.
UML visualize tốt nhưng chỉ đọc nó thôi thì chưa đủ để sử dụng phần mềm.
[spoiler]Bạn vẫn cứ phải đọc code[/spoiler]

Quan trọng là với tư cách user, bạn không cần và không nên phải đọc code hay SDD. Nếu phải đọc mới dùng được thì đó chưa phải là sản phẩm hoàn chỉnh. Vậy lựa chọn của bạn là góp phần hoàn chỉnh nó hoặc ngưng sử dụng nó.
User chỉ cần đọc user documentation.
Nếu bạn đọc kĩ mà vẫn gặp khó khăn trong sử dụng thì không phải bug trong phần mềm cũng là bug trong docs, report là điều hiển nhiên.

Riêng trong trường hợp này mình thấy socket.io không có thiếu sót nội dung, họ đã ghi rõ là chỉ hỗ trợ serializable datastructures, một phần là do bạn đọc không kĩ, một phần là do hình thức trình bày ngu. Đáng lẽ phải mở ngoặc Serializable Object ở trên mục args mới dễ thấy.

Vậy thì Buffer là serializable, còn Uint8Array thì unserializable ?
Cái này còn đắng lòng hơn :confounded:
Thôi bye bye socket.io.

>> a = new Uint8Array(5)
Uint8Array [ 0, 0, 0, 0, 0 ]
>> whatYouSend = Array.from(a)
Array [ 0, 0, 0, 0, 0 ]
>> whatYouReceive = JSON.parse(JSON.stringify(whatYouSend))
Array [ 0, 0, 0, 0, 0 ]
>> restored_a = Uint8Array.from(whatYouReceive)
Uint8Array [ 0, 0, 0, 0, 0 ]

is it enough ?

Mục đích của mình là giảm dung lượng gói tin cơ.

Bạn không nói rõ ngay từ đầu :disappointed_relieved:

Buffer API là của Node, browser làm gì có.
Đúng là bug rồi đấy.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?