empiricaly / empirica

Open source project to tackle the problem of long development cycles required to produce software to conduct multi-participant and real-time human experiments online.
https://empirica.ly/
Apache License 2.0
44 stars 8 forks source link

Unhandled error. (Unexpected server response: 401) #436

Closed yunshiuan closed 5 months ago

yunshiuan commented 10 months ago

Is there an existing issue for this?

What happened?

I tried to run the quick start example on the webpage (https://docs.empirica.ly/getting-started/quick-start), and ran into the Unexpected server response: 401 error.

Steps To Reproduce

  1. curl https://install.empirica.dev | sh
  2. empirica create my-experiment
  3. cd my-experiment
  4. empirica

Empirica Version

Version: v1.8.4
SHA:     ad1fbdf
Branch:  main
Time:    2023-10-26T08:17:47Z

Client:  1.8.0 -> 1.8.4 -> 1.8.4
Server:  1.8.0 -> 1.8.4 -> 1.8.4

What OS are you seeing the problem on?

macOS

What browser are you seeing the problem on?

Does not apply

Relevant log output

(base) MacBook-Pro-10:my-experiment vimchiz$ empirica
[server] Error: Unhandled error. (Unexpected server response: 401)
[server]     at pn.Ve.emit (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/@empirica/tajriba/src/events.js:156:9)
[server]     at error (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/@empirica/tajriba/src/tajriba.ts:323:16)
[server]     at Object.emit (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/graphql-ws/lib/client.mjs:104:21)
[server]     at ve.K.onerror (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/graphql-ws/lib/client.mjs:162:47)
[server]     at Yl (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/ws/lib/event-target.js:290:14)
[server]     at ve.n (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/ws/lib/event-target.js:230:9)
[server]     at ve.emit (node:events:513:28)
[server]     at Jl (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/ws/lib/websocket.js:1016:13)
[server]     at processTicksAndRejections (node:internal/process/task_queues:83:21) {
[server]   context: Ya {
[server]     [Symbol(kTarget)]: ve {
[server]       _events: [Object: null prototype] {
[server]         error: [Function: n] {
[server]           [Symbol(kIsForOnEventAttribute)]: true,
[server]           [Symbol(kListener)]: [Function (anonymous)]
[server]         },
[server]         close: [Function: n] {
[server]           [Symbol(kIsForOnEventAttribute)]: true,
[server]           [Symbol(kListener)]: [Function (anonymous)]
[server]         },
[server]         open: [Function: n] {
[server]           [Symbol(kIsForOnEventAttribute)]: true,
[server]           [Symbol(kListener)]: [AsyncFunction (anonymous)]
[server]         },
[server]         message: [Function: n] {
[server]           [Symbol(kIsForOnEventAttribute)]: true,
[server]           [Symbol(kListener)]: [Function (anonymous)]
[server]         }
[server]       },
[server]       _eventsCount: 4,
[server]       _maxListeners: undefined,
[server]       _binaryType: 'nodebuffer',
[server]       _closeCode: 1006,
[server]       _closeFrameReceived: false,
[server]       _closeFrameSent: false,
[server]       _closeMessage: Buffer(0) [Uint8Array] [],
[server]       _closeTimer: null,
[server]       _extensions: {},
[server]       _paused: false,
[server]       _protocol: '',
[server]       _readyState: 2,
[server]       _receiver: null,
[server]       _sender: null,
[server]       _socket: null,
[server]       _bufferedAmount: 0,
[server]       _isServer: false,
[server]       _redirects: 0,
[server]       _url: 'ws://localhost:3000/query',
[server]       _req: <ref *1> ClientRequest {
[server]         _events: [Object: null prototype] {
[server]           error: [Function (anonymous)],
[server]           response: [Function (anonymous)],
[server]           upgrade: [Function (anonymous)],
[server]           prefinish: [Function: requestOnPrefinish]
[server]         },
[server]         _eventsCount: 4,
[server]         _maxListeners: undefined,
[server]         outputData: [],
[server]         outputSize: 0,
[server]         writable: true,
[server]         destroyed: true,
[server]         _last: true,
[server]         chunkedEncoding: false,
[server]         shouldKeepAlive: true,
[server]         maxRequestsOnConnectionReached: false,
[server]         _defaultKeepAlive: true,
[server]         useChunkedEncodingByDefault: false,
[server]         sendDate: false,
[server]         _removedConnection: false,
[server]         _removedContLen: false,
[server]         _removedTE: false,
[server]         _contentLength: 0,
[server]         _hasBody: true,
[server]         _trailer: '',
[server]         finished: true,
[server]         _headerSent: true,
[server]         _closed: false,
[server]         socket: Socket {
[server]           connecting: false,
[server]           _hadError: false,
[server]           _parent: null,
[server]           _host: 'localhost',
[server]           _readableState: ReadableState {
[server]             objectMode: false,
[server]             highWaterMark: 16384,
[server]             buffer: [BufferList],
[server]             length: 0,
[server]             pipes: [],
[server]             flowing: true,
[server]             ended: false,
[server]             endEmitted: false,
[server]             reading: false,
[server]             constructed: true,
[server]             sync: false,
[server]             needReadable: true,
[server]             emittedReadable: false,
[server]             readableListening: false,
[server]             resumeScheduled: false,
[server]             errorEmitted: false,
[server]             emitClose: false,
[server]             autoDestroy: true,
[server]             destroyed: true,
[server]             errored: null,
[server]             closed: true,
[server]             closeEmitted: true,
[server]             defaultEncoding: 'utf8',
[server]             awaitDrainWriters: null,
[server]             multiAwaitDrain: false,
[server]             readingMore: true,
[server]             dataEmitted: true,
[server]             decoder: null,
[server]             encoding: null,
[server]             [Symbol(kPaused)]: false
[server]           },
[server]           _events: [Object: null prototype] {
[server]             end: [Function: onReadableStreamEnd],
[server]             error: [Function: socketErrorListener],
[server]             close: [Function: socketCloseListener],
[server]             timeout: [Function: responseOnTimeout]
[server]           },
[server]           _eventsCount: 4,
[server]           _maxListeners: undefined,
[server]           _writableState: WritableState {
[server]             objectMode: false,
[server]             highWaterMark: 16384,
[server]             finalCalled: false,
[server]             needDrain: false,
[server]             ending: false,
[server]             ended: false,
[server]             finished: false,
[server]             destroyed: true,
[server]             decodeStrings: false,
[server]             defaultEncoding: 'utf8',
[server]             length: 0,
[server]             writing: false,
[server]             corked: 0,
[server]             sync: false,
[server]             bufferProcessing: false,
[server]             onwrite: [Function: bound onwrite],
[server]             writecb: null,
[server]             writelen: 0,
[server]             afterWriteTickInfo: null,
[server]             buffered: [],
[server]             bufferedIndex: 0,
[server]             allBuffers: true,
[server]             allNoop: true,
[server]             pendingcb: 0,
[server]             constructed: true,
[server]             prefinished: false,
[server]             errorEmitted: false,
[server]             emitClose: false,
[server]             autoDestroy: true,
[server]             errored: null,
[server]             closed: true,
[server]             closeEmitted: true,
[server]             [Symbol(kOnFinished)]: []
[server]           },
[server]           allowHalfOpen: false,
[server]           _sockname: null,
[server]           _pendingData: null,
[server]           _pendingEncoding: '',
[server]           server: null,
[server]           _server: null,
[server]           parser: null,
[server]           _httpMessage: [Circular *1],
[server]           [Symbol(async_id_symbol)]: 6,
[server]           [Symbol(kHandle)]: null,
[server]           [Symbol(lastWriteQueueSize)]: 0,
[server]           [Symbol(timeout)]: null,
[server]           [Symbol(kBuffer)]: null,
[server]           [Symbol(kBufferCb)]: null,
[server]           [Symbol(kBufferGen)]: null,
[server]           [Symbol(kCapture)]: false,
[server]           [Symbol(kSetNoDelay)]: false,
[server]           [Symbol(kSetKeepAlive)]: false,
[server]           [Symbol(kSetKeepAliveInitialDelay)]: 0,
[server]           [Symbol(kBytesRead)]: 168,
[server]           [Symbol(kBytesWritten)]: 274,
[server]           [Symbol(RequestTimeout)]: undefined
[server]         },
[server]         _header: 'GET /query HTTP/1.1\r\n' +
[server]           'Sec-WebSocket-Version: 13\r\n' +
[server]           'Sec-WebSocket-Key: s4XnmtocdYXNFDTvrCZhaw==\r\n' +
[server]           'Connection: Upgrade\r\n' +
[server]           'Upgrade: websocket\r\n' +
[server]           'Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n' +
[server]           'Sec-WebSocket-Protocol: graphql-transport-ws\r\n' +
[server]           'Host: localhost:3000\r\n' +
[server]           '\r\n',
[server]         _keepAliveTimeout: 0,
[server]         _onPendingData: [Function: nop],
[server]         agent: undefined,
[server]         socketPath: undefined,
[server]         method: 'GET',
[server]         maxHeaderSize: undefined,
[server]         insecureHTTPParser: undefined,
[server]         path: '/query',
[server]         _ended: false,
[server]         res: IncomingMessage {
[server]           _readableState: ReadableState {
[server]             objectMode: false,
[server]             highWaterMark: 16384,
[server]             buffer: [BufferList],
[server]             length: 0,
[server]             pipes: [],
[server]             flowing: true,
[server]             ended: true,
[server]             endEmitted: false,
[server]             reading: false,
[server]             constructed: true,
[server]             sync: true,
[server]             needReadable: false,
[server]             emittedReadable: false,
[server]             readableListening: false,
[server]             resumeScheduled: false,
[server]             errorEmitted: false,
[server]             emitClose: true,
[server]             autoDestroy: true,
[server]             destroyed: false,
[server]             errored: null,
[server]             closed: false,
[server]             closeEmitted: false,
[server]             defaultEncoding: 'utf8',
[server]             awaitDrainWriters: null,
[server]             multiAwaitDrain: false,
[server]             readingMore: true,
[server]             dataEmitted: false,
[server]             decoder: null,
[server]             encoding: null,
[server]             [Symbol(kPaused)]: false
[server]           },
[server]           _events: [Object: null prototype] { end: [Function: responseOnEnd] },
[server]           _eventsCount: 1,
[server]           _maxListeners: undefined,
[server]           socket: Socket {
[server]             connecting: false,
[server]             _hadError: false,
[server]             _parent: null,
[server]             _host: 'localhost',
[server]             _readableState: [ReadableState],
[server]             _events: [Object: null prototype],
[server]             _eventsCount: 4,
[server]             _maxListeners: undefined,
[server]             _writableState: [WritableState],
[server]             allowHalfOpen: false,
[server]             _sockname: null,
[server]             _pendingData: null,
[server]             _pendingEncoding: '',
[server]             server: null,
[server]             _server: null,
[server]             parser: null,
[server]             _httpMessage: [Circular *1],
[server]             [Symbol(async_id_symbol)]: 6,
[server]             [Symbol(kHandle)]: null,
[server]             [Symbol(lastWriteQueueSize)]: 0,
[server]             [Symbol(timeout)]: null,
[server]             [Symbol(kBuffer)]: null,
[server]             [Symbol(kBufferCb)]: null,
[server]             [Symbol(kBufferGen)]: null,
[server]             [Symbol(kCapture)]: false,
[server]             [Symbol(kSetNoDelay)]: false,
[server]             [Symbol(kSetKeepAlive)]: false,
[server]             [Symbol(kSetKeepAliveInitialDelay)]: 0,
[server]             [Symbol(kBytesRead)]: 168,
[server]             [Symbol(kBytesWritten)]: 274,
[server]             [Symbol(RequestTimeout)]: undefined
[server]           },
[server]           httpVersionMajor: 1,
[server]           httpVersionMinor: 1,
[server]           httpVersion: '1.1',
[server]           complete: true,
[server]           rawHeaders: [
[server]             'Accept-Ranges',
[server]             'bytes',
[server]             'Date',
[server]             'Tue, 31 Oct 2023 22:14:08 GMT',
[server]             'Connection',
[server]             'keep-alive',
[server]             'Keep-Alive',
[server]             'timeout=5',
[server]             'Transfer-Encoding',
[server]             'chunked'
[server]           ],
[server]           rawTrailers: [],
[server]           aborted: false,
[server]           upgrade: false,
[server]           url: '',
[server]           method: null,
[server]           statusCode: 401,
[server]           statusMessage: 'Unauthorized',
[server]           client: Socket {
[server]             connecting: false,
[server]             _hadError: false,
[server]             _parent: null,
[server]             _host: 'localhost',
[server]             _readableState: [ReadableState],
[server]             _events: [Object: null prototype],
[server]             _eventsCount: 4,
[server]             _maxListeners: undefined,
[server]             _writableState: [WritableState],
[server]             allowHalfOpen: false,
[server]             _sockname: null,
[server]             _pendingData: null,
[server]             _pendingEncoding: '',
[server]             server: null,
[server]             _server: null,
[server]             parser: null,
[server]             _httpMessage: [Circular *1],
[server]             [Symbol(async_id_symbol)]: 6,
[server]             [Symbol(kHandle)]: null,
[server]             [Symbol(lastWriteQueueSize)]: 0,
[server]             [Symbol(timeout)]: null,
[server]             [Symbol(kBuffer)]: null,
[server]             [Symbol(kBufferCb)]: null,
[server]             [Symbol(kBufferGen)]: null,
[server]             [Symbol(kCapture)]: false,
[server]             [Symbol(kSetNoDelay)]: false,
[server]             [Symbol(kSetKeepAlive)]: false,
[server]             [Symbol(kSetKeepAliveInitialDelay)]: 0,
[server]             [Symbol(kBytesRead)]: 168,
[server]             [Symbol(kBytesWritten)]: 274,
[server]             [Symbol(RequestTimeout)]: undefined
[server]           },
[server]           _consuming: false,
[server]           _dumped: true,
[server]           req: [Circular *1],
[server]           [Symbol(kCapture)]: false,
[server]           [Symbol(kHeaders)]: {
[server]             'accept-ranges': 'bytes',
[server]             date: 'Tue, 31 Oct 2023 22:14:08 GMT',
[server]             connection: 'keep-alive',
[server]             'keep-alive': 'timeout=5',
[server]             'transfer-encoding': 'chunked'
[server]           },
[server]           [Symbol(kHeadersCount)]: 10,
[server]           [Symbol(kTrailers)]: null,
[server]           [Symbol(kTrailersCount)]: 0,
[server]           [Symbol(RequestTimeout)]: undefined
[server]         },
[server]         aborted: true,
[server]         timeoutCb: null,
[server]         upgradeOrConnect: false,
[server]         parser: null,
[server]         maxHeadersCount: null,
[server]         reusedSocket: false,
[server]         host: 'localhost',
[server]         protocol: 'http:',
[server]         [Symbol(kCapture)]: false,
[server]         [Symbol(kNeedDrain)]: false,
[server]         [Symbol(corked)]: 0,
[server]         [Symbol(kOutHeaders)]: [Object: null prototype] {
[server]           'sec-websocket-version': [ 'Sec-WebSocket-Version', 13 ],
[server]           'sec-websocket-key': [ 'Sec-WebSocket-Key', 's4XnmtocdYXNFDTvrCZhaw==' ],
[server]           connection: [ 'Connection', 'Upgrade' ],
[server]           upgrade: [ 'Upgrade', 'websocket' ],
[server]           'sec-websocket-extensions': [
[server]             'Sec-WebSocket-Extensions',
[server]             'permessage-deflate; client_max_window_bits'
[server]           ],
[server]           'sec-websocket-protocol': [ 'Sec-WebSocket-Protocol', 'graphql-transport-ws' ],
[server]           host: [ 'Host', 'localhost:3000' ]
[server]         },
[server]         [Symbol(kUniqueHeaders)]: null,
[server]         [Symbol(kAborted)]: true,
[server]         [Symbol(kError)]: undefined
[server]       },
[server]       [Symbol(kCapture)]: false
[server]     },
[server]     [Symbol(kType)]: 'error',
[server]     [Symbol(kError)]: /Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/ws/lib/websocket.js:896
[server]           abortHandshake(
[server]           ^
[server]     
[server]     Error: Unexpected server response: 401
[server]         at ClientRequest.<anonymous> (/Users/vimchiz/github_local/PhD_projects/my-experiment/server/node_modules/ws/lib/websocket.js:896:7)
[server]         at ClientRequest.emit (node:events:513:28)
[server]         at HTTPParser.parserOnIncomingClient (node:_http_client:674:27)
[server]         at HTTPParser.parserOnHeadersComplete (node:_http_common:128:17)
[server]         at Socket.socketOnData (node:_http_client:521:22)
[server]         at Socket.emit (node:events:513:28)
[server]         at addChunk (node:internal/streams/readable:315:12)
[server]         at readableAddChunk (node:internal/streams/readable:289:9)
[server]         at Socket.Readable.push (node:internal/streams/readable:228:10)
[server]         at TCP.onStreamRead (node:internal/stream_base_commons:190:23),
[server]     [Symbol(kMessage)]: 'Unexpected server response: 401'
[server]   }
[server] }
17:14:08.426 ERR callbacks: exited, retrying error="exit status 1"

Anything else?

Things I tried that did not solve the problem

  1. I tried (cd server && npm install); (cd client && npm install); empirica
  2. rm .empirica/local/tajriba.json; empirica
  3. rm -rf .empirica/local; empirica
  4. downgraded the empirica version to 1.8.0 in both client/package.json and server/package.json
    {
    "dependencies": {
    "@empirica/core": "1.8.0",
    "minimist": "1.2.6"
    },
    "devDependencies": {
    "esbuild": "0.14.47"
    },
    "name": "empirica-server",
    "private": true,
    "scripts": {
    "build": "rsync -aP --exclude=node_modules --exclude=*.js -m src/* dist/ && esbuild src/index.js --color=true --log-level=warning --log-level=warning --platform=node --define:process.env.NODE_ENV='\"production\"' --bundle --minify --outfile=dist/index.js --sourcemap",
    "dev": "npm run build && node --trace-warnings --enable-source-maps --unhandled-rejections=warn-with-error-code dist/index.js",
    "serve": "node --trace-warnings --enable-source-maps --unhandled-rejections=warn-with-error-code index.js"
    },
    "volta": {
    "node": "16.17.0",
    "npm": "8.15.0"
    }
    }

Code of Conduct

npaton commented 5 months ago

I have no idea how this might have happened. I would recommend generating a new experiment with the latest version and trying again. I haven't heard this happening since this report, so I'm closing for now.