From ce44f86fe0dfecf99e56849a65f04cfaae5c1a9d Mon Sep 17 00:00:00 2001 From: exoego Date: Thu, 3 Oct 2019 11:01:42 +0900 Subject: [PATCH] Add http2 module --- .../nodejs/http/ConnectionOptions.scala | 2 +- .../nodejs/http2/ClientHttp2Session.scala | 9 + .../nodejs/http2/ClientHttp2Stream.scala | 6 + .../io/scalajs/nodejs/http2/HasOrigin.scala | 7 + .../scala/io/scalajs/nodejs/http2/Http2.scala | 35 +++ .../nodejs/http2/Http2ConnectOptions.scala | 58 +++++ .../scalajs/nodejs/http2/Http2Constants.scala | 245 ++++++++++++++++++ .../scalajs/nodejs/http2/Http2Headers.scala | 146 +++++++++++ .../scalajs/nodejs/http2/Http2Priority.scala | 10 + .../nodejs/http2/Http2PushStreamOptions.scala | 8 + .../nodejs/http2/Http2RequestOptions.scala | 11 + .../http2/Http2RespondWithFDOptions.scala | 10 + .../http2/Http2RespondWithFileOptions.scala | 11 + .../nodejs/http2/Http2ResponseOptions.scala | 8 + .../nodejs/http2/Http2SecureServer.scala | 8 + .../http2/Http2SecureServerOptions.scala | 53 ++++ .../io/scalajs/nodejs/http2/Http2Server.scala | 8 + .../nodejs/http2/Http2ServerOptions.scala | 23 ++ .../nodejs/http2/Http2ServerRequest.scala | 36 +++ .../nodejs/http2/Http2ServerResponse.scala | 56 ++++ .../scalajs/nodejs/http2/Http2Session.scala | 75 ++++++ .../nodejs/http2/Http2SessionState.scala | 17 ++ .../scalajs/nodejs/http2/Http2Settings.scala | 13 + .../io/scalajs/nodejs/http2/Http2Stream.scala | 49 ++++ .../nodejs/http2/Http2StreamState.scala | 13 + .../nodejs/http2/Http2TimeoutOps.scala | 11 + .../nodejs/http2/ServerHttp2Session.scala | 15 ++ .../nodejs/http2/ServerHttp2Stream.scala | 32 +++ .../io/scalajs/nodejs/http2/package.scala | 11 + .../nodejs/http2/Http2HeadersTest.scala | 26 ++ 30 files changed, 1011 insertions(+), 1 deletion(-) create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Session.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Stream.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/HasOrigin.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ConnectOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Constants.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Headers.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Priority.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2PushStreamOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RequestOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFDOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFileOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ResponseOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServer.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServerOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Server.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerOptions.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerRequest.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerResponse.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Session.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SessionState.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Settings.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Stream.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2StreamState.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/Http2TimeoutOps.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Session.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Stream.scala create mode 100644 app/current/src/main/scala/io/scalajs/nodejs/http2/package.scala create mode 100644 app/nodejs-v8/src/test/scala/io/scalajs/nodejs/http2/Http2HeadersTest.scala diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http/ConnectionOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http/ConnectionOptions.scala index 282c27a69..be4ff2a12 100644 --- a/app/current/src/main/scala/io/scalajs/nodejs/http/ConnectionOptions.scala +++ b/app/current/src/main/scala/io/scalajs/nodejs/http/ConnectionOptions.scala @@ -15,7 +15,7 @@ class ConnectionOptions( var lookup: js.UndefOr[js.Function1[String, Any]] = js.undefined, var onread: js.UndefOr[OnreadObject] = js.undefined, // for IPC connections - var path: js.UndefOr[String], + var path: js.UndefOr[String] = js.undefined, // for new Socket(option) var fd: js.UndefOr[Int] = js.undefined, var allowHalfOpen: js.UndefOr[Boolean] = js.undefined, diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Session.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Session.scala new file mode 100644 index 000000000..48566a580 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Session.scala @@ -0,0 +1,9 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait ClientHttp2Session extends Http2Session { + + def request(headers: Http2Headers, options: Http2RequestOptions = js.native): ClientHttp2Stream = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Stream.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Stream.scala new file mode 100644 index 000000000..6cca53145 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/ClientHttp2Stream.scala @@ -0,0 +1,6 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait ClientHttp2Stream extends Http2Stream diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/HasOrigin.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/HasOrigin.scala new file mode 100644 index 000000000..1900cb857 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/HasOrigin.scala @@ -0,0 +1,7 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +trait HasOrigin extends js.Object { + def origin: String +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2.scala new file mode 100644 index 000000000..920d9ae57 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2.scala @@ -0,0 +1,35 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.buffer.Buffer +import io.scalajs.nodejs.url.URL + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport +import scala.scalajs.js.typedarray.Uint8Array +import scala.scalajs.js.| + +@js.native +trait Http2 extends js.Object { + def createServer( + options: Http2ServerOptions, + onRequestHandler: js.Function2[Http2ServerRequest, Http2ServerResponse, Any] = js.native + ): Http2Server = js.native + + def createSecureServer( + options: Http2SecureServerOptions, + onRequestHandler: js.Function2[Http2ServerRequest, Http2ServerResponse, Any] = js.native + ): Http2SecureServer = js.native + + def connect(authority: String | URL, options: Http2ConnectOptions, listener: js.Function): ClientHttp2Session = + js.native + + def constants: Http2Constants = js.native + + def getDefaultSettings(): Http2Settings = js.native + def getPackedSettings(settings: Http2Settings): Buffer = js.native + def getUnpackedSettings(buffer: Uint8Array): Http2Settings = js.native +} + +@js.native +@JSImport("http2", JSImport.Namespace) +object Http2 extends Http2 diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ConnectOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ConnectOptions.scala new file mode 100644 index 000000000..d3d6a65fc --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ConnectOptions.scala @@ -0,0 +1,58 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.buffer.Buffer +import io.scalajs.nodejs.http.OnreadObject +import io.scalajs.nodejs.{net, stream} +import io.scalajs.nodejs.tls.{ALPNProtocols, SecureContext, TLSCertificate} +import io.scalajs.nodejs.url.URL + +import scala.scalajs.js + +class Http2ConnectOptions( + var maxDeflateDynamicTableSize: js.UndefOr[Int] = js.undefined, + var maxSessionMemory: js.UndefOr[Int] = js.undefined, + var maxHeaderListPairs: js.UndefOr[Int] = js.undefined, + var maxOutstandingPings: js.UndefOr[Int] = js.undefined, + var maxSendHeaderBlockLength: js.UndefOr[Int] = js.undefined, + var paddingStrategy: js.UndefOr[Int] = js.undefined, + var peerMaxConcurrentStreams: js.UndefOr[Int] = js.undefined, + var selectPadding: js.UndefOr[js.Function2[Int, Int, Int]] = js.undefined, + var settings: js.UndefOr[Http2Settings] = js.undefined, + // specific to connect + var maxReservedRemoteStreams: js.UndefOr[Int] = js.undefined, + var createConnection: js.UndefOr[js.Function2[URL, Http2ConnectOptions, stream.IDuplex]], + // From net.connect + // for socket.connect(option) + var port: js.UndefOr[Int] = js.undefined, + var host: js.UndefOr[String] = js.undefined, + var localAddress: js.UndefOr[String] = js.undefined, + var localPort: js.UndefOr[Int] = js.undefined, + var family: js.UndefOr[Int] = js.undefined, + var hints: js.UndefOr[Int] = js.undefined, + var lookup: js.UndefOr[js.Function1[String, Any]] = js.undefined, + var onread: js.UndefOr[OnreadObject] = js.undefined, + // for IPC connections + var path: js.UndefOr[String] = js.undefined, + // for new Socket(option) + var fd: js.UndefOr[Int] = js.undefined, + var allowHalfOpen: js.UndefOr[Boolean] = js.undefined, + var readable: js.UndefOr[Boolean] = js.undefined, + var writable: js.UndefOr[Int] = js.undefined, + // From tls.connect + var socket: js.UndefOr[stream.IDuplex] = js.undefined, + var servername: js.UndefOr[String] = js.undefined, + var checkServerIdentity: js.UndefOr[js.Function2[String, TLSCertificate, Any]] = js.undefined, + var minDHSize: js.UndefOr[Int] = js.undefined, + // TLSSocketOptions + var enableTrace: js.UndefOr[Boolean] = js.undefined, + var isServer: js.UndefOr[Boolean] = js.undefined, + var server: js.UndefOr[net.Server] = js.undefined, + var requestCert: js.UndefOr[Boolean] = js.undefined, + var rejectUnauthorized: js.UndefOr[Boolean] = js.undefined, + var NPNProtocols: js.UndefOr[Boolean] = js.undefined, + var ALPNProtocols: js.UndefOr[ALPNProtocols] = js.undefined, + var SNICallback: js.UndefOr[js.Function2[String, js.Function, Any]] = js.undefined, + var session: js.UndefOr[Buffer] = js.undefined, + var requestOCSP: js.UndefOr[Boolean] = js.undefined, + var secureContext: js.UndefOr[SecureContext] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Constants.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Constants.scala new file mode 100644 index 000000000..997052172 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Constants.scala @@ -0,0 +1,245 @@ +package io.scalajs.nodejs.http2 + +import com.thoughtworks.enableIf + +import scala.scalajs.js + +@js.native +trait Http2Constants extends js.Object { + val DEFAULT_SETTINGS_ENABLE_PUSH: Int = js.native + val DEFAULT_SETTINGS_HEADER_TABLE_SIZE: Int = js.native + val DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: Int = js.native + val DEFAULT_SETTINGS_MAX_FRAME_SIZE: Int = js.native + + val HTTP2_HEADER_ACCEPT: String = js.native + val HTTP2_HEADER_ACCEPT_CHARSET: String = js.native + val HTTP2_HEADER_ACCEPT_ENCODING: String = js.native + val HTTP2_HEADER_ACCEPT_LANGUAGE: String = js.native + val HTTP2_HEADER_ACCEPT_RANGES: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_ALLOW_HEADERS: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_ALLOW_METHODS: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_MAX_AGE: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_REQUEST_HEADERS: String = js.native + val HTTP2_HEADER_ACCESS_CONTROL_REQUEST_METHOD: String = js.native + val HTTP2_HEADER_AGE: String = js.native + val HTTP2_HEADER_ALLOW: String = js.native + val HTTP2_HEADER_AUTHORITY: String = js.native + val HTTP2_HEADER_AUTHORIZATION: String = js.native + val HTTP2_HEADER_CACHE_CONTROL: String = js.native + val HTTP2_HEADER_CONNECTION: String = js.native + val HTTP2_HEADER_CONTENT_DISPOSITION: String = js.native + val HTTP2_HEADER_CONTENT_ENCODING: String = js.native + val HTTP2_HEADER_CONTENT_LANGUAGE: String = js.native + val HTTP2_HEADER_CONTENT_LENGTH: String = js.native + val HTTP2_HEADER_CONTENT_LOCATION: String = js.native + val HTTP2_HEADER_CONTENT_MD5: String = js.native + val HTTP2_HEADER_CONTENT_RANGE: String = js.native + val HTTP2_HEADER_CONTENT_TYPE: String = js.native + val HTTP2_HEADER_COOKIE: String = js.native + val HTTP2_HEADER_DATE: String = js.native + val HTTP2_HEADER_DNT: String = js.native + val HTTP2_HEADER_ETAG: String = js.native + val HTTP2_HEADER_EXPECT: String = js.native + val HTTP2_HEADER_EXPIRES: String = js.native + val HTTP2_HEADER_FORWARDED: String = js.native + val HTTP2_HEADER_FROM: String = js.native + val HTTP2_HEADER_HOST: String = js.native + val HTTP2_HEADER_HTTP2_SETTINGS: String = js.native + val HTTP2_HEADER_IF_MATCH: String = js.native + val HTTP2_HEADER_IF_MODIFIED_SINCE: String = js.native + val HTTP2_HEADER_IF_NONE_MATCH: String = js.native + val HTTP2_HEADER_IF_RANGE: String = js.native + val HTTP2_HEADER_IF_UNMODIFIED_SINCE: String = js.native + val HTTP2_HEADER_KEEP_ALIVE: String = js.native + val HTTP2_HEADER_LAST_MODIFIED: String = js.native + val HTTP2_HEADER_LINK: String = js.native + val HTTP2_HEADER_LOCATION: String = js.native + val HTTP2_HEADER_MAX_FORWARDS: String = js.native + val HTTP2_HEADER_METHOD: String = js.native + val HTTP2_HEADER_PATH: String = js.native + val HTTP2_HEADER_PREFER: String = js.native + val HTTP2_HEADER_PROXY_AUTHENTICATE: String = js.native + val HTTP2_HEADER_PROXY_AUTHORIZATION: String = js.native + val HTTP2_HEADER_PROXY_CONNECTION: String = js.native + val HTTP2_HEADER_RANGE: String = js.native + val HTTP2_HEADER_REFERER: String = js.native + val HTTP2_HEADER_REFRESH: String = js.native + val HTTP2_HEADER_RETRY_AFTER: String = js.native + val HTTP2_HEADER_SCHEME: String = js.native + val HTTP2_HEADER_SERVER: String = js.native + val HTTP2_HEADER_SET_COOKIE: String = js.native + val HTTP2_HEADER_STATUS: String = js.native + val HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: String = js.native + val HTTP2_HEADER_TE: String = js.native + val HTTP2_HEADER_TK: String = js.native + val HTTP2_HEADER_TRAILER: String = js.native + val HTTP2_HEADER_TRANSFER_ENCODING: String = js.native + val HTTP2_HEADER_UPGRADE: String = js.native + val HTTP2_HEADER_UPGRADE_INSECURE_REQUESTS: String = js.native + val HTTP2_HEADER_USER_AGENT: String = js.native + val HTTP2_HEADER_VARY: String = js.native + val HTTP2_HEADER_VIA: String = js.native + val HTTP2_HEADER_WARNING: String = js.native + val HTTP2_HEADER_WWW_AUTHENTICATE: String = js.native + val HTTP2_HEADER_X_CONTENT_TYPE_OPTIONS: String = js.native + val HTTP2_HEADER_X_FRAME_OPTIONS: String = js.native + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + val HTTP2_HEADER_PROTOCOL: String = js.native + + val HTTP2_METHOD_ACL: String = js.native + val HTTP2_METHOD_BASELINE_CONTROL: String = js.native + val HTTP2_METHOD_BIND: String = js.native + val HTTP2_METHOD_CHECKIN: String = js.native + val HTTP2_METHOD_CHECKOUT: String = js.native + val HTTP2_METHOD_CONNECT: String = js.native + val HTTP2_METHOD_COPY: String = js.native + val HTTP2_METHOD_DELETE: String = js.native + val HTTP2_METHOD_GET: String = js.native + val HTTP2_METHOD_HEAD: String = js.native + val HTTP2_METHOD_LABEL: String = js.native + val HTTP2_METHOD_LINK: String = js.native + val HTTP2_METHOD_LOCK: String = js.native + val HTTP2_METHOD_MERGE: String = js.native + val HTTP2_METHOD_MKACTIVITY: String = js.native + val HTTP2_METHOD_MKCALENDAR: String = js.native + val HTTP2_METHOD_MKCOL: String = js.native + val HTTP2_METHOD_MKREDIRECTREF: String = js.native + val HTTP2_METHOD_MKWORKSPACE: String = js.native + val HTTP2_METHOD_MOVE: String = js.native + val HTTP2_METHOD_OPTIONS: String = js.native + val HTTP2_METHOD_ORDERPATCH: String = js.native + val HTTP2_METHOD_PATCH: String = js.native + val HTTP2_METHOD_POST: String = js.native + val HTTP2_METHOD_PRI: String = js.native + val HTTP2_METHOD_PROPFIND: String = js.native + val HTTP2_METHOD_PROPPATCH: String = js.native + val HTTP2_METHOD_PUT: String = js.native + val HTTP2_METHOD_REBIND: String = js.native + val HTTP2_METHOD_REPORT: String = js.native + val HTTP2_METHOD_SEARCH: String = js.native + val HTTP2_METHOD_TRACE: String = js.native + val HTTP2_METHOD_UNBIND: String = js.native + val HTTP2_METHOD_UNCHECKOUT: String = js.native + val HTTP2_METHOD_UNLINK: String = js.native + val HTTP2_METHOD_UNLOCK: String = js.native + val HTTP2_METHOD_UPDATE: String = js.native + val HTTP2_METHOD_UPDATEREDIRECTREF: String = js.native + val HTTP2_METHOD_VERSION_CONTROL: String = js.native + + val HTTP_STATUS_ACCEPTED: Int = js.native + val HTTP_STATUS_ALREADY_REPORTED: Int = js.native + val HTTP_STATUS_BAD_GATEWAY: Int = js.native + val HTTP_STATUS_BAD_REQUEST: Int = js.native + val HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: Int = js.native + val HTTP_STATUS_CONFLICT: Int = js.native + val HTTP_STATUS_CONTINUE: Int = js.native + val HTTP_STATUS_CREATED: Int = js.native + val HTTP_STATUS_EARLY_HINTS: Int = js.native + val HTTP_STATUS_EXPECTATION_FAILED: Int = js.native + val HTTP_STATUS_FAILED_DEPENDENCY: Int = js.native + val HTTP_STATUS_FORBIDDEN: Int = js.native + val HTTP_STATUS_FOUND: Int = js.native + val HTTP_STATUS_GATEWAY_TIMEOUT: Int = js.native + val HTTP_STATUS_GONE: Int = js.native + val HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: Int = js.native + val HTTP_STATUS_IM_USED: Int = js.native + val HTTP_STATUS_INSUFFICIENT_STORAGE: Int = js.native + val HTTP_STATUS_INTERNAL_SERVER_ERROR: Int = js.native + val HTTP_STATUS_LENGTH_REQUIRED: Int = js.native + val HTTP_STATUS_LOCKED: Int = js.native + val HTTP_STATUS_LOOP_DETECTED: Int = js.native + val HTTP_STATUS_METHOD_NOT_ALLOWED: Int = js.native + val HTTP_STATUS_MISDIRECTED_REQUEST: Int = js.native + val HTTP_STATUS_MOVED_PERMANENTLY: Int = js.native + val HTTP_STATUS_MULTI_STATUS: Int = js.native + val HTTP_STATUS_MULTIPLE_CHOICES: Int = js.native + val HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: Int = js.native + val HTTP_STATUS_NO_CONTENT: Int = js.native + val HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: Int = js.native + val HTTP_STATUS_NOT_ACCEPTABLE: Int = js.native + val HTTP_STATUS_NOT_EXTENDED: Int = js.native + val HTTP_STATUS_NOT_FOUND: Int = js.native + val HTTP_STATUS_NOT_IMPLEMENTED: Int = js.native + val HTTP_STATUS_NOT_MODIFIED: Int = js.native + val HTTP_STATUS_OK: Int = js.native + val HTTP_STATUS_PARTIAL_CONTENT: Int = js.native + val HTTP_STATUS_PAYLOAD_TOO_LARGE: Int = js.native + val HTTP_STATUS_PAYMENT_REQUIRED: Int = js.native + val HTTP_STATUS_PERMANENT_REDIRECT: Int = js.native + val HTTP_STATUS_PRECONDITION_FAILED: Int = js.native + val HTTP_STATUS_PRECONDITION_REQUIRED: Int = js.native + val HTTP_STATUS_PROCESSING: Int = js.native + val HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: Int = js.native + val HTTP_STATUS_RANGE_NOT_SATISFIABLE: Int = js.native + val HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: Int = js.native + val HTTP_STATUS_REQUEST_TIMEOUT: Int = js.native + val HTTP_STATUS_RESET_CONTENT: Int = js.native + val HTTP_STATUS_SEE_OTHER: Int = js.native + val HTTP_STATUS_SERVICE_UNAVAILABLE: Int = js.native + val HTTP_STATUS_SWITCHING_PROTOCOLS: Int = js.native + val HTTP_STATUS_TEAPOT: Int = js.native + val HTTP_STATUS_TEMPORARY_REDIRECT: Int = js.native + val HTTP_STATUS_TOO_MANY_REQUESTS: Int = js.native + val HTTP_STATUS_UNAUTHORIZED: Int = js.native + val HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: Int = js.native + val HTTP_STATUS_UNORDERED_COLLECTION: Int = js.native + val HTTP_STATUS_UNPROCESSABLE_ENTITY: Int = js.native + val HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: Int = js.native + val HTTP_STATUS_UPGRADE_REQUIRED: Int = js.native + val HTTP_STATUS_URI_TOO_LONG: Int = js.native + val HTTP_STATUS_USE_PROXY: Int = js.native + val HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: Int = js.native + + val MAX_INITIAL_WINDOW_SIZE: Int = js.native + val MAX_MAX_FRAME_SIZE: Int = js.native + val MIN_MAX_FRAME_SIZE: Int = js.native + + val NGHTTP2_CANCEL: Int = js.native + val NGHTTP2_COMPRESSION_ERROR: Int = js.native + val NGHTTP2_CONNECT_ERROR: Int = js.native + val NGHTTP2_DEFAULT_WEIGHT: Int = js.native + val NGHTTP2_ENHANCE_YOUR_CALM: Int = js.native + val NGHTTP2_ERR_FRAME_SIZE_ERROR: Int = js.native + val NGHTTP2_FLAG_ACK: Int = js.native + val NGHTTP2_FLAG_END_HEADERS: Int = js.native + val NGHTTP2_FLAG_END_STREAM: Int = js.native + val NGHTTP2_FLAG_NONE: Int = js.native + val NGHTTP2_FLAG_PADDED: Int = js.native + val NGHTTP2_FLAG_PRIORITY: Int = js.native + val NGHTTP2_FLOW_CONTROL_ERROR: Int = js.native + val NGHTTP2_FRAME_SIZE_ERROR: Int = js.native + val NGHTTP2_HTTP_1_1_REQUIRED: Int = js.native + val NGHTTP2_INADEQUATE_SECURITY: Int = js.native + val NGHTTP2_INTERNAL_ERROR: Int = js.native + val NGHTTP2_NO_ERROR: Int = js.native + val NGHTTP2_PROTOCOL_ERROR: Int = js.native + val NGHTTP2_REFUSED_STREAM: Int = js.native + val NGHTTP2_SESSION_CLIENT: Int = js.native + val NGHTTP2_SESSION_SERVER: Int = js.native + val NGHTTP2_SETTINGS_ENABLE_PUSH: Int = js.native + val NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: Int = js.native + val NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: Int = js.native + val NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: Int = js.native + val NGHTTP2_SETTINGS_MAX_FRAME_SIZE: Int = js.native + val NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: Int = js.native + val NGHTTP2_SETTINGS_TIMEOUT: Int = js.native + val NGHTTP2_STREAM_CLOSED: Int = js.native + val NGHTTP2_STREAM_STATE_CLOSED: Int = js.native + val NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: Int = js.native + val NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: Int = js.native + val NGHTTP2_STREAM_STATE_IDLE: Int = js.native + val NGHTTP2_STREAM_STATE_OPEN: Int = js.native + val NGHTTP2_STREAM_STATE_RESERVED_LOCAL: Int = js.native + val NGHTTP2_STREAM_STATE_RESERVED_REMOTE: Int = js.native + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + val NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL: Int = js.native + + val PADDING_STRATEGY_ALIGNED: Int = js.native + val PADDING_STRATEGY_CALLBACK: Int = js.native + val PADDING_STRATEGY_MAX: Int = js.native + val PADDING_STRATEGY_NONE: Int = js.native + +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Headers.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Headers.scala new file mode 100644 index 000000000..a320eda4b --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Headers.scala @@ -0,0 +1,146 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js +import scala.scalajs.js.annotation.{JSBracketAccess, JSName} +import scala.scalajs.js.| + +@js.native +trait Http2Headers extends js.Object { + @JSName(":status") var status: js.UndefOr[String] = js.undefined + @JSName(":method") var method: js.UndefOr[String] = js.undefined + @JSName(":authority") var authority: js.UndefOr[String] = js.undefined + @JSName(":scheme") var scheme: js.UndefOr[String] = js.undefined + @JSName(":path") var path: js.UndefOr[String] = js.undefined + @JSName(":protocol") var protocol: js.UndefOr[String] = js.undefined + @JSName("age") var age: js.UndefOr[String] = js.undefined + @JSName("authorization") var authorization: js.UndefOr[String] = js.undefined + @JSName("access-control-allow-credentials") var accessControlAllowCredentials: js.UndefOr[String] = js.undefined + @JSName("access-control-max-age") var accessControlMaxAge: js.UndefOr[String] = js.undefined + @JSName("access-control-request-method") var accessControlRequestMethod: js.UndefOr[String] = js.undefined + @JSName("content-encoding") var contentEncoding: js.UndefOr[String] = js.undefined + @JSName("content-language") var contentLanguage: js.UndefOr[String] = js.undefined + @JSName("content-length") var contentLength: js.UndefOr[String] = js.undefined + @JSName("content-location") var contentLocation: js.UndefOr[String] = js.undefined + @JSName("content-md5") var contentMd5: js.UndefOr[String] = js.undefined + @JSName("content-range") var contentRange: js.UndefOr[String] = js.undefined + @JSName("content-type") var contentType: js.UndefOr[String] = js.undefined + @JSName("date") var date: js.UndefOr[String] = js.undefined + @JSName("dnt") var dnt: js.UndefOr[String] = js.undefined + @JSName("etag") var etag: js.UndefOr[String] = js.undefined + @JSName("expires") var expires: js.UndefOr[String] = js.undefined + @JSName("from") var from: js.UndefOr[String] = js.undefined + @JSName("if-match") var ifMatch: js.UndefOr[String] = js.undefined + @JSName("if-modified-since") var ifModifiedSince: js.UndefOr[String] = js.undefined + @JSName("if-none-match") var ifNoneMatch: js.UndefOr[String] = js.undefined + @JSName("if-range") var ifRange: js.UndefOr[String] = js.undefined + @JSName("if-unmodified-since") var ifUnmodifiedSince: js.UndefOr[String] = js.undefined + @JSName("last-modified") var lastModified: js.UndefOr[String] = js.undefined + @JSName("location") var location: js.UndefOr[String] = js.undefined + @JSName("max-forwards") var maxForwards: js.UndefOr[String] = js.undefined + @JSName("proxy-authorization") var proxyAuthorization: js.UndefOr[String] = js.undefined + @JSName("range") var range: js.UndefOr[String] = js.undefined + @JSName("referer") var referer: js.UndefOr[String] = js.undefined + @JSName("retry-after") var retryAfter: js.UndefOr[String] = js.undefined + @JSName("tk") var tk: js.UndefOr[String] = js.undefined + @JSName("upgrade-insecure-requests") var upgradeInsecureRequests: js.UndefOr[String] = js.undefined + @JSName("user-agent") var userAgent: js.UndefOr[String] = js.undefined + @JSName("x-content-type-options") var xContentTypeOptions: js.UndefOr[String] = js.undefined + @JSName("cookie") var cookie: js.UndefOr[js.Array[String]] = js.undefined + @JSName("set-cookie") var setCookie: js.UndefOr[js.Array[String]] = js.undefined + + @JSBracketAccess + def apply(key: String): js.UndefOr[String | js.Array[String]] = js.native + + @JSBracketAccess + def update(key: String, value: String | js.Array[String]): Unit = js.native +} + +object Http2Headers { + def forIncoming( + status: String, + method: js.UndefOr[String] = js.undefined, + authority: js.UndefOr[String] = js.undefined, + scheme: js.UndefOr[String] = js.undefined, + path: js.UndefOr[String] = js.undefined, + protocol: js.UndefOr[String] = js.undefined, + age: js.UndefOr[String] = js.undefined, + authorization: js.UndefOr[String] = js.undefined, + accessControlAllowCredentials: js.UndefOr[String] = js.undefined, + accessControlMaxAge: js.UndefOr[String] = js.undefined, + accessControlRequestMethod: js.UndefOr[String] = js.undefined, + contentEncoding: js.UndefOr[String] = js.undefined, + contentLanguage: js.UndefOr[String] = js.undefined, + contentLength: js.UndefOr[String] = js.undefined, + contentLocation: js.UndefOr[String] = js.undefined, + contentMd5: js.UndefOr[String] = js.undefined, + contentRange: js.UndefOr[String] = js.undefined, + contentType: js.UndefOr[String] = js.undefined, + date: js.UndefOr[String] = js.undefined, + dnt: js.UndefOr[String] = js.undefined, + etag: js.UndefOr[String] = js.undefined, + expires: js.UndefOr[String] = js.undefined, + from: js.UndefOr[String] = js.undefined, + ifMatch: js.UndefOr[String] = js.undefined, + ifModifiedSince: js.UndefOr[String] = js.undefined, + ifNoneMatch: js.UndefOr[String] = js.undefined, + ifRange: js.UndefOr[String] = js.undefined, + ifUnmodifiedSince: js.UndefOr[String] = js.undefined, + lastModified: js.UndefOr[String] = js.undefined, + location: js.UndefOr[String] = js.undefined, + maxForwards: js.UndefOr[String] = js.undefined, + proxyAuthorization: js.UndefOr[String] = js.undefined, + range: js.UndefOr[String] = js.undefined, + referer: js.UndefOr[String] = js.undefined, + retryAfter: js.UndefOr[String] = js.undefined, + tk: js.UndefOr[String] = js.undefined, + upgradeInsecureRequests: js.UndefOr[String] = js.undefined, + userAgent: js.UndefOr[String] = js.undefined, + xContentTypeOptions: js.UndefOr[String] = js.undefined, + cookie: js.UndefOr[js.Array[String]] = js.undefined, + setCookie: js.UndefOr[js.Array[String]] = js.undefined + ): Http2Headers = { + val o = js.Dynamic.literal().asInstanceOf[Http2Headers] + o.status = status + o.method = method + o.authority = authority + o.scheme = scheme + o.path = path + o.protocol = protocol + o.age = age + o.authorization = authorization + o.accessControlAllowCredentials = accessControlAllowCredentials + o.accessControlMaxAge = accessControlMaxAge + o.accessControlRequestMethod = accessControlRequestMethod + o.contentEncoding = contentEncoding + o.contentLanguage = contentLanguage + o.contentLength = contentLength + o.contentLocation = contentLocation + o.contentMd5 = contentMd5 + o.contentRange = contentRange + o.contentType = contentType + o.date = date + o.dnt = dnt + o.etag = etag + o.expires = expires + o.from = from + o.ifMatch = ifMatch + o.ifModifiedSince = ifModifiedSince + o.ifNoneMatch = ifNoneMatch + o.ifRange = ifRange + o.ifUnmodifiedSince = ifUnmodifiedSince + o.lastModified = lastModified + o.location = location + o.maxForwards = maxForwards + o.proxyAuthorization = proxyAuthorization + o.range = range + o.referer = referer + o.retryAfter = retryAfter + o.tk = tk + o.upgradeInsecureRequests = upgradeInsecureRequests + o.userAgent = userAgent + o.xContentTypeOptions = xContentTypeOptions + o.cookie = cookie + o.setCookie = setCookie + o + } +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Priority.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Priority.scala new file mode 100644 index 000000000..c545b771a --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Priority.scala @@ -0,0 +1,10 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2Priority( + var exclusive: js.UndefOr[Boolean], + var parent: js.UndefOr[Int], + var weight: js.UndefOr[Int], + var silent: js.UndefOr[Boolean] +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2PushStreamOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2PushStreamOptions.scala new file mode 100644 index 000000000..c5824a59e --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2PushStreamOptions.scala @@ -0,0 +1,8 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2PushStreamOptions( + var exclusive: js.UndefOr[Boolean], + var parent: js.UndefOr[Int] +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RequestOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RequestOptions.scala new file mode 100644 index 000000000..f6247a3bf --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RequestOptions.scala @@ -0,0 +1,11 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2RequestOptions( + var endStream: js.UndefOr[Boolean] = js.undefined, + var exclusive: js.UndefOr[Boolean] = js.undefined, + var parent: js.UndefOr[Int] = js.undefined, + var weight: js.UndefOr[Int] = js.undefined, + var waitForTrailers: js.UndefOr[Boolean] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFDOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFDOptions.scala new file mode 100644 index 000000000..7c643fade --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFDOptions.scala @@ -0,0 +1,10 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2RespondWithFDOptions( + var statCheck: js.UndefOr[js.Function] = js.undefined, + var waitForTrailers: js.UndefOr[Boolean] = js.undefined, + var offset: js.UndefOr[Int] = js.undefined, + var length: js.UndefOr[Int] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFileOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFileOptions.scala new file mode 100644 index 000000000..586d8023e --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2RespondWithFileOptions.scala @@ -0,0 +1,11 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2RespondWithFileOptions( + var statCheck: js.UndefOr[js.Function] = js.undefined, + var onError: js.UndefOr[js.Function] = js.undefined, + var waitForTrailers: js.UndefOr[Boolean] = js.undefined, + var offset: js.UndefOr[Int] = js.undefined, + var length: js.UndefOr[Int] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ResponseOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ResponseOptions.scala new file mode 100644 index 000000000..84b239db1 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ResponseOptions.scala @@ -0,0 +1,8 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2ResponseOptions( + var endStream: js.UndefOr[Boolean] = js.undefined, + var waitForTrailers: js.UndefOr[Boolean] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServer.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServer.scala new file mode 100644 index 000000000..44983f631 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServer.scala @@ -0,0 +1,8 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.tls + +import scala.scalajs.js + +@js.native +trait Http2SecureServer extends tls.Server with Http2TimeoutOps diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServerOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServerOptions.scala new file mode 100644 index 000000000..563ef016c --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SecureServerOptions.scala @@ -0,0 +1,53 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.buffer.Buffer +import io.scalajs.nodejs.tls.{SecureContext, SecureData, SecureDataObjectForm} + +import scala.scalajs.js +import scala.scalajs.js.typedarray.{DataView, TypedArray} +import scala.scalajs.js.| + +class Http2SecureServerOptions( + var allowHTTP1: js.UndefOr[Boolean] = js.undefined, + var maxDeflateDynamicTableSize: js.UndefOr[Int] = js.undefined, + var maxSessionMemory: js.UndefOr[Int] = js.undefined, + var maxHeaderListPairs: js.UndefOr[Int] = js.undefined, + var maxOutstandingPings: js.UndefOr[Int] = js.undefined, + var maxSendHeaderBlockLength: js.UndefOr[Int] = js.undefined, + var paddingStrategy: js.UndefOr[Int] = js.undefined, + var peerMaxConcurrentStreams: js.UndefOr[Int] = js.undefined, + var selectPadding: js.UndefOr[js.Function2[Int, Int, Int]] = js.undefined, + var settings: js.UndefOr[Http2Settings] = js.undefined, + var options: js.UndefOr[js.Array[String]] = js.undefined, + var ALPNProtocols: js.UndefOr[ + js.Array[String] | js.Array[TypedArray[_, _]] | js.Array[DataView] | TypedArray[_, _] | DataView + ] = js.undefined, + var enableTrace: js.UndefOr[Boolean] = js.undefined, + var handshakeTimeout: js.UndefOr[Int] = js.undefined, + var rejectUnauthorized: js.UndefOr[Boolean] = js.undefined, + var requestCert: js.UndefOr[Boolean] = js.undefined, + var sessionTimeout: js.UndefOr[Int] = js.undefined, + var SNICallback: js.UndefOr[js.Function2[String, js.Function2[io.scalajs.nodejs.Error, SecureContext, Any], Any]], + var ticketKeys: js.UndefOr[Buffer] = js.undefined, +// Options for net.createServers + val allowHalfOpen: js.UndefOr[Boolean] = js.undefined, + val pauseOnConnect: js.UndefOr[Boolean] = js.undefined, +// Options for tls.createSecureContext + var ca: js.UndefOr[SecureData] = js.undefined, + var cert: js.UndefOr[SecureData] = js.undefined, + var sigalgs: js.UndefOr[String] = js.undefined, + var ciphers: js.UndefOr[String] = js.undefined, + var clientCertEngine: js.UndefOr[String] = js.undefined, + var crl: js.UndefOr[SecureData] = js.undefined, + var dphram: js.UndefOr[String | Buffer] = js.undefined, + var ecdhCurve: js.UndefOr[String] = js.undefined, + var honorCipherOrder: js.UndefOr[Boolean] = js.undefined, + var key: js.UndefOr[SecureData] = js.undefined, + var maxVersion: js.UndefOr[String] = js.undefined, + var minVersion: js.UndefOr[String] = js.undefined, + var passphrase: js.UndefOr[String] = js.undefined, + var pfx: js.UndefOr[SecureData | js.Array[SecureDataObjectForm]] = js.undefined, + var secureOptions: js.UndefOr[Int] = js.undefined, + var secureProtocol: js.UndefOr[String] = js.undefined, + var sessionIdContext: js.UndefOr[String] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Server.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Server.scala new file mode 100644 index 000000000..2844f7ec8 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Server.scala @@ -0,0 +1,8 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.net + +import scala.scalajs.js + +@js.native +trait Http2Server extends net.Server with Http2TimeoutOps diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerOptions.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerOptions.scala new file mode 100644 index 000000000..46d3ce8a8 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerOptions.scala @@ -0,0 +1,23 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.http + +import scala.scalajs.js + +class Http2ServerOptions( + var maxDeflateDynamicTableSize: js.UndefOr[Int] = js.undefined, + var maxSessionMemory: js.UndefOr[Int] = js.undefined, + var maxHeaderListPairs: js.UndefOr[Int] = js.undefined, + var maxOutstandingPings: js.UndefOr[Int] = js.undefined, + var maxSendHeaderBlockLength: js.UndefOr[Int] = js.undefined, + var paddingStrategy: js.UndefOr[Int] = js.undefined, + var peerMaxConcurrentStreams: js.UndefOr[Int] = js.undefined, + var selectPadding: js.UndefOr[js.Function2[Int, Int, Int]] = js.undefined, + var settings: js.UndefOr[Http2Settings] = js.undefined, + var Http1IncomingMessage: js.UndefOr[js.ConstructorTag[http.IncomingMessage]] = js.undefined, + var Http1ServerResponse: js.UndefOr[js.ConstructorTag[http.ServerResponse]] = js.undefined, + var Http2ServerRequest: js.UndefOr[js.ConstructorTag[Http2ServerRequest]] = js.undefined, + var Http2ServerResponse: js.UndefOr[js.ConstructorTag[Http2ServerResponse]] = js.undefined, + val allowHalfOpen: js.UndefOr[Boolean] = js.undefined, + val pauseOnConnect: js.UndefOr[Boolean] = js.undefined +) extends js.Object diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerRequest.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerRequest.scala new file mode 100644 index 000000000..7d55f2d19 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerRequest.scala @@ -0,0 +1,36 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.{net, tls} + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport +import scala.scalajs.js.| + +@js.native +@JSImport("http2", "Http2ServerRequest") +class Http2ServerRequest extends Http2TimeoutOps { + + def authority: String = js.native + + def destroy(error: io.scalajs.nodejs.Error = js.native): Unit = js.native + + def headers: Http2Headers = js.native + + def httpVersion: String = js.native + + def method: String = js.native + + def rawHeaders: js.Array[String] = js.native + + def rawTrailers: js.Array[String] = js.native + + def scheme: js.Array[String] = js.native + + def socket: net.Socket | tls.TLSSocket = js.native + + def stream: Http2Stream = js.native + + def trailers: js.Object = js.native + + def url: String = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerResponse.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerResponse.scala new file mode 100644 index 000000000..d2db0a571 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2ServerResponse.scala @@ -0,0 +1,56 @@ +package io.scalajs.nodejs.http2 + +import io.scalajs.nodejs.buffer.Buffer +import io.scalajs.nodejs.{net, tls} + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport +import scala.scalajs.js.| + +@js.native +@JSImport("http2", "Http2ServerResponse") +class Http2ServerResponse extends Http2TimeoutOps { + + def addTrailers(headers: Http2Headers): Unit = js.native + + def connection: net.Socket | tls.TLSSocket = js.native + def socket: net.Socket | tls.TLSSocket = js.native + def stream: Http2Stream = js.native + + // TODO: Return type can be this.type when Node.js v8 dropped + def end(chunk: String | Buffer, callback: js.Function1[Error, Any]): js.UndefOr[this.type] = js.native + def end(chunk: String | Buffer): js.UndefOr[this.type] = js.native + def end(callback: js.Function1[Error, Any]): js.UndefOr[this.type] = js.native + def end(chunk: String, encoding: String, callback: js.Function1[Error, Any]): js.UndefOr[this.type] = js.native + def end(chunk: String, encoding: String): js.UndefOr[this.type] = js.native + def end(): js.UndefOr[this.type] = js.native + + def write(chunk: String | Buffer, callback: js.Function1[Error, Any]): Boolean = js.native + def write(chunk: String | Buffer): Boolean = js.native + def write(chunk: String, encoding: String, callback: js.Function1[Error, Any]): Boolean = js.native + def write(chunk: String, encoding: String): Boolean = js.native + + def writeHead(statusCode: Int, statusMessage: String, http2Headers: Http2Headers): Unit = js.native + def writeHead(statusCode: Int, http2Headers: Http2Headers): Unit = js.native + def writeHead(statusCode: Int, statusMessage: String): Unit = js.native + def writeHead(statusCode: Int): Unit = js.native + + def writeContinue(): Unit = js.native + + def createPushResponse(headers: Http2Headers, + callback: js.Function2[io.scalajs.nodejs.Error, ServerHttp2Stream, Any]): Unit = js.native + + def getHeader(name: String): String = js.native + def getHeaderNames(name: String): js.Array[String] = js.native + def getHeaders(): Http2Headers = js.native + def hasHeader(name: String): Boolean = js.native + def removeHeader(name: String): Unit = js.native + def setHeader(name: String, value: String | js.Array[String]): Unit = js.native + + def finished: Boolean = js.native + def headersSent: Boolean = js.native + def sendDate: Boolean = js.native + + def statusCode: Int = js.native + def statusMessage: String = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Session.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Session.scala new file mode 100644 index 000000000..f8f91ee6e --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Session.scala @@ -0,0 +1,75 @@ +package io.scalajs.nodejs.http2 + +import com.thoughtworks.enableIf +import io.scalajs.nodejs.events.IEventEmitter +import io.scalajs.nodejs.{Error, net, tls} + +import scala.scalajs.js +import scala.scalajs.js.typedarray.{DataView, TypedArray} +import scala.scalajs.js.| + +@js.native +trait Http2Session extends IEventEmitter { + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def alpnProtocol: js.UndefOr[String] = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def close(callback: js.Function = js.native): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def closed: Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def connecting: Boolean = js.native + + def destroy(error: Error, code: Int): Unit = js.native + def destroy(code: Int): Unit = js.native + def destroy(error: Error): Unit = js.native + def destroy(): Unit = js.native + + def destroyed: Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def encrypted: Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def goaway(code: Int, lastStreamID: Int, opaqueData: TypedArray[_, _] | DataView): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def goaway(code: Int, lastStreamID: Int): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def goaway(code: Int): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def goaway(): Unit = js.native + + def localSettings: Http2Settings = js.native + def remoteSettings: Http2Settings = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def originSet: js.UndefOr[js.Array[String]] + + def pendingSettingsAck: Boolean = js.native + + def ping(payload: TypedArray[_, _] | DataView, callback: js.Function): Boolean = js.native + + def ping(callback: js.Function): Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def ref(): Unit = js.native + + def setTimeout(msec: Int, callback: js.Function): Unit = js.native + + def socket: net.Socket | tls.TLSSocket = js.native + + def state: Http2SessionState = js.native + + def settings(settings: Http2Settings = js.native, + callback: js.Function3[Error, Http2Settings, Int, Any] = js.native): Unit = js.native + + def `type`: Int = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def unref(): Unit = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SessionState.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SessionState.scala new file mode 100644 index 000000000..9c87b962f --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2SessionState.scala @@ -0,0 +1,17 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait Http2SessionState extends js.Object { + def effectiveLocalWindowSize: Int = js.native + def effectiveRecvDataLength: Int = js.native + def nextStreamID: Int = js.native + def localWindowSize: Int = js.native + def lastProcStreamID: Int = js.native + def remoteWindowSize: Int = js.native + def outboundQueueSize: Int = js.native + def deflateDynamicTableSize: Int = js.native + def inflateDynamicTableSize: Int = js.native + +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Settings.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Settings.scala new file mode 100644 index 000000000..557bbf33c --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Settings.scala @@ -0,0 +1,13 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +class Http2Settings( + var headerTableSize: js.UndefOr[Int] = js.undefined, + var enablePush: js.UndefOr[Boolean] = js.undefined, + var initialWindowSize: js.UndefOr[Int] = js.undefined, + var maxFrameSize: js.UndefOr[Int] = js.undefined, + var maxConcurrentStreams: js.UndefOr[Int] = js.undefined, + var maxHeaderListSize: js.UndefOr[Int] = js.undefined, + var enableConnectProtocol: js.UndefOr[Int] = js.undefined +) extends js.Object {} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Stream.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Stream.scala new file mode 100644 index 000000000..a88b2e79e --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2Stream.scala @@ -0,0 +1,49 @@ +package io.scalajs.nodejs.http2 + +import com.thoughtworks.enableIf +import io.scalajs.nodejs.stream + +import scala.scalajs.js + +@js.native +trait Http2Stream extends stream.Duplex { + def aborted: Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs12) + def bufferSize: Int = js.native + + def close(code: Int, callback: js.Function = js.native): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def closed: Boolean = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def endAfterHeaders: Boolean = js.native + + def id: js.UndefOr[Int] = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def pending: Boolean = js.native + + def priority(options: Http2Priority): Unit = js.native + + def rstCode: Int = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def sentHeaders: Http2Headers = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def sentInfoHeaders: js.Array[Http2Headers] = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def sentTrailers: Http2Headers = js.native + + def session: Http2Session = js.native + + def setTimeout(msecs: Int, callback: js.Function): Unit = js.native + + def state: Http2StreamState = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def sendTrailers(headers: Http2Headers): Unit = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2StreamState.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2StreamState.scala new file mode 100644 index 000000000..aea21864d --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2StreamState.scala @@ -0,0 +1,13 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait Http2StreamState extends js.Object { + def localWindowSize: Int = js.native + def state: Int = js.native + def localClose: Boolean = js.native + def remoteClose: Boolean = js.native + def sumDependencyWeight: Int = js.native + def weight: Int = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2TimeoutOps.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2TimeoutOps.scala new file mode 100644 index 000000000..16da231f1 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/Http2TimeoutOps.scala @@ -0,0 +1,11 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait Http2TimeoutOps extends js.Object { + def setTimeout(msecs: Int, callback: js.Function): this.type = js.native + def setTimeout(msecs: Int): this.type = js.native + def setTimeout(callback: js.Function): this.type = js.native + def setTimeout(): this.type = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Session.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Session.scala new file mode 100644 index 000000000..a76102e69 --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Session.scala @@ -0,0 +1,15 @@ +package io.scalajs.nodejs.http2 + +import com.thoughtworks.enableIf + +import scala.scalajs.js + +@js.native +trait ServerHttp2Session extends Http2Session { + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def altsvc(alt: String, originOrStream: js.|[Int, Origin]): Unit = js.native + + @enableIf(io.scalajs.nodejs.CompilerSwitches.gteNodeJs10) + def origin(origins: Origin*): Unit = js.native + +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Stream.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Stream.scala new file mode 100644 index 000000000..1ed8c86dc --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/ServerHttp2Stream.scala @@ -0,0 +1,32 @@ +package io.scalajs.nodejs.http2 + +import scala.scalajs.js + +@js.native +trait ServerHttp2Stream extends Http2Stream { + def additionalHeaders(headers: Http2Headers): Unit = js.native + + def headersSent: Boolean = js.native + + def pushAllowed: Boolean = js.native + + def pushStream(headers: Http2Headers, + options: Http2PushStreamOptions, + callback: js.Function3[io.scalajs.nodejs.Error, ServerHttp2Stream, Http2Headers, Any]): Unit = + js.native + def pushStream(headers: Http2Headers, + callback: js.Function3[io.scalajs.nodejs.Error, ServerHttp2Stream, Http2Headers, Any]): Unit = + js.native + + def respond(headers: Http2Headers, options: Http2ResponseOptions): Unit = js.native + def respond(headers: Http2Headers): Unit = js.native + def respond(): Unit = js.native + + def respondWithFD(fd: Int, headers: Http2Headers, options: Http2RespondWithFDOptions): Unit = js.native + def respondWithFD(fd: Int, headers: Http2Headers): Unit = js.native + def respondWithFD(fd: Int): Unit = js.native + + def respondWithFile(path: Path, headers: Http2Headers, options: Http2RespondWithFileOptions): Unit = js.native + def respondWithFile(path: Path, headers: Http2Headers): Unit = js.native + def respondWithFile(path: Path): Unit = js.native +} diff --git a/app/current/src/main/scala/io/scalajs/nodejs/http2/package.scala b/app/current/src/main/scala/io/scalajs/nodejs/http2/package.scala new file mode 100644 index 000000000..51a8c4eac --- /dev/null +++ b/app/current/src/main/scala/io/scalajs/nodejs/http2/package.scala @@ -0,0 +1,11 @@ +package io.scalajs.nodejs + +import io.scalajs.nodejs.buffer.Buffer +import io.scalajs.nodejs.url.URL + +import scala.scalajs.js.| + +package object http2 { + type Origin = String | URL | HasOrigin + type Path = String | Buffer | URL +} diff --git a/app/nodejs-v8/src/test/scala/io/scalajs/nodejs/http2/Http2HeadersTest.scala b/app/nodejs-v8/src/test/scala/io/scalajs/nodejs/http2/Http2HeadersTest.scala new file mode 100644 index 000000000..fcef0af43 --- /dev/null +++ b/app/nodejs-v8/src/test/scala/io/scalajs/nodejs/http2/Http2HeadersTest.scala @@ -0,0 +1,26 @@ +package io.scalajs.nodejs.http2 + +import org.scalatest.FunSpec + +import scala.scalajs.js + +class Http2HeadersTest extends FunSpec { + + describe("Http2Headers") { + it("should treat JS name") { + val headers = Http2Headers.forIncoming( + status = "200", + accessControlMaxAge = "1" + ) + assert(headers.status === "200") + assert(js.JSON.stringify(headers) === """{":status":"200","access-control-max-age":"1"}""") + } + + it("should support user-defined keys") { + val headers = Http2Headers.forIncoming(status = "300") + headers.update("ABC", js.Array("X", "Y", "Z")) + assert(js.JSON.stringify(headers) === """{":status":"300","ABC":["X","Y","Z"]}""") + assert(headers("ABC").toString === "X,Y,Z") + } + } +}