Uncaught TypeError: Illegal invocation
メンテナーはふだん 2 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- nextjs, react, typescript
調査の方向性
提供された Next.js クライアントの再現コードで io() の呼び出しと connectMessageSocket エントリーポイントから始め、Socket インスタンスを Valtio プロキシでラップすると呼び出しエラーが発生するかどうかを切り分けます。token が最初は利用できない状態で認証済み接続のフローを再現し、token が提供されると正常に接続されることを確認します。
索引モデルが issue の本文から書いたものです。
説明
Describe the bug
It produces Uncaught TypeError: Illegal invocation error when calling io()
context: I'm working in a react project where valtio is used for state manamement.
To Reproduce
Socket.IO server version: 4.8.1
Server
Using Nest.js for server. The server is working fine.
Socket.IO client version: 4.8.1
Client
// (next.js projec) the valtio store
'use client';
import {proxy, ref} from "valtio";
import {devtools, useProxy} from "valtio/utils";
import {IS_PRODUCTION_MODE, isServer} from "@/util/constants";
import {io, Socket} from "socket.io-client";
import {endpoints} from "@/util/urls";
type MsgModule<Actions = any> = {
socket: Socket;
connecting: boolean;
actions: Actions
}
type Data = {
message: MsgModule;
}
export const socketStore = proxy<Data>({
message: {
socket: io(endpoints.api.baseUrl + '/message', {
auth: {
token: ''
},
autoConnect: false
}),
connecting: false,
actions: ref({
abc: () => {}
}),
},
});
// socketStore.message.
export const useStoreSockMsg = () => useProxy(socketStore.message);
devtools(socketStore, {
name: 'socket',
enabled: !isServer && !IS_PRODUCTION_MODE,
});
export const socketActions = {
connectMessageSocket(accessToken: string) {
if (socketStore.message.socket.connected || socketStore.message.connecting) return;
console.log('proceed to socket connection with token', accessToken)
socketStore.message.socket = io(
endpoints.api.baseUrl + '/message',
{
auth: {
token: accessToken,
},
autoConnect: false,
}
);
// Listen for connection events
socketStore.message.socket.on('connect', () => {
console.log('socket is connected')
});
socketStore.message.socket.on('disconnect', () => {
console.log('socket is disconnected')
});
// Handle auth errors (e.g., expired token)
socketStore.message.socket.on('connect_error', async (err) => {
console.log('socket connection err: ', err.message)
// if (err.message === 'Unauthorized') {
// retry connection with updated token ...
// }
});
socketStore.message.socket.connect();
},
// Disconnect and cleanup
disconnectSocket: () => {
if (socketStore.message.socket) {
socketStore.message.socket.disconnect();
}
},
};
// the component
function MessageSocket() {
const userStore = useStoreUser();
const sockStore = useStoreSockMsg();
useEffect(() => {
if (sockStore.socket.connected || !userStore.at) return; // at is access token
socketActions.connectMessageSocket(userStore.at); // calling this producting the err: Uncaught TypeError: Illegal invocation
return () => socketActions.disconnectSocket();
}, [userStore.at, sockStore.socket.connected]);
useEffect(() => {
console.log('sock connected?', sockStore.socket.connected)
}, [sockStore.socket.connected]);
// ...
}
Expected behavior
Obviously expectation was to successfully connect, The official docs has a guide on how to use with react but that doesn't covers how to use with authentication when the token becomes available later.
Platform:
- Device: A Desktop PC
- OS: Ubuntu 24.04
- 主要言語
- TypeScript
- スター
- 63.2k
- フォーク
- 10.2k
- 平均マージ
- 6日 4時間
- マージ済み PR(30日)
- 6
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
socketio/socket.io のほかの issue
-
[engine.io-client] The Node.js cookie jar lets Expires override Max-Age対応中かも @Ayush701-code-zm が 1 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
socketio/socket.io#5590 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
Raise Engine.IO minimum to 6.6.10 for published security fixes対応中かも @harshit-exe-dev が 29 日前に担当しました。 オープン
難易度 1/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 2 日以内に返信
-
Can't set response headers in Server.handleUpgrade対応中かも @MsfPablo が 90 日前に担当しました。 オープンquestion
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
socketio/socket.io#5497 · コメント 2 件 ·
メンテナーはふだん 2 日以内に返信
-
WebTransport ignores query parameters in URL対応中かも @cyphercodes が 178 日前に担当しました。 オープンneeds major release question
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
socketio/socket.io#5496 · コメント 3 件 ·
メンテナーはふだん 2 日以内に返信
-
[engine.io-client] close() called in an upgrade listener does not close the socket対応中かも @adityajai119 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 20/100
メンテナーはふだん 2 日以内に返信
socketio/socket.io の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
outline/outline#14529 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 86/100
g1331/phantom-circuit#93 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
compiler
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
HerringtonDarkholme/hd-lang#1699 ·
メンテナーはふだん 1 日以内に返信