274		/*
275		 * the transport finished: a server starts on the request, an h1 client
276		 * on sending one, an mqtt client on its CONNECT, the rest are up
277		 */
278		R("h1", "C", LRS_UNCONNECTED,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2), /* inherited from an idle leader */
279		/* mqtt over tls, or through a socks5 (LWS_WITH_SOCKS5) or http CONNECT proxy */
280		R("mqtt", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
281		R("mqtt", "C", LRS_WAITING_SSL,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
282		R("mqtt", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
283		R("mqtt", "C", LRS_WAITING_PROXY_REPLY,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_MQTTC_IDLE),
284		R("raw-skt", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
285		R("raw-skt", "C", LRS_WAITING_SSL,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
286		R("raw-skt", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
287		R("raw-skt", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
288		/*
289		 * the raw proxy's onward connections are raw clients too
290		 * (LWS_ROLE_RAW_PROXY, protocol_lws_raw_proxy; the plugin never asks
291		 * for tls, an app's own raw-proxy client may)
292		 */
293		R("raw-proxy", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
294		R("raw-proxy", "C", LRS_WAITING_SSL,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
295		R("raw-proxy", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
296		R("raw-proxy", "C", LRS_WAITING_PROXY_REPLY, LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
297		R("quic", "C", LRS_WAITING_SSL,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
298		R("quic", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
299		R("quic", "S", LRS_SSL_INIT,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
300		R("h1", "S", LRS_SSL_ACK_PENDING,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_HEADERS),
301		/* the accept on a worker: LWS_WITH_ASYNC_QUEUE with LWS_MAX_SMP > 1 */
302		R("h1", "S", LRS_AWAITING_SSL_ACCEPT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_HEADERS),
303		R("*",  "S", LRS_SSL_ACK_PENDING,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
304		R("*",  "S", LRS_AWAITING_SSL_ACCEPT,	LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
305		/* the non-tls fallback already established the wsi before the accept path reports the transport up */
306		R("*", "S", LRS_ESTABLISHED,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
307		/* 0-RTT: the ALPN migration ran inside the handshake, so handshake-done finds the new nwsi established */
308		R("quic", "*", LRS_ESTABLISHED,		LWS_WSIEV_TRANSPORT_UP, NULL, NULL, LRS_ESTABLISHED),
309	
310		/* an h1 client's tcp is up before its tls */
311		R("h1", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
312		/* a socks or http CONNECT tunnel coming up is the socket connecting, for the protocol */
313		R("h1", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
314		R("h1", "C", LRS_WAITING_PROXY_REPLY,	LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE),
315		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2,	LWS_WSIEV_SOCKET_CONNECTED, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
316	
317		/* a client request queued on, or issued by, a connection */
318		/* any client role may queue behind a leader: raw-skt and mqtt do too */
319		R("*", "C", LRS_UNCONNECTED,		LWS_WSIEV_QUEUED, NULL, NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
320		R("h1", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
321		R("quic", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2), /* h3 queue pickup */
322		R("h1", "C", LRS_ESTABLISHED,		LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
323		R("h1", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_REQ_ISSUE, NULL, NULL, LRS_H1C_ISSUE_HANDSHAKE2),
324	
325		/* the request goes out, then its response is pending */
326		R("h1", "C", LRS_WAITING_SSL,		LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
327		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE,	LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
328		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2,	LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
329		R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
330		R("h3", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
331		R("h1", "C", LRS_WAITING_SSL,		LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
332		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE,	LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
333		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE2,	LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
334		R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
335		R("h3", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_REQ_HDRS_SENT_BODY, NULL, NULL, LRS_ISSUE_HTTP_BODY),
336		R("*",  "C", LRS_ISSUE_HTTP_BODY,	LWS_WSIEV_REQ_BODY_SENT, NULL, NULL, LRS_WAITING_SERVER_REPLY),
337		R("h1", "C", LRS_ESTABLISHED,		LWS_WSIEV_RESP_INTERIM, NULL, NULL, LRS_WAITING_SERVER_REPLY),
338		/* a ws client takes no response headers but the 101's: it is still waiting */
339		R("h1", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_RESP_INTERIM, NULL, NULL, LRS_WAITING_SERVER_REPLY),
340	
341		/* the response is done: idle, or an idle connection is picked up */
342		R("h1", "C", LRS_ESTABLISHED,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_IDLING),
343		R("*",  "C", LRS_IDLING,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_IDLING), /* only an app reading on past the end of an unframed body */
344		R("h2", "C", LRS_ESTABLISHED,		LWS_WSIEV_LAST_STREAM_CLOSED, NULL, NULL, LRS_IDLING),
345		R("quic", "C", LRS_ESTABLISHED,		LWS_WSIEV_LAST_STREAM_CLOSED, NULL, NULL, LRS_IDLING),
346		R("h2", "C", LRS_IDLING,		LWS_WSIEV_CONN_REUSED, NULL, NULL, LRS_ESTABLISHED),
347		R("quic", "C", LRS_IDLING,		LWS_WSIEV_CONN_REUSED, NULL, NULL, LRS_ESTABLISHED),
348	
349		/* mqtt client handshake */
350		R("mqtt", "C", LRS_MQTTC_IDLE,		LWS_WSIEV_MQTT_CONNECT_SENT, NULL, NULL, LRS_MQTTC_AWAIT_CONNACK),
351		R("mqtt", "C", LRS_MQTTC_AWAIT_CONNACK,	LWS_WSIEV_MQTT_CONNACK, NULL, NULL, LRS_ESTABLISHED),
352	
353		/* h2 connection preface */
354		R("h2", "S", LRS_H2_AWAIT_PREFACE,	LWS_WSIEV_H2_PREFACE_RX, NULL, NULL, LRS_H2_AWAIT_SETTINGS),
355		R("h2", "S", LRS_H2_AWAIT_SETTINGS,	LWS_WSIEV_H2_SETTINGS_ACKED, NULL, NULL, LRS_ESTABLISHED),
356	
357		/* request headers: h1 decides on the upgrade, mux streams defer the action */
358		R("h1", "S", LRS_HEADERS,		LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_H1_UPGRADE),
359		R("h1", "S", LRS_ESTABLISHED,		LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_H1_UPGRADE), /* the next request, after a file completion the app did not complete */
360		R("h2", "S", LRS_HEADERS,		LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_DEFERRING_ACTION),
361		R("h3", "S", LRS_HEADERS,		LWS_WSIEV_REQ_HDRS_COMPLETE, NULL, NULL, LRS_DEFERRING_ACTION),
362		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_REQ_PLAIN_HTTP, NULL, NULL, LRS_ESTABLISHED),
363		R("h2", "S", LRS_DEFERRING_ACTION,	LWS_WSIEV_ACTION_DEFERRED_RUN, NULL, NULL, LRS_ESTABLISHED),
364		R("h3", "S", LRS_DEFERRING_ACTION,	LWS_WSIEV_ACTION_DEFERRED_RUN, NULL, NULL, LRS_ESTABLISHED),
365	
366		/* acting on the request */
367		R("h1", "S", LRS_ESTABLISHED,		LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
368		R("h2", "S", LRS_HEADERS,		LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
369		R("h2", "S", LRS_ESTABLISHED,		LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
370		R("h3", "S", LRS_ESTABLISHED,		LWS_WSIEV_ACTION_BEGIN, NULL, NULL, LRS_DOING_TRANSACTION),
371	
372		/* request body */
373		R("h1", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
374		R("h2", "*", LRS_ESTABLISHED,		LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
375		R("h3", "*", LRS_ESTABLISHED,		LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY),
376		R("h3", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY), /* action ran, body follows: as h1 */
377		R("h2", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_BEGIN, NULL, NULL, LRS_BODY), /* same on h2 */
378		/*
379		 * an h1 body is complete before its answer is: the connection's next
380		 * request, pipelined behind it, waits parked for the transaction
381		 */
382		R("h1", "S", LRS_BODY,			LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_DOING_TRANSACTION),
383		R("h2", "S", LRS_BODY,			LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
384		R("h3", "S", LRS_BODY,			LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
385		/* the body completion callback may itself have started serving a file (C-522) */
386		R("h2", "S", LRS_ISSUING_FILE,		LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ISSUING_FILE),
387		R("h3", "S", LRS_ISSUING_FILE,		LWS_WSIEV_BODY_COMPLETE, NULL, NULL, LRS_ISSUING_FILE),
388		R("h1", "S", LRS_BODY,			LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
389		/* the user may complete the transaction before the body was ever delivered */
390		R("h1", "S", LRS_ESTABLISHED,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
391		R("h1", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
392		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
393		/* the completion runs for mux streams too: there DISCARD_BODY drops the stash and closes the stream */
394		R("h2", "S", LRS_ESTABLISHED,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
395		R("h2", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
396		R("h3", "S", LRS_ESTABLISHED,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
397		R("h3", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
398		R("h2", "S", LRS_BODY,			LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
399		R("h3", "S", LRS_BODY,			LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
400		R("h2", "S", LRS_ISSUING_FILE,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
401		R("h3", "S", LRS_ISSUING_FILE,		LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
402		/* ...or abandoned with a read of the file out on a worker, reaped by the completion */
403		R("h2", "S", LRS_AWAITING_FILE_READ,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
404		R("h3", "S", LRS_AWAITING_FILE_READ,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
405	
406		/* the h1 transaction ends and the connection is reused */
407		/*
408		 * the user completed it with its response still queued: completion
409		 * waits for that to go, from wherever the transaction had got to
410		 */
411		R("h1", "S", LRS_ESTABLISHED,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
412		R("h1", "S", LRS_BODY,			LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
413		R("h1", "S", LRS_DISCARD_BODY,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app writing after it completed */
414		R("h1", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
415		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
416		R("h1", "S", LRS_TXN_COMPLETED,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app answering again after it completed */
417		R("h1", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app completing twice */
418		R("h2", "S", LRS_HEADERS,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
419		R("h2", "S", LRS_ESTABLISHED,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
420		R("h2", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
421		R("h2", "S", LRS_BODY,			LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
422		R("h2", "S", LRS_DISCARD_BODY,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
423		R("h2", "S", LRS_ISSUING_FILE,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
424		R("h2", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING), /* only an app completing twice */
425		R("h3", "S", LRS_ESTABLISHED,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
426		R("h3", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
427		R("h3", "S", LRS_BODY,			LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
428		R("h3", "S", LRS_DISCARD_BODY,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
429		R("h3", "S", LRS_ISSUING_FILE,		LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
430		R("h3", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
431		/*
432		 * a file being served, a read of it out on a worker, that the app
433		 * completed from under (an h2 / h3 body completion, its own timer):
434		 * the completion waits for the answer queued so far as any other
435		 */
436		R("h2", "S", LRS_AWAITING_FILE_READ,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
437		R("h3", "S", LRS_AWAITING_FILE_READ,	LWS_WSIEV_TXN_COMPLETING, NULL, NULL, LRS_TXN_COMPLETING),
438		/* ...and once it has, it completes, or first discards an unread body */
439		R("h1", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
440		R("h1", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
441		R("h2", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
442		R("h3", "S", LRS_TXN_COMPLETING,	LWS_WSIEV_BODY_DISCARD, NULL, NULL, LRS_DISCARD_BODY),
443	
444		R("h1", "S", LRS_ESTABLISHED,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
445		R("h1", "S", LRS_BODY,			LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
446		R("h1", "S", LRS_DISCARD_BODY,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
447		R("h1", "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED),
448		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED), /* upgrade refused */
449		R("h1", "S", LRS_TXN_COMPLETED,		LWS_WSIEV_TXN_COMPLETED, NULL, NULL, LRS_TXN_COMPLETED), /* only an app completing twice */
450		R("h1", "S", LRS_TXN_COMPLETED,		LWS_WSIEV_TXN_DRAINED, NULL, NULL, LRS_HEADERS),
451	
452		/* serving a file */
453		R("*",  "S", LRS_ESTABLISHED,		LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),
454		R("h2", "S", LRS_HEADERS,		LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),	/* h2c upgrade stream 1 */
455		R("*",  "S", LRS_DOING_TRANSACTION,	LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),
456		R("*",  "S", LRS_BODY,			LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),	/* served from HTTP_BODY_COMPLETION */
457		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_FILE_BEGIN, NULL, NULL, LRS_ISSUING_FILE),	/* served from HTTP_CONFIRM_UPGRADE */
458		/* a file read on a worker: LWS_WITH_ASYNC_QUEUE */
459		R("*",  "S", LRS_ISSUING_FILE,		LWS_WSIEV_FILE_READ_QUEUED, NULL, NULL, LRS_AWAITING_FILE_READ),
460		R("*",  "S", LRS_AWAITING_FILE_READ,	LWS_WSIEV_FILE_READ_DONE, NULL, NULL, LRS_ISSUING_FILE),
461		R("*",  "S", LRS_ISSUING_FILE,		LWS_WSIEV_FILE_COMPLETE, NULL, NULL, LRS_ESTABLISHED),
462	
463		/* ---- role changes ---- */
464	
465		/* birth on a server, adoption, the client bind, a restart */
466		R("(none)", "-", LRS_UNCONNECTED,	LWS_WSIEV_SERVER_SIDE, NULL, "S", LRS_UNCONNECTED),
467		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_ADOPTED_TLS, "?", NULL, LRS_SSL_INIT),
468		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_ADOPTED, "h1", NULL, LRS_HEADERS),
469		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_ADOPTED, "?", NULL, LRS_ESTABLISHED),
470		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_CLIENT_BIND, "?", "C", LRS_UNCONNECTED),
471		R("*", "C", ANY,			LWS_WSIEV_RESTART, "?", "C", LRS_UNCONNECTED),
472	
473		/* mux children: a fresh child is its parent's; a server's opened stream reads its request */
474		R("(none)", "*", LRS_UNCONNECTED,	LWS_WSIEV_MUX_INSERTED, "P", "P", LRS_UNCONNECTED),
475		R("h2", "S", LRS_UNCONNECTED,		LWS_WSIEV_STREAM_OPENED, NULL, NULL, LRS_HEADERS),
476		R("h2", "C", LRS_UNCONNECTED,		LWS_WSIEV_STREAM_OPENED, NULL, NULL, LRS_UNCONNECTED),
477		R("quic", "S", LRS_UNCONNECTED,		LWS_WSIEV_STREAM_OPENED, "h3", NULL, LRS_HEADERS),
478		R("quic", "C", LRS_UNCONNECTED,		LWS_WSIEV_STREAM_OPENED, "h3", NULL, LRS_ESTABLISHED),
479		R("quic", "*", LRS_UNCONNECTED,		LWS_WSIEV_STREAM_OPENED, "quic", NULL, LRS_ESTABLISHED),
480	
481		/* a client stream is let onto its connection: h2 / h3 send a request, mqtt is up */
482		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_MUX_STREAM_ADOPTED, "h2", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
483		R("*", "*", LRS_H1C_ISSUE_HANDSHAKE2,	LWS_WSIEV_MUX_STREAM_ADOPTED, "h2", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
484		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
485		R("*", "*", LRS_H1C_ISSUE_HANDSHAKE2,	LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
486		R("*", "*", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_STREAM_ADOPTED, "h3", "P", LRS_H2_WAITING_TO_SEND_HEADERS),
487		R("*", "*", LRS_UNCONNECTED,		LWS_WSIEV_MUX_STREAM_ADOPTED, "mqtt", "P", LRS_ESTABLISHED),
488		R("*", "*", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_STREAM_ADOPTED, "mqtt", "P", LRS_ESTABLISHED),
489	
490		/* our own h3 unidirectional streams, and a wsi taking over a quic connection */
491		R("(none)", "*", LRS_UNCONNECTED,	LWS_WSIEV_CONTROL_STREAM_OPENED, "h3", "L", LRS_ESTABLISHED),
492		R("(none)", "*", LRS_UNCONNECTED,	LWS_WSIEV_CONN_TAKEOVER, "?", "L", LRS_ESTABLISHED),
493	
494		/* the quic handshake chose h3 (a client stream sends, a server stream reads) or not */
495		/*
496		 * the h3 alpn walk moves children it finds unconnected or connecting;
497		 * no path is known to leave one so, but the walk asks
498		 */
499		R("*", "C", LRS_UNCONNECTED,		LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
500		R("*", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
501		R("quic", "C", ANY,			LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
502		R("quic", "S", ANY,			LWS_WSIEV_ALPN_DONE, "h3", NULL, LRS_HEADERS),
503		R("quic", "*", ANY,			LWS_WSIEV_ALPN_DONE, "quic", NULL, LRS_ESTABLISHED),
504	
505		/*
506		 * the h2 client nwsi hands its own request to the sid-1 child and is
507		 * from then on the carrier of streams only: established
508		 */
509		R("h2", "C", LRS_H2_WAITING_TO_SEND_HEADERS, LWS_WSIEV_MUX_MIGRATED, NULL, NULL, LRS_ESTABLISHED),
510	
511		/* h2: chosen by alpn, h2c upgrade or prior knowledge; the client preface */
512		R("h1", "S", LRS_HEADERS,		LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
513		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
514		R("(none)", "S", LRS_UNCONNECTED,	LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
515		R("h1", "C", LRS_H1C_ISSUE_HANDSHAKE,	LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
516		R("h1", "C", LRS_WAITING_SSL,		LWS_WSIEV_H2_SELECTED, "h2", NULL, LRS_H2_AWAIT_PREFACE),
517		R("h2", "C", LRS_H2_AWAIT_PREFACE,	LWS_WSIEV_H2_PREFACE_SENT, NULL, NULL, LRS_H2_WAITING_TO_SEND_HEADERS),
518	
519		/* ws upgrade, on a server from the upgrade decision, on a client from the 101 */
520		R("h1", "S", LRS_H1_UPGRADE,		LWS_WSIEV_WS_UPGRADED, "ws", NULL, LRS_ESTABLISHED),
521		R("h2", "S", LRS_ESTABLISHED,		LWS_WSIEV_WS_UPGRADED, "ws", "Se", LRS_ESTABLISHED),
522		R("h3", "S", LRS_ESTABLISHED,		LWS_WSIEV_WS_UPGRADED, "ws", "Se", LRS_ESTABLISHED), /* RFC 9220 */
523		R("h1", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_WS_UPGRADED, "ws", NULL, LRS_ESTABLISHED),
524		R("h2", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_WS_UPGRADED, "ws", "Ce", LRS_ESTABLISHED),
525		R("h3", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_WS_UPGRADED, "ws", "Ce", LRS_ESTABLISHED), /* RFC 9220 */
526	
527		/* the client's response headers; webtransport; raw */
528		R("*", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_RESP_HDRS, NULL, NULL, LRS_ESTABLISHED),
529		/* a server may answer before the request body is finished (401, 413...) */
530		R("*", "C", LRS_ISSUE_HTTP_BODY,	LWS_WSIEV_RESP_HDRS, NULL, NULL, LRS_ESTABLISHED),
531		R("h3", "C", LRS_WAITING_SERVER_REPLY,	LWS_WSIEV_WT_SESSION, "wt", NULL, LRS_ESTABLISHED),
532		R("h3", "S", ANY,			LWS_WSIEV_WT_SESSION, "wt", NULL, LRS_ESTABLISHED),
533		R("h3", "*", ANY,			LWS_WSIEV_WT_STREAM, "wt", NULL, LRS_ESTABLISHED),
534		R("(none)", "*", LRS_UNCONNECTED,	LWS_WSIEV_WT_STREAM, "wt", "L", LRS_ESTABLISHED),
535		R("*", "S", LRS_HEADERS,		LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
536		/* the non-tls fallback on a tls listener, from the first byte peek in the accept */
537		R("*", "S", LRS_SSL_ACK_PENDING,	LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
538		/* a later request on a kept-alive connection, and a listener already in the raw role */
539		R("*", "S", LRS_ESTABLISHED,		LWS_WSIEV_RAW_UPGRADED, "?", NULL, LRS_ESTABLISHED),
540		/* ---- transport machine ---- */
541	
542		R("*", "C", LRS_UNCONNECTED,		LWS_WSIEV_DNS_START, NULL, NULL, XT(LTS_WAITING_DNS)),
543		R("*", "C", LRS_WAITING_DNS,		LWS_WSIEV_DNS_RETRY, NULL, NULL, XT(LTS_NONE)),
544		R("*", "C", LRS_UNCONNECTED,		LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),
545		R("*", "C", LRS_WAITING_DNS,		LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),
546		R("*", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),	/* next address */
547		R("*", "C", LRS_WAITING_SSL,		LWS_WSIEV_CONNECT_START, NULL, NULL, XT(LTS_WAITING_CONNECT)),	/* quic to tcp */
548		R("*", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_PROXY_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_PROXY_REPLY)),
549		R("*", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_SOCKS_GREETING_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_GREETING_REPLY)),
550		R("*", "C", LRS_WAITING_SOCKS_GREETING_REPLY, LWS_WSIEV_SOCKS_AUTH_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_AUTH_REPLY)),
551		R("*", "C", LRS_WAITING_SOCKS_GREETING_REPLY, LWS_WSIEV_SOCKS_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_CONNECT_REPLY)),
552		R("*", "C", LRS_WAITING_SOCKS_AUTH_REPLY, LWS_WSIEV_SOCKS_CONNECT_SENT, NULL, NULL, XT(LTS_WAITING_SOCKS_CONNECT_REPLY)),
553		R("*", "C", LRS_WAITING_CONNECT,	LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
554		R("*", "C", LRS_WAITING_PROXY_REPLY,	LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
555		R("*", "C", LRS_WAITING_SOCKS_CONNECT_REPLY, LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
556		R("*", "C", LRS_H1C_ISSUE_HANDSHAKE,	LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
557		R("*", "C", LRS_WAITING_SSL,		LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),	/* more service */
558		/*
559		 * STARTTLS: an established raw client starts tls inside its protocol
560		 * (the smtp client, LWS_WITH_EMAIL)
561		 */
562		R("raw-skt", "C", LRS_ESTABLISHED,	LWS_WSIEV_TLS_START, NULL, NULL, XT(LTS_WAITING_SSL)),
563		R("*", "S", LRS_SSL_INIT,		LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
564		R("*", "S", LRS_SSL_ACK_PENDING,	LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
565		/* each step of the accept on a worker: LWS_WITH_ASYNC_QUEUE with LWS_MAX_SMP > 1 */
566		R("*", "S", LRS_AWAITING_SSL_ACCEPT,	LWS_WSIEV_TLS_ACCEPT_PENDING, NULL, NULL, XT(LTS_SSL_ACK_PENDING)),
567		R("*", "S", LRS_SSL_ACK_PENDING,	LWS_WSIEV_TLS_ACCEPT_QUEUED, NULL, NULL, XT(LTS_AWAITING_SSL_ACCEPT)),
568		R("*", "C", ANY,			LWS_WSIEV_CONN_FAILED, NULL, NULL, XT(LTS_FAILED)),
569		R("*", "C", ANY,			LWS_WSIEV_RETARGET, NULL, NULL, XT(LTS_RESTARTING)),
570	
571		/* ---- close machine: the polite ws close is specific, the rest can come from anywhere ---- */
572	
573		R("ws", "*", LRS_ESTABLISHED,		LWS_WSIEV_WS_CLOSE_INITIATED, NULL, NULL, XC(LCS_WAITING_TO_SEND_CLOSE)),
574		R("ws", "*", LRS_WAITING_TO_SEND_CLOSE,	LWS_WSIEV_WS_CLOSE_SENT, NULL, NULL, XC(LCS_AWAITING_CLOSE_ACK)),
575		R("ws", "*", LRS_ESTABLISHED,		LWS_WSIEV_WS_PEER_CLOSE, NULL, NULL, XC(LCS_RETURNED_CLOSE)),
576		/*
577		 * his CLOSE beat the one we were about to send: answer his and drop
578		 * ours.  Only ws over a mux stream gets here: its network connection
579		 * goes on reading for its other streams, where a ws connection of its
580		 * own reads nothing more until its close has gone
581		 */
582		R("ws", "*", LRS_WAITING_TO_SEND_CLOSE,	LWS_WSIEV_WS_PEER_CLOSE, NULL, NULL, XC(LCS_RETURNED_CLOSE)),
583		/*
584		 * the close is entered: a flush the live connection had begun is now
585		 * the close's own, else the close has begun with nothing to wait for
586		 */
587		R("*", "*", LRS_FLUSHING_BEFORE_CLOSE,	LWS_WSIEV_CLOSE_ENTERED, NULL, NULL, XC(LCS_FLUSHING_BEFORE_CLOSE)),
588		R("*", "*", ANY,			LWS_WSIEV_CLOSE_ENTERED, NULL, NULL, XC(LCS_CLOSING)),
589		R("*", "*", ANY,			LWS_WSIEV_CLOSE_FLUSH, NULL, NULL, XC(LCS_FLUSHING_BEFORE_CLOSE)),
590		R("*", "*", ANY,			LWS_WSIEV_CLOSE_WHEN_FLUSHED, NULL, NULL, XC(LCS_CLOSE_WHEN_FLUSHED)),
591		R("*", "S", ANY,			LWS_WSIEV_CLOSE_STAGED, NULL, NULL, XC(LCS_SHUTDOWN)),
592		R("*", "*", ANY,			LWS_WSIEV_SOCKET_GONE, NULL, NULL, XC(LCS_DEAD_SOCKET)),
593		R("*", "*", LRS_DEAD_SOCKET,		LWS_WSIEV_USER_TOLD, NULL, NULL, XC(LCS_USER_TOLD)),
594	
