Plan Checker (neues Studenten-Werkzeug, Seitenleiste + Admin → Plan-Checker- Merkmale): lädt einen Bauplan als PDF hoch und lässt ChatGPT oder Claude ihn gegen eine gepflegte Merkmalsliste prüfen. PDF-Rendering (pdf.js + @napi-rs/canvas) berücksichtigt jetzt Ebenen (Optional Content Groups) und WASM-Decoder korrekt, sendet eine Übersicht plus mehrere hochaufgelöste Kachel-Ausschnitte statt eines einzelnen, zu groben Bilds, und beide Anbieter bekommen dasselbe Bildmaterial. Jedes Prüfergebnis kann auf eines der gesendeten Bilder als Beleg verweisen (bildIndex) — als Screenshot im Ergebnis anklickbar, öffnet vergrößert in einem Modal statt eines von Chrome blockierten target=_blank-Links auf eine data:-URL. KI-Modellname ist jetzt pro Konto überschreibbar (Einstellungen → Mein Konto) für Drittanbieter mit abweichendem Modell-Katalog. Wochenbericht: dichte Kartenansicht bekommt einen Fokus-Modus — nur der Kommentar liegt offen, Leistungsphasen und Beteiligte stecken in aufklappbaren Abschnitten statt dauerhaft nebeneinander zu stehen. Projektbereich: Terminplan-Auslastung rechnet jetzt exakt wie der Auslastungs-Tab/die Wandtafel (statt einer unabhängigen, tageweisen Schätzung); die LPH-Fortschrittsliste im Dashboard zeigt nur noch die beauftragten Leistungsphasen. Wandtafel: Dashboard-Kopf mit Kennzahlen-Reihe und Panel-Reihe neu strukturiert, in den Blautönen des Firmenlogos; dieselbe Palette wurde anschließend auf den gesamten App-weiten Dark Mode übernommen. Dateibereinigung: nicht mehr benötigte Test-Uploads/Backups entfernt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
13 KiB
H2CClient
Stability: 2 - Stable
An H2CClient is a Dispatcher that speaks HTTP/2 in cleartext (h2c) over a
single TCP connection to an http: origin, without the protocol upgrade or prior
knowledge negotiation that a regular Client performs. It is a thin
specialization of Client that forces allowH2 and useH2c on and aliases
pipelining to maxConcurrentStreams, so multiple requests are multiplexed as
HTTP/2 streams rather than pipelined HTTP/1.x requests.
Use an H2CClient when the server is known to accept cleartext HTTP/2 directly,
for example a service behind a trusted proxy or in a test environment. Only the
http: protocol is supported; passing any other protocol throws
InvalidArgumentError.
import { H2CClient } from 'undici'
const client = new H2CClient('http://localhost:3000')
const { statusCode, body } = await client.request({ path: '/', method: 'GET' })
console.log(statusCode)
console.log(await body.text())
Class: H2CClient
- Extends: {Client}
H2CClient inherits the full instance API of Client (and therefore of
Dispatcher). The sections below cover the surface that is meaningful for an
h2c client; refer to Dispatcher for the complete semantics of each method
and event.
new H2CClient(url[, options])
url{URL|string} The origin to connect to. Should include only the protocol, hostname, and port. Only thehttp:protocol is supported.options{H2CClientOptions} (optional)maxConcurrentStreams{number} The maximum number of concurrent HTTP/2 streams for the session. It is advertised to the server and may be overridden by a remoteSETTINGSframe. Must be a positive integer. Default:100.pipelining{number} The number of concurrent requests multiplexed over the single connection. For anH2CClientthis is aliased tomaxConcurrentStreamsand may not exceed it. Must be a positive integer. Default:100.maxHeaderSize{number} The maximum length of request headers in bytes. Default: Node.js'--max-http-header-sizeor16384(16 KiB).headersTimeout{number} The amount of time, in milliseconds, the parser waits to receive the complete HTTP headers. Default:300e3.connectTimeout{number} The timeout for establishing a socket connection, in milliseconds. Use0to disable it entirely. Default:10e3.bodyTimeout{number} The timeout, in milliseconds, after which a request times out. Monitors the time between received body data. Use0to disable it entirely. Default:300e3.keepAliveTimeout{number} The timeout, in milliseconds, after which a socket without active requests times out. May be overridden by keep-alive hints from the server. Default:4e3.keepAliveMaxTimeout{number} The maximum allowedkeepAliveTimeout, in milliseconds, when overridden by keep-alive hints from the server. Default:600e3.keepAliveTimeoutThreshold{number} A number of milliseconds subtracted from server keep-alive hints when overridingkeepAliveTimeout, to account for timing inaccuracies such as transport latency. Default:1e3.socketPath{string} An IPC endpoint, either a Unix domain socket or a Windows named pipe. Default:null.strictContentLength{boolean} Iftrue, an error is thrown when the requestcontent-lengthheader does not match the length of the request body. Default:true.maxCachedSessions{number} The maximum number of TLS sessions cached by the built-in connector. Use0to disable TLS session caching. Default:100.connect{Object|Function} Connector options passed tobuildConnector, or a custom connector function. TheallowH2option may not be set here. Default:null.maxRequestsPerClient{number} The maximum number of requests to send over a single connection before it is reset. Use0to disable this limit. Default:null.localAddress{string} The local IP address the socket should connect from.maxResponseSize{number} The maximum allowed response body size in bytes. Use-1to disable. Default:-1.autoSelectFamily{boolean} Enables a family autodetection algorithm that loosely implements section 5 of RFC 8305. Ignored if not supported by the current Node.js version.autoSelectFamilyAttemptTimeout{number} The amount of time, in milliseconds, to wait for a connection attempt to finish before trying the next address whenautoSelectFamilyis enabled.
Creates a new H2CClient for the given origin. The client does not connect until
a request is queued; call h2cClient.connect()
to connect eagerly.
import { H2CClient } from 'undici'
const client = new H2CClient('http://localhost:3000')
h2cClient.close([callback])
callback{Function} (optional) Invoked once all queued requests have settled and the client is closed.- Returns: {Promise|undefined} A
Promisethat resolves once the client is closed, whencallbackis not provided.
Closes the client and gracefully waits for enqueued requests to complete before
resolving. See [dispatcher.close([callback])][].
h2cClient.destroy([error[, callback]])
error{Error} (optional) The error with which to reject pending requests. Default:null.callback{Function} (optional) Invoked once the client is destroyed.- Returns: {Promise|undefined} A
Promisethat resolves once the client is destroyed, whencallbackis not provided.
Destroys the client abruptly, aborting any pending requests. Waits until the
socket is closed before invoking callback (or resolving the returned Promise).
See [dispatcher.destroy([error[, callback]])][].
h2cClient.connect(options[, callback])
options{Object}path{string}headers{Object} (optional) Default:null.signal{AbortSignal|EventEmitter|null} (optional) Default:null.opaque{any} (optional) An opaque value passed through to the returned connect data.responseHeaders{string|null} (optional) Set to'raw'to return the response headers as a raw array instead of an object. Default:null.
callback{Function} (optional) Invoked with(err, data)once the connection is established. If omitted, aPromiseis returned instead.- Returns: {Promise|undefined} A
Promiseresolving to the connect data, whencallbackis not provided.
Starts an HTTP CONNECT request. See [dispatcher.connect(options[, callback])][].
h2cClient.dispatch(options, handlers)
options{Object} The request options.handlers{Object} The dispatch handler callbacks.- Returns: {boolean}
falseif the dispatcher is busy and the caller should wait for the'drain'event before dispatching again.
The lowest-level request API. All other request methods are implemented on top of
it. See [dispatcher.dispatch(options, handler)][].
h2cClient.pipeline(options, handler)
options{Object} The request options.handler{Function} A handler that receives the response data and returns a {Readable} body.- Returns: {Duplex} A duplex stream for the request body and response body.
Sends a request and returns a duplex stream, suitable for piping. See
[dispatcher.pipeline(options, handler)][].
h2cClient.request(options[, callback])
options{Object} The request options.callback{Function} (optional) Invoked with(err, data)once the response is received. If omitted, aPromiseis returned instead.- Returns: {Promise|undefined} A
Promiseresolving to the response data, whencallbackis not provided.
Performs an HTTP request. See [dispatcher.request(options[, callback])][].
h2cClient.stream(options, factory[, callback])
options{Object} The request options.factory{Function} A factory that returns a {Writable} to which the response body is written.callback{Function} (optional) Invoked once the request completes. If omitted, aPromiseis returned instead.- Returns: {Promise|undefined} A
Promisethat resolves once the request completes, whencallbackis not provided.
Sends a request and writes the response body to the stream returned by factory.
See [dispatcher.stream(options, factory[, callback])][].
h2cClient.upgrade(options[, callback])
options{Object} The request options.callback{Function} (optional) Invoked with(err, data)once the upgrade completes. If omitted, aPromiseis returned instead.- Returns: {Promise|undefined} A
Promiseresolving to the upgrade data, whencallbackis not provided.
Upgrades a connection to a different protocol. See
[dispatcher.upgrade(options[, callback])][].
h2cClient.closed
- Type: {boolean}
true after h2cClient.close() has been called.
h2cClient.destroyed
- Type: {boolean}
true after h2cClient.destroy() has been
called, or after h2cClient.close() has been called
and the client shutdown has completed.
h2cClient.pipelining
- Type: {number}
Gets and sets the pipelining factor, i.e. the number of requests multiplexed over the connection.
Event: 'connect'
origin{URL}targets{Array}
Emitted when the socket has been created and connected. The client connects once
client.size > 0. See Dispatcher Event: 'connect'.
import { createServer } from 'node:http2'
import { once } from 'node:events'
import { H2CClient } from 'undici'
const server = createServer((request, response) => {
response.end('Hello, World!')
}).listen()
await once(server, 'listening')
const client = new H2CClient(`http://localhost:${server.address().port}`)
client.on('connect', (origin) => {
console.log(`Connected to ${origin}`)
})
const { body } = await client.request({ path: '/', method: 'GET' })
console.log(await body.text())
client.close()
server.close()
Event: 'disconnect'
origin{URL}targets{Array}error{Error}
Emitted when the socket has disconnected. The error argument is the error that
caused the socket to disconnect. The client reconnects if (or once)
client.size > 0. See Dispatcher Event: 'disconnect'.
import { createServer } from 'node:http2'
import { once } from 'node:events'
import { H2CClient } from 'undici'
const server = createServer((request, response) => {
response.destroy()
}).listen()
await once(server, 'listening')
const client = new H2CClient(`http://localhost:${server.address().port}`)
client.on('disconnect', (origin) => {
console.log(`Disconnected from ${origin}`)
})
try {
await client.request({ path: '/', method: 'GET' })
} catch (error) {
console.error(error.message)
} finally {
client.close()
server.close()
}
Event: 'drain'
origin{URL}
Emitted when the client is no longer busy and can accept more requests. See
Dispatcher Event: 'drain'.
Event: 'error'
error{Error}
Emitted for user errors, such as an error thrown from an onResponseError
handler.
[dispatcher.close([callback])]: Dispatcher.md#dispatcherclosecallback
[dispatcher.connect(options[, callback])]: Dispatcher.md#dispatcherconnectoptions-callback
[dispatcher.destroy([error[, callback]])]: Dispatcher.md#dispatcherdestroyerror-callback
[dispatcher.dispatch(options, handler)]: Dispatcher.md#dispatcherdispatchoptions-handler
[dispatcher.pipeline(options, handler)]: Dispatcher.md#dispatcherpipelineoptions-handler
[dispatcher.request(options[, callback])]: Dispatcher.md#dispatcherrequestoptions-callback
[dispatcher.stream(options, factory[, callback])]: Dispatcher.md#dispatcherstreamoptions-factory-callback
[dispatcher.upgrade(options[, callback])]: Dispatcher.md#dispatcherupgradeoptions-callback