@whatwg-node/server 0.8.11 → 0.8.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/utils.js +32 -2
- package/cjs/uwebsockets.js +10 -0
- package/esm/utils.js +30 -1
- package/esm/uwebsockets.js +10 -0
- package/package.json +1 -1
- package/typings/utils.d.cts +1 -0
- package/typings/utils.d.ts +1 -0
package/cjs/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
|
|
3
|
+
exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.splitSetCookieHeader = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
|
|
4
4
|
const fetch_1 = require("@whatwg-node/fetch");
|
|
5
5
|
function isAsyncIterable(body) {
|
|
6
6
|
return (body != null && typeof body === 'object' && typeof body[Symbol.asyncIterator] === 'function');
|
|
@@ -145,11 +145,41 @@ function endResponse(serverResponse) {
|
|
|
145
145
|
// @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
|
|
146
146
|
serverResponse.end(null, null, null);
|
|
147
147
|
}
|
|
148
|
+
function splitSetCookieHeader(setCookieHeader) {
|
|
149
|
+
const setCookieHeaders = [];
|
|
150
|
+
let currentStr = '';
|
|
151
|
+
let ignoreComma = false;
|
|
152
|
+
for (const ch of setCookieHeader) {
|
|
153
|
+
if (currentStr.endsWith('Expires=')) {
|
|
154
|
+
ignoreComma = true;
|
|
155
|
+
}
|
|
156
|
+
if (ignoreComma) {
|
|
157
|
+
if (ch === ';') {
|
|
158
|
+
ignoreComma = false;
|
|
159
|
+
}
|
|
160
|
+
if (ch === ',' && currentStr.split('Expires=')[1].length > 3) {
|
|
161
|
+
ignoreComma = false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (ch === ',' && !ignoreComma) {
|
|
165
|
+
setCookieHeaders.push(currentStr.trim());
|
|
166
|
+
currentStr = '';
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
currentStr += ch;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (currentStr) {
|
|
173
|
+
setCookieHeaders.push(currentStr.trim());
|
|
174
|
+
}
|
|
175
|
+
return setCookieHeaders;
|
|
176
|
+
}
|
|
177
|
+
exports.splitSetCookieHeader = splitSetCookieHeader;
|
|
148
178
|
function getHeadersArray(headers) {
|
|
149
179
|
const headersArray = [];
|
|
150
180
|
headers.forEach((value, key) => {
|
|
151
181
|
if (key === 'set-cookie') {
|
|
152
|
-
const setCookieValues = value
|
|
182
|
+
const setCookieValues = splitSetCookieHeader(value);
|
|
153
183
|
setCookieValues.forEach(setCookieValue => {
|
|
154
184
|
headersArray.push('set-cookie', setCookieValue.trim());
|
|
155
185
|
});
|
package/cjs/uwebsockets.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sendResponseToUwsOpts = exports.getRequestFromUWSRequest = exports.isUWSResponse = void 0;
|
|
4
|
+
const utils_js_1 = require("./utils.js");
|
|
4
5
|
function isUWSResponse(res) {
|
|
5
6
|
return !!res.onData;
|
|
6
7
|
}
|
|
@@ -44,6 +45,15 @@ async function sendResponseToUwsOpts({ res, response }) {
|
|
|
44
45
|
response.headers.forEach((value, key) => {
|
|
45
46
|
// content-length causes an error with Node.js's fetch
|
|
46
47
|
if (key !== 'content-length') {
|
|
48
|
+
if (key === 'set-cookie') {
|
|
49
|
+
const setCookieHeaders = (0, utils_js_1.splitSetCookieHeader)(value);
|
|
50
|
+
setCookieHeaders.forEach(setCookieHeader => {
|
|
51
|
+
res.cork(() => {
|
|
52
|
+
res.writeHeader(key, setCookieHeader);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
47
57
|
res.cork(() => {
|
|
48
58
|
res.writeHeader(key, value);
|
|
49
59
|
});
|
package/esm/utils.js
CHANGED
|
@@ -135,11 +135,40 @@ function endResponse(serverResponse) {
|
|
|
135
135
|
// @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
|
|
136
136
|
serverResponse.end(null, null, null);
|
|
137
137
|
}
|
|
138
|
+
export function splitSetCookieHeader(setCookieHeader) {
|
|
139
|
+
const setCookieHeaders = [];
|
|
140
|
+
let currentStr = '';
|
|
141
|
+
let ignoreComma = false;
|
|
142
|
+
for (const ch of setCookieHeader) {
|
|
143
|
+
if (currentStr.endsWith('Expires=')) {
|
|
144
|
+
ignoreComma = true;
|
|
145
|
+
}
|
|
146
|
+
if (ignoreComma) {
|
|
147
|
+
if (ch === ';') {
|
|
148
|
+
ignoreComma = false;
|
|
149
|
+
}
|
|
150
|
+
if (ch === ',' && currentStr.split('Expires=')[1].length > 3) {
|
|
151
|
+
ignoreComma = false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (ch === ',' && !ignoreComma) {
|
|
155
|
+
setCookieHeaders.push(currentStr.trim());
|
|
156
|
+
currentStr = '';
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
currentStr += ch;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (currentStr) {
|
|
163
|
+
setCookieHeaders.push(currentStr.trim());
|
|
164
|
+
}
|
|
165
|
+
return setCookieHeaders;
|
|
166
|
+
}
|
|
138
167
|
function getHeadersArray(headers) {
|
|
139
168
|
const headersArray = [];
|
|
140
169
|
headers.forEach((value, key) => {
|
|
141
170
|
if (key === 'set-cookie') {
|
|
142
|
-
const setCookieValues = value
|
|
171
|
+
const setCookieValues = splitSetCookieHeader(value);
|
|
143
172
|
setCookieValues.forEach(setCookieValue => {
|
|
144
173
|
headersArray.push('set-cookie', setCookieValue.trim());
|
|
145
174
|
});
|
package/esm/uwebsockets.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { splitSetCookieHeader } from './utils.js';
|
|
1
2
|
export function isUWSResponse(res) {
|
|
2
3
|
return !!res.onData;
|
|
3
4
|
}
|
|
@@ -39,6 +40,15 @@ export async function sendResponseToUwsOpts({ res, response }) {
|
|
|
39
40
|
response.headers.forEach((value, key) => {
|
|
40
41
|
// content-length causes an error with Node.js's fetch
|
|
41
42
|
if (key !== 'content-length') {
|
|
43
|
+
if (key === 'set-cookie') {
|
|
44
|
+
const setCookieHeaders = splitSetCookieHeader(value);
|
|
45
|
+
setCookieHeaders.forEach(setCookieHeader => {
|
|
46
|
+
res.cork(() => {
|
|
47
|
+
res.writeHeader(key, setCookieHeader);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
42
52
|
res.cork(() => {
|
|
43
53
|
res.writeHeader(key, value);
|
|
44
54
|
});
|
package/package.json
CHANGED
package/typings/utils.d.cts
CHANGED
|
@@ -28,6 +28,7 @@ export declare function isNodeRequest(request: any): request is NodeRequest;
|
|
|
28
28
|
export declare function isServerResponse(stream: any): stream is NodeResponse;
|
|
29
29
|
export declare function isReadableStream(stream: any): stream is ReadableStream;
|
|
30
30
|
export declare function isFetchEvent(event: any): event is FetchEvent;
|
|
31
|
+
export declare function splitSetCookieHeader(setCookieHeader: string): string[];
|
|
31
32
|
export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void> | undefined;
|
|
32
33
|
export declare function isRequestInit(val: unknown): val is RequestInit;
|
|
33
34
|
export declare function completeAssign(...args: any[]): any;
|
package/typings/utils.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export declare function isNodeRequest(request: any): request is NodeRequest;
|
|
|
28
28
|
export declare function isServerResponse(stream: any): stream is NodeResponse;
|
|
29
29
|
export declare function isReadableStream(stream: any): stream is ReadableStream;
|
|
30
30
|
export declare function isFetchEvent(event: any): event is FetchEvent;
|
|
31
|
+
export declare function splitSetCookieHeader(setCookieHeader: string): string[];
|
|
31
32
|
export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void> | undefined;
|
|
32
33
|
export declare function isRequestInit(val: unknown): val is RequestInit;
|
|
33
34
|
export declare function completeAssign(...args: any[]): any;
|