Socket.io: рд░реЗрдВрдЬ рддреНрд░реБрдЯрд┐: рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рдкрд╛рд░ рд╣реЛ рдЧрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЬреБрд▓ре░ 2014  ┬╖  32рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: socketio/socket.io

рдореИрдВ рд╕рд┐рд░реНрдл `├мo.sockets.emit('hey', data) рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ; and it will crash with RangeError: рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ . I use it in other places in my app and it works fine. I am not repeating this (checked with console). The logs say the error is in socket.io/node_modules/has-binary-data/index.js:46``ред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ io.sockets рд▓реЙрдЧрд┐рдВрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ:

{ name: '/',
17:39:37 web.1  |   server:
17:39:37 web.1  |    { nsps: { '/': [Circular] },
17:39:37 web.1  |      _path: '/socket.io',
17:39:37 web.1  |      _serveClient: true,
17:39:37 web.1  |      _adapter: [Function: Adapter],
17:39:37 web.1  |      _origins: '*:*',
17:39:37 web.1  |      sockets: [Circular],
17:39:37 web.1  |      eio:
17:39:37 web.1  |       { clients: [Object],
17:39:37 web.1  |         clientsCount: 2,
17:39:37 web.1  |         pingTimeout: 60000,
17:39:37 web.1  |         pingInterval: 25000,
17:39:37 web.1  |         upgradeTimeout: 10000,
17:39:37 web.1  |         maxHttpBufferSize: 100000000,
17:39:37 web.1  |         transports: [Object],
17:39:37 web.1  |         allowUpgrades: true,
17:39:37 web.1  |         allowRequest: [Function],
17:39:37 web.1  |         cookie: 'io',
17:39:37 web.1  |         ws: [Object],
17:39:37 web.1  |         _events: [Object] },
17:39:37 web.1  |      engine:
17:39:37 web.1  |       { clients: [Object],
17:39:37 web.1  |         clientsCount: 2,
17:39:37 web.1  |         pingTimeout: 60000,
17:39:37 web.1  |         pingInterval: 25000,
17:39:37 web.1  |         upgradeTimeout: 10000,
17:39:37 web.1  |         maxHttpBufferSize: 100000000,
17:39:37 web.1  |         transports: [Object],
17:39:37 web.1  |         allowUpgrades: true,
17:39:37 web.1  |         allowRequest: [Function],
17:39:37 web.1  |         cookie: 'io',
17:39:37 web.1  |         ws: [Object],
17:39:37 web.1  |         _events: [Object] } },
17:39:37 web.1  |   sockets:
17:39:37 web.1  |    [ { nsp: [Circular],
17:39:37 web.1  |        server: [Object],
17:39:37 web.1  |        adapter: [Object],
17:39:37 web.1  |        id: 'RfgXeMgHeP_9SQC5AAAC',
17:39:37 web.1  |        client: [Object],
17:39:37 web.1  |        conn: [Object],
17:39:37 web.1  |        rooms: [Object],
17:39:37 web.1  |        acks: {},
17:39:37 web.1  |        connected: true,
17:39:37 web.1  |        disconnected: false,
17:39:37 web.1  |        handshake: [Object],
17:39:37 web.1  |        _events: [Object] },
17:39:37 web.1  |      { nsp: [Circular],
17:39:37 web.1  |        server: [Object],
17:39:37 web.1  |        adapter: [Object],
17:39:37 web.1  |        id: '7TEjGJjWzxObulClAAAD',
17:39:37 web.1  |        client: [Object],
17:39:37 web.1  |        conn: [Object],
17:39:37 web.1  |        rooms: [Object],
17:39:37 web.1  |        acks: {},
17:39:37 web.1  |        connected: true,
17:39:37 web.1  |        disconnected: false,
17:39:37 web.1  |        handshake: [Object],
17:39:37 web.1  |        _events: [Object] } ],
17:39:37 web.1  |   connected:
17:39:37 web.1  |    { RfgXeMgHeP_9SQC5AAAC:
17:39:37 web.1  |       { nsp: [Circular],
17:39:37 web.1  |         server: [Object],
17:39:37 web.1  |         adapter: [Object],
17:39:37 web.1  |         id: 'RfgXeMgHeP_9SQC5AAAC',
17:39:37 web.1  |         client: [Object],
17:39:37 web.1  |         conn: [Object],
17:39:37 web.1  |         rooms: [Object],
17:39:37 web.1  |         acks: {},
17:39:37 web.1  |         connected: true,
17:39:37 web.1  |         disconnected: false,
17:39:37 web.1  |         handshake: [Object],
17:39:37 web.1  |         _events: [Object] },
17:39:37 web.1  |      '7TEjGJjWzxObulClAAAD':
17:39:37 web.1  |       { nsp: [Circular],
17:39:37 web.1  |         server: [Object],
17:39:37 web.1  |         adapter: [Object],
17:39:37 web.1  |         id: '7TEjGJjWzxObulClAAAD',
17:39:37 web.1  |         client: [Object],
17:39:37 web.1  |         conn: [Object],
17:39:37 web.1  |         rooms: [Object],
17:39:37 web.1  |         acks: {},
17:39:37 web.1  |         connected: true,
17:39:37 web.1  |         disconnected: false,
17:39:37 web.1  |         handshake: [Object],
17:39:37 web.1  |         _events: [Object] } },
17:39:37 web.1  |   fns: [],
17:39:37 web.1  |   ids: 0,
17:39:37 web.1  |   acks: {},
17:39:37 web.1  |   adapter:
17:39:37 web.1  |    { nsp: [Circular],
17:39:37 web.1  |      rooms:
17:39:37 web.1  |       { '5MGPNOdO4th_dOuZAAAA': [],
17:39:37 web.1  |         '64rUhxxp--4Qk1MqAAAB': [],
17:39:37 web.1  |         RfgXeMgHeP_9SQC5AAAC: [Object],
17:39:37 web.1  |         '7TEjGJjWzxObulClAAAD': [Object] },
17:39:37 web.1  |      sids:
17:39:37 web.1  |       { RfgXeMgHeP_9SQC5AAAC: [Object],
17:39:37 web.1  |         '7TEjGJjWzxObulClAAAD': [Object] },
17:39:37 web.1  |      encoder: {} },
17:39:37 web.1  |   _events: { connection: [Function] } }

рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

`````` рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ

рдЕрдЧрд░ (game.scoreTeamTwo > game.scoreTeamOne && game.scoreTeamTwo > game.scoreTeamThree && game.scoreTeamTwo > game.scoreTeamFour) {
рдЦреЗрд▓.рд╡рд┐рдЬреЗрддрд╛ = реи;
io.sockets.emit('CTFEnd', game);
}

// рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯреАрдо 1 рдиреЗ рдЧреЗрдо рдЬреАрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рддреЛ CTFEnd рдФрд░ рдЕрдиреНрдп рд╕рднреА рдЧреЗрдо рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рд╣реЛрддрд╛ рд╣реИ
``````

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд░реНрдХреБрд▓рд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдП рдереЗред

рд╕рднреА 32 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ "рд╕рдорд╛рдзрд╛рди" рдорд┐рд▓рд╛ред рдореИрдВ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╣рд░ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд╣ рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓ рд░рд╣реА рд╣реИ, рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА-рдХрднрд╛рд░ рд╣реА рдореЗрд░реЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдкреВрд░реА рд╕реБрдмрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдерд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдЬрдм рдУрдмреНрдЬ рдмрдбрд╝рд╛ рдерд╛ред

@BenBals рдпрджрд┐ рд╡рд╕реНрддреБ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╛рдиреА рдЙрд╕ рдкрд░ JSON.stringify() рдЪрд▓рд╛рдПрдВ

рдореБрдЭреЗ рдПрдХ рдФрд░ рдХрд╛рдо рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред

:рд░реЛ: рдЗрд╕рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ

рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ:
{success: file, content: file.content} рдЬрд╣рд╛рдВ file.content рдмрдлрд╝рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдЧреБрдг рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╣реИрдВред

рдлрд╝реАрд▓реНрдб рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ hasBin() рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЙрд╕рдиреЗ рдмрдлрд░ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддреЛ рдЙрд╕реЗ 'рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд╛рд░ рд╣реЛ рдЧрдпрд╛'

рдЖрдк рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ (рдХрдо рд╕реЗ рдХрдо рдПрдХ рддрд░рд╣ рд╕реЗ) рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рд╕рд░реНрд╡рд░ рд╣реЛрдЧрд╛ -> рдХреНрд▓рд╛рдЗрдВрдЯ )

socket.emit('crash', {socket:socket});

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд┐рдХреНрд╕ рд╣реИред

рдЙрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдореЗрдВ рдЕрдкрдирд╛ рдлрд╛рдпрд░рдмреЗрд╕ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред

рддреНрд░реБрдЯрд┐

node_modules/socket.io/node_modules/has-binary-data/index.js:46

for (var key in obj) {
                ^
RangeError: Maximum call stack size exceeded

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб

var DB = new Firebase('https://1234abcd.firebaseIO.com');
var USERS = DB.child("users");

io.sockets.on('connection', function(socket){

    socket.emit('test', {
        db: USERS
    });

});

рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЛ...

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЪреАрдиреА рдЗрддрдиреА рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреЗ рджрдпрд╛рд▓реБ рд╣реЛрдВрдЧреЗред

рдХреНрдпрд╛ рдПрдХ Google рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ "рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗрдВ ..." рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ ... рд╢рд╛рдпрдж рд╣реА рдЬрд╡рд╛рдм рджреЗрдиреЗ рд▓рд╛рдпрдХ рд╣реЛред рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рдЗрддрдиреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ socket.io рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ ... рдпрд╣ рдПрдХ рд╕реЙрдХреЗрдЯ рд╣реИ рдЬрд┐рд╕реЗ рддреНрд╡рд░рд┐рдд, рдЫреЛрдЯреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЛрдбрд╝реЗрдВ рдпрд╛ рдЗрд╕реЗ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗрдВред рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред

рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдк socket.io рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рд╡рд╕реНрддреБ рдФрд░ рдЙрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдирд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

var props = [];
var obj = { a: 1, b:2, c: { d: 3, e: 4 } };

function next_prop(callback){
  if (!props.length){
    setTimeout(callback);
    return;
  }
  var prop = props.shift();
  //do whatever with the prop, call parse_obj on it if it's an object
  setTimeout(next_prop);
}

function parse_obj(obj, callback){
  for (var i in obj){
    props.push(i);
  }
  setTimeout(function(){next_prop(callback);});
}

parse_obj(obj);

рдмреЗрд╢рдХ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдмрд╕ рд╡рд╣ рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓рддреА рд╣реИ, рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: "io.sockets.emit('key', data);"
рдореИрдВ "рдбреЗрдЯрд╛" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
--рдФрд░, рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдпрд╣ рдкрд╛рдпрд╛:

image_20150306180547

рдЬрдм рдЖрдкрдХреЗ "рдбреЗрдЯрд╛" рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд░рд┐рдХрд░реНрд╕рд┐рд╡ рд╡рд┐рд╢реЗрд╖рддрд╛ рд░реЗрдлрд░рд┐рдВрдЧ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдб рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЬреИрд╕реЗ рдкреНрд░реЛрдЯреЛ > рдкреНрд░реЛрдЯреЛ > рдкреНрд░реЛрдЯреЛ ...

+1 рдХреЛрд░ рдЯреАрдо рдмрд╛рдЗрдирд░реА рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рдПрд╕рд┐рдВрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддрд░рд╣ рд╣реЛрдЧреА, рдореИрдВ рдЙрд╕ рд╕реЗрдЯрдЕрдк рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

рдореИрдВ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)

+1 IE11 _hasBinary рдореЗрдВ 'рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ рд╕реЗ рдмрд╛рд╣рд░' рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдпрд╣ рддреНрд░реБрдЯрд┐ рдореЗрд░реЗ рд▓рд┐рдП рддрдм рджрд┐рдЦрд╛рдИ рджреА рдЬрдм рдореИрдВ рд╕рдВрдкреВрд░реНрдг рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╕рднреА рдореИрдВ рдЬрд░реВрд░рдд _really_ рдерд╛ socket.id рддреЛ рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рдЬрдм рдореИрдВ рд╡рд╛рдкрд╕ рдПрдХ рдЫреЛрдЯреЗ рдЖрдЗрдЯрдо рднреЗрдЬрд╛ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, socket.id рдкреВрд░реЗ рдХреЗ рдмрдЬрд╛рдп socket рд╡рд╕реНрддреБ

рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд░реНрдХреБрд▓рд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдП рдереЗред

@LordMajestros рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛! рдзрдиреНрдпрд╡рд╛рдж

@GerbenHofman рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ

рдореБрдЭреЗ NodeJS v4.4.4 рдФрд░ socket.io v1.4.5 рдкрд░ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред
рдФрд░ рдпрд╣ рддрднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВрдиреЗ socket.emit 200,000 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ред

рдпрджрд┐ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ socket.emit рд▓рдЧрднрдЧ 100,000 рд╣реИ, рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрднреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

emit рд╕рд╛рде рдореИрдВ рдЬрд┐рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдкрдХреА рдорджрдж рдХрд░рддреА рд╣реИ?

рдмрд╕ @shunjikonishi рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ io.emit рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдареАрдХ 100,000 рдИрд╡реЗрдВрдЯ рднреЗрдЬреЗ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЛрдб (рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо) рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдИ рдЧрдИ рдПрдХ рд╕реАрдорд╛ рд╣реИ рдФрд░ Socket.io рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрддреНрд╕рд░реНрдЬрди рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╕рдВрджрд░реНрдн рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк 100,000 рд╡реЗрдВ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╕ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред

рдиреЛрдб 5.11.0 рдФрд░ рд╕реЙрдХреЗрдЯрд┐рдпреЛ 1.4.8 рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдиреЛрдб рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрд▓рдЧ рд╣реИ (рд╕рд╛рде рд╣реА рд╕рд╛рде рдореЗрд░рд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЗрддреНрдпрд╛рджрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ 100,000 рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ) @shunjikonishi рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬреЛ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ 100,000 рдкрд░ рд╕реАрдорд╛ рдХреНрдпреЛрдВ рдорд╛рд░рд╛ рдЬрдмрдХрд┐ рд╡рд╣ 200,000 рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ред

рдореИрдВрдиреЗ ws.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдЙрд╕реА рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдпрд╛ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ 100,000 рд╕реЙрдХреЗрдЯ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ Socket.io рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рд╕реЙрдХреЗрдЯ рдЖрдИрдУ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдбреЗрдЯрд╛ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЧрд╛рд░реНрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рд╣реИ? рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╣рдЪрд╛рди рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрдердХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ "рдЖрдк рдкрд░рд┐рдкрддреНрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ"ред рдЗрд╕рд╕реЗ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд░реНрдХреБрд▓рд░ рдбреЗрдЯрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ: https://stackoverflow.com/questions/14962018/detecting-and-fixing-circular-references-in-javascript

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдорд╛рдзрд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП JSON.stringify рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:

function isObjectCircular(obj) {
    try {
        JSON.stringify(circularReference);
    } catch(err) {
        return (err.toString() === 'TypeError: Converting circular structure to JSON');
    }
    return false;
}

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value

@adamreisnz рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ;)

рдЬрдм рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ 5 рдорд╣реАрдиреЗ рдмрд╛рдж рдХреЛрдИ рдореЗрд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдорд┐рд▓рд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рдкреВрд░реЗ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдШрдВрдЯреЗ рдмрд░реНрдмрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ:<ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдП = {рдмреА: {рд╕реА: рдП}} рдЬреИрд╕реЗ рд░рд┐рдХрд░реНрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдПрдХ рд░рд┐рдХрд░реНрд╕рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдмрдлрд░.рдЬреЗрдПрд╕ рдореЗрдВ, рд╡реЗ рдбреЗрдЯрд╛ рдХреА рд▓рдВрдмрд╛рдИ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХрд░реНрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ "рдЕрдзрд┐рдХрддрдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЖрдХрд╛рд░ рдкрд╛рд░ рд╣реЛ рдЧрдпрд╛" рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдпрджрд┐ рд╡реЗ рд▓рдВрдмрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSON.stringify() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рдЧреЛрд▓рд╛рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рд╡реИрд╕реЗ, рдпрд╣ Google рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рдХреБрдВрдЬреА рд╢рдмреНрдж рд╣реИ!

рдореИрдВ рдмрд╕ рдЗрд╕рдореЗрдВ рднреА рднрд╛рдЧ рдЧрдпрд╛ред

hasBin рдПрдХ рд╡реГрддреНрддрд╛рдХрд╛рд░ рд╕рдВрджрд░реНрдн рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓реВрдк рд╕реЗ рднрд░ рджреЗрдЧрд╛ред

рд╢рдХ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреАрдЖрд░ рд╣реИ рдЬреЛ 2 рд╕рд╛рд▓ рд╕реЗ рдЦреБрд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдЧрд╛:

@dustingraham рдлрд┐рдХреНрд╕ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдм hasBinary рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ JSON.stringify рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЛрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрднреА рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧреА:

> var a = {};
undefined
> var b = { a: a };
undefined
> a.b = b
{ a: { b: [Circular] } }
> JSON.stringify(a)
Thrown:
TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕