@opra/core 0.20.3 → 0.22.0

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.
Files changed (77) hide show
  1. package/cjs/adapter/adapter.js +2 -2
  2. package/cjs/adapter/http/express-adapter.js +29 -7
  3. package/cjs/adapter/http/helpers/common.js +66 -0
  4. package/cjs/adapter/http/helpers/convert-to-headers.js +65 -0
  5. package/cjs/adapter/http/helpers/convert-to-raw-headers.js +25 -0
  6. package/cjs/adapter/http/helpers/match-known-fields.js +47 -0
  7. package/cjs/adapter/http/http-adapter.js +82 -440
  8. package/cjs/adapter/http/impl/http-incoming-message-host.js +127 -0
  9. package/cjs/adapter/http/impl/http-outgoing-message-host.js +210 -0
  10. package/cjs/adapter/http/impl/http-server-request.js +125 -0
  11. package/cjs/adapter/http/impl/http-server-response.js +226 -0
  12. package/cjs/adapter/http/request-parsers/batch-request-parser.js +169 -0
  13. package/cjs/adapter/http/request-parsers/parse-collection-request.js +165 -0
  14. package/cjs/adapter/http/request-parsers/parse-request.js +24 -0
  15. package/cjs/adapter/http/request-parsers/parse-singleton-request.js +96 -0
  16. package/cjs/adapter/request-context.host.js +17 -3
  17. package/cjs/adapter/request.host.js +6 -3
  18. package/cjs/adapter/response.host.js +5 -3
  19. package/cjs/index.js +4 -2
  20. package/esm/adapter/adapter.js +2 -2
  21. package/esm/adapter/http/express-adapter.js +6 -6
  22. package/esm/adapter/http/helpers/common.js +60 -0
  23. package/esm/adapter/http/helpers/convert-to-headers.js +60 -0
  24. package/esm/adapter/http/helpers/convert-to-raw-headers.js +21 -0
  25. package/esm/adapter/http/helpers/match-known-fields.js +43 -0
  26. package/esm/adapter/http/http-adapter.js +83 -441
  27. package/esm/adapter/http/impl/http-incoming-message-host.js +122 -0
  28. package/esm/adapter/http/impl/http-outgoing-message-host.js +205 -0
  29. package/esm/adapter/http/impl/http-server-request.js +121 -0
  30. package/esm/adapter/http/impl/http-server-response.js +222 -0
  31. package/esm/adapter/http/request-parsers/batch-request-parser.js +169 -0
  32. package/esm/adapter/http/request-parsers/parse-collection-request.js +161 -0
  33. package/esm/adapter/http/request-parsers/parse-request.js +20 -0
  34. package/esm/adapter/http/request-parsers/parse-singleton-request.js +92 -0
  35. package/esm/adapter/request-context.host.js +17 -3
  36. package/esm/adapter/request.host.js +6 -3
  37. package/esm/adapter/response.host.js +5 -3
  38. package/esm/index.js +4 -2
  39. package/package.json +19 -15
  40. package/types/adapter/adapter.d.ts +1 -1
  41. package/types/adapter/http/helpers/common.d.ts +17 -0
  42. package/types/adapter/http/helpers/convert-to-headers.d.ts +2 -0
  43. package/types/adapter/http/helpers/convert-to-raw-headers.d.ts +3 -0
  44. package/types/adapter/http/helpers/match-known-fields.d.ts +6 -0
  45. package/types/adapter/http/http-adapter.d.ts +7 -12
  46. package/types/adapter/http/impl/http-incoming-message-host.d.ts +58 -0
  47. package/types/adapter/http/impl/http-outgoing-message-host.d.ts +72 -0
  48. package/types/adapter/http/{http-request-message.d.ts → impl/http-server-request.d.ts} +52 -85
  49. package/types/adapter/http/impl/http-server-response.d.ts +137 -0
  50. package/types/adapter/http/request-parsers/batch-request-parser.d.ts +0 -0
  51. package/types/adapter/http/request-parsers/parse-collection-request.d.ts +4 -0
  52. package/types/adapter/http/request-parsers/parse-request.d.ts +4 -0
  53. package/types/adapter/http/request-parsers/parse-singleton-request.d.ts +4 -0
  54. package/types/adapter/interfaces/request-context.interface.d.ts +14 -10
  55. package/types/adapter/interfaces/request.interface.d.ts +3 -2
  56. package/types/adapter/interfaces/response.interface.d.ts +2 -2
  57. package/types/adapter/request-context.host.d.ts +9 -6
  58. package/types/adapter/request.host.d.ts +8 -4
  59. package/types/adapter/response.host.d.ts +6 -4
  60. package/types/index.d.ts +4 -2
  61. package/cjs/adapter/http/http-message.host.js +0 -251
  62. package/cjs/adapter/http/http-request-context.host.js +0 -28
  63. package/cjs/adapter/http/http-request-message.js +0 -152
  64. package/cjs/adapter/http/http-request.host.js +0 -14
  65. package/cjs/adapter/http/http-response-message.js +0 -238
  66. package/cjs/adapter/http/http-response.host.js +0 -14
  67. package/esm/adapter/http/http-message.host.js +0 -246
  68. package/esm/adapter/http/http-request-context.host.js +0 -24
  69. package/esm/adapter/http/http-request-message.js +0 -148
  70. package/esm/adapter/http/http-request.host.js +0 -10
  71. package/esm/adapter/http/http-response-message.js +0 -233
  72. package/esm/adapter/http/http-response.host.js +0 -10
  73. package/types/adapter/http/http-message.host.d.ts +0 -122
  74. package/types/adapter/http/http-request-context.host.d.ts +0 -16
  75. package/types/adapter/http/http-request.host.d.ts +0 -7
  76. package/types/adapter/http/http-response-message.d.ts +0 -321
  77. package/types/adapter/http/http-response.host.d.ts +0 -7
@@ -0,0 +1,60 @@
1
+ import { ARRAY_FIELD, COMMA_DELIMITED_FIELD, matchKnownFields, SEMICOLON_DELIMITED_FIELD } from './match-known-fields.js';
2
+ export function convertToHeaders(src, dst, joinDuplicateHeaders) {
3
+ for (let n = 0; n < src.length; n += 2) {
4
+ addHeaderLine(src[n], src[n + 1], dst, joinDuplicateHeaders);
5
+ }
6
+ return dst;
7
+ }
8
+ export function convertToHeadersDistinct(src, dst) {
9
+ const count = src.length % 2;
10
+ for (let n = 0; n < count; n += 2) {
11
+ addHeaderLineDistinct(src[n], src[n + 1], dst);
12
+ }
13
+ return dst;
14
+ }
15
+ function addHeaderLine(field, value, dest, joinDuplicateHeaders) {
16
+ if (value == null)
17
+ return;
18
+ field = field.toLowerCase();
19
+ const [, flag] = matchKnownFields(field);
20
+ // comma(0) or semicolon(2) delimited field
21
+ if (flag === COMMA_DELIMITED_FIELD || flag === SEMICOLON_DELIMITED_FIELD) {
22
+ // Make a delimited list
23
+ if (typeof dest[field] === 'string') {
24
+ dest[field] += (flag === COMMA_DELIMITED_FIELD ? ', ' : '; ') + value;
25
+ }
26
+ else {
27
+ dest[field] = value;
28
+ }
29
+ }
30
+ else if (flag === ARRAY_FIELD) {
31
+ // Array header -- only Set-Cookie at the moment
32
+ if (dest['set-cookie'] !== undefined) {
33
+ dest['set-cookie'].push(value);
34
+ }
35
+ else {
36
+ dest['set-cookie'] = [value];
37
+ }
38
+ }
39
+ else if (joinDuplicateHeaders) {
40
+ if (dest[field] === undefined) {
41
+ dest[field] = value;
42
+ }
43
+ else {
44
+ dest[field] += ', ' + value;
45
+ }
46
+ }
47
+ else if (dest[field] === undefined) {
48
+ // Drop duplicates
49
+ dest[field] = value;
50
+ }
51
+ }
52
+ function addHeaderLineDistinct(field, value, dest) {
53
+ field = field.toLowerCase();
54
+ if (!dest[field]) {
55
+ dest[field] = [value];
56
+ }
57
+ else {
58
+ dest[field].push(value);
59
+ }
60
+ }
@@ -0,0 +1,21 @@
1
+ import { ARRAY_FIELD, COMMA_DELIMITED_FIELD, matchKnownFields, SEMICOLON_DELIMITED_FIELD } from './match-known-fields.js';
2
+ export function convertToRawHeaders(src) {
3
+ return Object.entries(src)
4
+ .reduce((a, [field, v]) => {
5
+ const [name, flag] = matchKnownFields(field);
6
+ if (flag === ARRAY_FIELD) {
7
+ if (Array.isArray(v))
8
+ v.forEach(x => a.push(name, String(x)));
9
+ else
10
+ a.push(name, String(v));
11
+ return a;
12
+ }
13
+ if (flag === COMMA_DELIMITED_FIELD || flag === SEMICOLON_DELIMITED_FIELD) {
14
+ v = Array.isArray(v) ? v.join(flag === COMMA_DELIMITED_FIELD ? ', ' : '; ') : String(v);
15
+ }
16
+ else
17
+ v = Array.isArray(v) ? String(v[0]) : String(v);
18
+ a.push(name, v);
19
+ return a;
20
+ }, []);
21
+ }
@@ -0,0 +1,43 @@
1
+ import { HttpHeaderCodes } from '@opra/common';
2
+ export const NO_DUPLICATES_FIELD = 0;
3
+ export const COMMA_DELIMITED_FIELD = 1;
4
+ export const SEMICOLON_DELIMITED_FIELD = 2;
5
+ export const ARRAY_FIELD = 3;
6
+ const ARRAY_HEADERS = [
7
+ 'set-cookie'
8
+ ];
9
+ const NO_DUPLICATES_HEADERS = [
10
+ 'age',
11
+ 'from',
12
+ 'etag',
13
+ 'server',
14
+ 'referer',
15
+ 'referrer',
16
+ 'expires',
17
+ 'location',
18
+ 'user-agent',
19
+ 'retry-after',
20
+ 'content-type',
21
+ 'content-length',
22
+ 'max-forwards',
23
+ 'last-modified',
24
+ 'authorization',
25
+ 'proxy-authorization',
26
+ 'if-modified-since',
27
+ 'if-unmodified-since',
28
+ ];
29
+ const SEMICOLON_DELIMITED_HEADERS = ['cookie'];
30
+ const KNOWN_FIELDS = Object.values(HttpHeaderCodes)
31
+ .reduce((o, k) => {
32
+ const n = k.toLowerCase();
33
+ o[n] = [k,
34
+ (NO_DUPLICATES_HEADERS.includes(n) ? NO_DUPLICATES_FIELD :
35
+ (ARRAY_HEADERS.includes(n) ? ARRAY_FIELD :
36
+ (SEMICOLON_DELIMITED_HEADERS.includes(n) ? SEMICOLON_DELIMITED_FIELD : COMMA_DELIMITED_FIELD)))
37
+ ];
38
+ return o;
39
+ }, {});
40
+ export function matchKnownFields(field) {
41
+ const x = KNOWN_FIELDS[field.toLowerCase()];
42
+ return x ? x : [field, COMMA_DELIMITED_FIELD];
43
+ }