@prezly/theme-kit-nextjs 10.8.0 → 10.9.1
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/README.md +73 -0
- package/build/adapters/app-helper/server.cjs +2 -4
- package/build/adapters/app-helper/server.mjs +2 -4
- package/build/adapters/intl/server.cjs +2 -3
- package/build/adapters/intl/server.mjs +2 -3
- package/build/adapters/metadata/lib/generateCategoryPageMetadata.cjs +5 -8
- package/build/adapters/metadata/lib/generateCategoryPageMetadata.mjs +5 -8
- package/build/adapters/metadata/lib/generateMediaGalleryPageMetadata.cjs +13 -8
- package/build/adapters/metadata/lib/generateMediaGalleryPageMetadata.mjs +13 -8
- package/build/adapters/metadata/lib/generateMediaPageMetadata.cjs +3 -5
- package/build/adapters/metadata/lib/generateMediaPageMetadata.mjs +3 -5
- package/build/adapters/metadata/lib/generateRootMetadata.cjs +14 -5
- package/build/adapters/metadata/lib/generateRootMetadata.mjs +14 -5
- package/build/adapters/metadata/lib/generateSearchPageMetadata.cjs +3 -5
- package/build/adapters/metadata/lib/generateSearchPageMetadata.mjs +3 -5
- package/build/adapters/metadata/lib/generateStoryPageMetadata.cjs +17 -10
- package/build/adapters/metadata/lib/generateStoryPageMetadata.mjs +17 -10
- package/build/adapters/metadata/lib/utils/generatePageMetadata.cjs +16 -7
- package/build/adapters/metadata/lib/utils/generatePageMetadata.mjs +16 -7
- package/build/adapters/metadata/server.cjs +1 -3
- package/build/adapters/metadata/server.mjs +1 -3
- package/build/adapters/prezly/cache/configure.d.ts +2 -0
- package/build/adapters/prezly/cache/redis.cjs +54 -22
- package/build/adapters/prezly/cache/redis.mjs +54 -22
- package/build/adapters/prezly/cache/redis.test.cjs +103 -0
- package/build/adapters/prezly/cache/redis.test.mjs +101 -0
- package/build/adapters/prezly/requests.cjs +152 -0
- package/build/adapters/prezly/requests.d.ts +17 -0
- package/build/adapters/prezly/requests.mjs +144 -0
- package/build/adapters/prezly/requests.test.cjs +201 -0
- package/build/adapters/prezly/requests.test.mjs +199 -0
- package/build/adapters/prezly/server.cjs +42 -18
- package/build/adapters/prezly/server.mjs +41 -18
- package/build/adapters/prezly/server.test.cjs +304 -0
- package/build/adapters/prezly/server.test.mjs +302 -0
- package/build/adapters/routing/lib/RoutingAdapter.client.cjs +5 -9
- package/build/adapters/routing/lib/RoutingAdapter.client.mjs +5 -9
- package/build/adapters/routing/lib/RoutingAdapter.server.cjs +5 -6
- package/build/adapters/routing/lib/RoutingAdapter.server.mjs +5 -6
- package/build/adapters/theme-settings/server.cjs +10 -1
- package/build/adapters/theme-settings/server.mjs +10 -1
- package/build/middleware/intl-middleware.cjs +22 -11
- package/build/middleware/intl-middleware.mjs +22 -11
- package/build/next-config/index.cjs +5 -7
- package/build/next-config/index.mjs +5 -7
- package/build/playwright/config.cjs +5 -5
- package/build/playwright/config.mjs +5 -5
- package/build/robots/server.cjs +1 -3
- package/build/robots/server.mjs +1 -3
- package/build/sentry/common.cjs +3 -7
- package/build/sentry/common.mjs +3 -7
- package/package.json +112 -109
|
@@ -3,38 +3,61 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
3
3
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
4
4
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
5
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
7
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
8
|
+
import stableStringify from 'json-stable-stringify';
|
|
6
9
|
import { createPrezlyClient } from '@prezly/sdk';
|
|
7
10
|
import { ContentDelivery, Resolvable } from '@prezly/theme-kit-core';
|
|
8
11
|
import { configure as configureCache } from "./cache/index.mjs";
|
|
12
|
+
import { createBoundedFetch } from "./requests.mjs";
|
|
9
13
|
export var PrezlyAdapter;
|
|
10
14
|
(function (_PrezlyAdapter) {
|
|
11
15
|
function connect(config) {
|
|
12
|
-
var {
|
|
13
|
-
cache
|
|
14
|
-
fetch
|
|
15
|
-
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
16
|
+
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
17
|
+
cacheConfig = _ref.cache,
|
|
18
|
+
fetch = _ref.fetch;
|
|
16
19
|
function usePrezlyClient() {
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
accessToken,
|
|
20
|
-
baseUrl,
|
|
21
|
-
headers,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
formats
|
|
26
|
-
} = Resolvable.resolve(config);
|
|
20
|
+
var _cacheConfig$namespac, _cacheConfig$memory;
|
|
21
|
+
var _Resolvable$resolve = Resolvable.resolve(config),
|
|
22
|
+
accessToken = _Resolvable$resolve.accessToken,
|
|
23
|
+
baseUrl = _Resolvable$resolve.baseUrl,
|
|
24
|
+
headers = _Resolvable$resolve.headers,
|
|
25
|
+
newsroom = _Resolvable$resolve.newsroom,
|
|
26
|
+
theme = _Resolvable$resolve.theme,
|
|
27
|
+
formats = _Resolvable$resolve.formats;
|
|
27
28
|
var client = createPrezlyClient({
|
|
28
29
|
fetch,
|
|
29
30
|
accessToken,
|
|
30
31
|
baseUrl,
|
|
31
32
|
headers
|
|
32
33
|
});
|
|
33
|
-
var
|
|
34
|
+
var cache = cacheConfig ? configureCache(_objectSpread({
|
|
35
|
+
namespace: 'content:'
|
|
36
|
+
}, cacheConfig)) : undefined;
|
|
37
|
+
// Custom fetches may depend on hidden request context. Preserve their
|
|
38
|
+
// existing cache behavior unless the caller declares that identity.
|
|
39
|
+
var scope = cache && (!fetch || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.requestScope) !== undefined) ? bytesToHex(sha256(stableStringify({
|
|
40
|
+
baseUrl: baseUrl !== null && baseUrl !== void 0 ? baseUrl : 'https://api.prezly.com',
|
|
41
|
+
accessToken,
|
|
42
|
+
headers: headers !== null && headers !== void 0 ? headers : {},
|
|
43
|
+
cache: {
|
|
44
|
+
namespace: (_cacheConfig$namespac = cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.namespace) !== null && _cacheConfig$namespac !== void 0 ? _cacheConfig$namespac : 'content:',
|
|
45
|
+
memory: (_cacheConfig$memory = cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.memory) !== null && _cacheConfig$memory !== void 0 ? _cacheConfig$memory : false,
|
|
46
|
+
redis: cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.redis
|
|
47
|
+
},
|
|
48
|
+
requestScope: cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.requestScope
|
|
49
|
+
}))) : undefined;
|
|
50
|
+
var contentClient = cache ? createPrezlyClient({
|
|
51
|
+
accessToken,
|
|
52
|
+
baseUrl,
|
|
53
|
+
headers,
|
|
54
|
+
fetch: createBoundedFetch(fetch !== null && fetch !== void 0 ? fetch : globalThis.fetch)
|
|
55
|
+
}) : client;
|
|
56
|
+
var contentDelivery = ContentDelivery.createClient(contentClient, newsroom, theme, {
|
|
34
57
|
formats,
|
|
35
|
-
cache:
|
|
36
|
-
|
|
37
|
-
}
|
|
58
|
+
cache: cache ? _objectSpread(_objectSpread({}, cache), {}, {
|
|
59
|
+
scope
|
|
60
|
+
}) : undefined
|
|
38
61
|
});
|
|
39
62
|
return {
|
|
40
63
|
client,
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _sdk = require("@prezly/sdk");
|
|
4
|
+
var _themeKitCore = require("@prezly/theme-kit-core");
|
|
5
|
+
var _requests = require("./requests.cjs");
|
|
6
|
+
var _server = require("./server.cjs");
|
|
7
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
8
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
10
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
11
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
12
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
13
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
15
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
16
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
17
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
18
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
19
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
20
|
+
var tick = () => new Promise(resolve => setImmediate(resolve));
|
|
21
|
+
var nativeFetch = globalThis.fetch;
|
|
22
|
+
var sequence = 0;
|
|
23
|
+
var config = {
|
|
24
|
+
newsroom: 'room',
|
|
25
|
+
accessToken: 'test-token',
|
|
26
|
+
baseUrl: 'https://example.test'
|
|
27
|
+
};
|
|
28
|
+
var cache = () => ({
|
|
29
|
+
memory: true,
|
|
30
|
+
latestVersion: 1,
|
|
31
|
+
namespace: "adapter-test-".concat(sequence++)
|
|
32
|
+
});
|
|
33
|
+
function response(name) {
|
|
34
|
+
return new Response(JSON.stringify({
|
|
35
|
+
newsroom: {
|
|
36
|
+
name,
|
|
37
|
+
stories_number: 600
|
|
38
|
+
}
|
|
39
|
+
}), {
|
|
40
|
+
headers: {
|
|
41
|
+
'content-type': 'application/json'
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
afterEach(() => {
|
|
46
|
+
globalThis.fetch = nativeFetch;
|
|
47
|
+
});
|
|
48
|
+
it('coalesces 20 independently constructed adapters and then uses the warm cache', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
49
|
+
var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
|
|
50
|
+
return response('room');
|
|
51
|
+
}));
|
|
52
|
+
globalThis.fetch = fetchMock;
|
|
53
|
+
var caching = cache();
|
|
54
|
+
var client = () => _server.PrezlyAdapter.connect(config, {
|
|
55
|
+
cache: caching
|
|
56
|
+
}).usePrezlyClient().contentDelivery;
|
|
57
|
+
var values = yield Promise.all(Array.from({
|
|
58
|
+
length: 20
|
|
59
|
+
}, () => client().newsroom()));
|
|
60
|
+
expect(values.every(value => value.name === 'room')).toBe(true);
|
|
61
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
62
|
+
yield tick();
|
|
63
|
+
yield client().newsroom();
|
|
64
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
65
|
+
}));
|
|
66
|
+
it.each([['token', {
|
|
67
|
+
accessToken: 'second-token'
|
|
68
|
+
}], ['source', {
|
|
69
|
+
baseUrl: 'https://another.example.test'
|
|
70
|
+
}], ['headers', {
|
|
71
|
+
headers: {
|
|
72
|
+
'x-test-scope': 'second'
|
|
73
|
+
}
|
|
74
|
+
}]])('isolates concurrent and warm values by %s', /*#__PURE__*/function () {
|
|
75
|
+
var _ref3 = _asyncToGenerator(function* (_label, change) {
|
|
76
|
+
var fetchMock = jest.fn(/*#__PURE__*/function () {
|
|
77
|
+
var _ref4 = _asyncToGenerator(function* (url, init) {
|
|
78
|
+
return response(JSON.stringify([url, init === null || init === void 0 ? void 0 : init.headers]));
|
|
79
|
+
});
|
|
80
|
+
return function (_x3, _x4) {
|
|
81
|
+
return _ref4.apply(this, arguments);
|
|
82
|
+
};
|
|
83
|
+
}());
|
|
84
|
+
globalThis.fetch = fetchMock;
|
|
85
|
+
var caching = cache();
|
|
86
|
+
var a = () => _server.PrezlyAdapter.connect(config, {
|
|
87
|
+
cache: caching
|
|
88
|
+
}).usePrezlyClient().contentDelivery;
|
|
89
|
+
var b = () => _server.PrezlyAdapter.connect(_objectSpread(_objectSpread({}, config), change), {
|
|
90
|
+
cache: caching
|
|
91
|
+
}).usePrezlyClient().contentDelivery;
|
|
92
|
+
var _yield$Promise$all = yield Promise.all([a().newsroom(), b().newsroom()]),
|
|
93
|
+
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2),
|
|
94
|
+
first = _yield$Promise$all2[0],
|
|
95
|
+
second = _yield$Promise$all2[1];
|
|
96
|
+
expect(first.name).not.toBe(second.name);
|
|
97
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
98
|
+
yield tick();
|
|
99
|
+
expect((yield a().newsroom()).name).toBe(first.name);
|
|
100
|
+
yield tick();
|
|
101
|
+
expect((yield b().newsroom()).name).toBe(second.name);
|
|
102
|
+
});
|
|
103
|
+
return function (_x, _x2) {
|
|
104
|
+
return _ref3.apply(this, arguments);
|
|
105
|
+
};
|
|
106
|
+
}());
|
|
107
|
+
it('isolates newsroom, theme, formats, namespace and invalidation version', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
108
|
+
var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
|
|
109
|
+
return response('room');
|
|
110
|
+
}));
|
|
111
|
+
globalThis.fetch = fetchMock;
|
|
112
|
+
var caching = cache();
|
|
113
|
+
var variants = [[config, caching], [_objectSpread(_objectSpread({}, config), {}, {
|
|
114
|
+
newsroom: 'another'
|
|
115
|
+
}), caching], [_objectSpread(_objectSpread({}, config), {}, {
|
|
116
|
+
theme: 'theme'
|
|
117
|
+
}), caching], [_objectSpread(_objectSpread({}, config), {}, {
|
|
118
|
+
formats: [_sdk.Story.FormatVersion.SLATEJS_V6]
|
|
119
|
+
}), caching], [config, _objectSpread(_objectSpread({}, caching), {}, {
|
|
120
|
+
namespace: "".concat(caching.namespace, "-other")
|
|
121
|
+
})], [config, _objectSpread(_objectSpread({}, caching), {}, {
|
|
122
|
+
latestVersion: 2
|
|
123
|
+
})]];
|
|
124
|
+
yield Promise.all(variants.map(_ref7 => {
|
|
125
|
+
var _ref8 = _slicedToArray(_ref7, 2),
|
|
126
|
+
cfg = _ref8[0],
|
|
127
|
+
storage = _ref8[1];
|
|
128
|
+
return _server.PrezlyAdapter.connect(cfg, {
|
|
129
|
+
cache: storage
|
|
130
|
+
}).usePrezlyClient().contentDelivery.newsroom();
|
|
131
|
+
}));
|
|
132
|
+
expect(fetchMock).toHaveBeenCalledTimes(6);
|
|
133
|
+
yield tick();
|
|
134
|
+
yield _server.PrezlyAdapter.connect(config, {
|
|
135
|
+
cache: _objectSpread(_objectSpread({}, caching), {}, {
|
|
136
|
+
latestVersion: 3
|
|
137
|
+
})
|
|
138
|
+
}).usePrezlyClient().contentDelivery.newsroom();
|
|
139
|
+
expect(fetchMock).toHaveBeenCalledTimes(7);
|
|
140
|
+
}));
|
|
141
|
+
it('requires explicit scope to share custom fetch across adapter instances', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
142
|
+
var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
|
|
143
|
+
return response('room');
|
|
144
|
+
}));
|
|
145
|
+
var create = caching => _server.PrezlyAdapter.connect(config, {
|
|
146
|
+
cache: caching,
|
|
147
|
+
fetch: fetchMock
|
|
148
|
+
}).usePrezlyClient().contentDelivery;
|
|
149
|
+
var unscoped = cache();
|
|
150
|
+
yield Promise.all([create(unscoped).newsroom(), create(unscoped).newsroom()]);
|
|
151
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
152
|
+
var scoped = _objectSpread(_objectSpread({}, cache()), {}, {
|
|
153
|
+
requestScope: 'immutable-custom-transport'
|
|
154
|
+
});
|
|
155
|
+
yield Promise.all([create(scoped).newsroom(), create(scoped).newsroom()]);
|
|
156
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
157
|
+
}));
|
|
158
|
+
it('does not buffer or change calls made using the raw SDK client', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
159
|
+
var result = response('raw');
|
|
160
|
+
var read = jest.spyOn(result, 'arrayBuffer');
|
|
161
|
+
var fetchMock = jest.fn(/*#__PURE__*/function () {
|
|
162
|
+
var _ref10 = _asyncToGenerator(function* (_input, _init) {
|
|
163
|
+
return result;
|
|
164
|
+
});
|
|
165
|
+
return function (_x5, _x6) {
|
|
166
|
+
return _ref10.apply(this, arguments);
|
|
167
|
+
};
|
|
168
|
+
}());
|
|
169
|
+
var _PrezlyAdapter$connec = _server.PrezlyAdapter.connect(config, {
|
|
170
|
+
cache: cache(),
|
|
171
|
+
fetch: fetchMock
|
|
172
|
+
}).usePrezlyClient(),
|
|
173
|
+
client = _PrezlyAdapter$connec.client;
|
|
174
|
+
expect((yield client.newsrooms.get('room')).name).toBe('raw');
|
|
175
|
+
expect(read).not.toHaveBeenCalled();
|
|
176
|
+
expect(fetchMock.mock.calls[0][1]).not.toHaveProperty('signal');
|
|
177
|
+
}));
|
|
178
|
+
it('recovers from an actual SDK error without poisoning the shared key', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
179
|
+
var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
|
|
180
|
+
return response('recovered');
|
|
181
|
+
}));
|
|
182
|
+
fetchMock.mockRejectedValueOnce(new Error('offline'));
|
|
183
|
+
globalThis.fetch = fetchMock;
|
|
184
|
+
var caching = cache();
|
|
185
|
+
var client = () => _server.PrezlyAdapter.connect(config, {
|
|
186
|
+
cache: caching
|
|
187
|
+
}).usePrezlyClient().contentDelivery;
|
|
188
|
+
var failed = yield Promise.allSettled(Array.from({
|
|
189
|
+
length: 20
|
|
190
|
+
}, () => client().newsroom()));
|
|
191
|
+
expect(failed.every(value => value.status === 'rejected')).toBe(true);
|
|
192
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
193
|
+
expect((yield client().newsroom()).name).toBe('recovered');
|
|
194
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
195
|
+
}));
|
|
196
|
+
it('fetches every allStories page through the SDK with only one transport slot', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
197
|
+
var fetchMock = jest.fn(/*#__PURE__*/function () {
|
|
198
|
+
var _ref14 = _asyncToGenerator(function* (url, init) {
|
|
199
|
+
if (String(url).endsWith('/room')) return response('room');
|
|
200
|
+
var _JSON$parse = JSON.parse(init.body),
|
|
201
|
+
offset = _JSON$parse.offset;
|
|
202
|
+
return new Response(JSON.stringify({
|
|
203
|
+
stories: [offset]
|
|
204
|
+
}));
|
|
205
|
+
});
|
|
206
|
+
return function (_x7, _x8) {
|
|
207
|
+
return _ref14.apply(this, arguments);
|
|
208
|
+
};
|
|
209
|
+
}());
|
|
210
|
+
var sdk = (0, _sdk.createPrezlyClient)(_objectSpread(_objectSpread({}, config), {}, {
|
|
211
|
+
fetch: (0, _requests.createBoundedFetch)(fetchMock, new _requests.FetchScheduler({
|
|
212
|
+
concurrency: 1
|
|
213
|
+
}))
|
|
214
|
+
}));
|
|
215
|
+
var caching = {
|
|
216
|
+
storage: _themeKitCore.ContentDelivery.createSharedMemoryCache(),
|
|
217
|
+
scope: "aggregate-".concat(sequence++),
|
|
218
|
+
latestVersion: 1
|
|
219
|
+
};
|
|
220
|
+
var clients = Array.from({
|
|
221
|
+
length: 20
|
|
222
|
+
}, () => _themeKitCore.ContentDelivery.createClient(sdk, 'room', undefined, {
|
|
223
|
+
cache: caching
|
|
224
|
+
}));
|
|
225
|
+
expect(yield Promise.all(clients.map(client => client.allStories()))).toEqual(Array.from({
|
|
226
|
+
length: 20
|
|
227
|
+
}, () => [0, 200, 400]));
|
|
228
|
+
expect(fetchMock).toHaveBeenCalledTimes(4);
|
|
229
|
+
}));
|
|
230
|
+
it('handles a large newsroom without overflowing its own global transport queue', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
231
|
+
var active = 0;
|
|
232
|
+
var peak = 0;
|
|
233
|
+
var fetchMock = jest.fn(/*#__PURE__*/function () {
|
|
234
|
+
var _ref16 = _asyncToGenerator(function* (url, init) {
|
|
235
|
+
if (String(url).endsWith('/room')) {
|
|
236
|
+
return new Response(JSON.stringify({
|
|
237
|
+
newsroom: {
|
|
238
|
+
name: 'large',
|
|
239
|
+
stories_number: 60000
|
|
240
|
+
}
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
active++;
|
|
244
|
+
peak = Math.max(active, peak);
|
|
245
|
+
yield tick();
|
|
246
|
+
active--;
|
|
247
|
+
var _JSON$parse2 = JSON.parse(init.body),
|
|
248
|
+
offset = _JSON$parse2.offset;
|
|
249
|
+
return new Response(JSON.stringify({
|
|
250
|
+
stories: [offset]
|
|
251
|
+
}));
|
|
252
|
+
});
|
|
253
|
+
return function (_x9, _x0) {
|
|
254
|
+
return _ref16.apply(this, arguments);
|
|
255
|
+
};
|
|
256
|
+
}());
|
|
257
|
+
globalThis.fetch = fetchMock;
|
|
258
|
+
var caching = cache();
|
|
259
|
+
var request = () => _server.PrezlyAdapter.connect(config, {
|
|
260
|
+
cache: caching
|
|
261
|
+
}).usePrezlyClient().contentDelivery.allStories();
|
|
262
|
+
var expected = Array.from({
|
|
263
|
+
length: 300
|
|
264
|
+
}, (_, index) => index * 200);
|
|
265
|
+
expect(yield Promise.all(Array.from({
|
|
266
|
+
length: 20
|
|
267
|
+
}, request))).toEqual(Array.from({
|
|
268
|
+
length: 20
|
|
269
|
+
}, () => expected));
|
|
270
|
+
expect(fetchMock).toHaveBeenCalledTimes(301);
|
|
271
|
+
expect(peak).toBeLessThanOrEqual(8);
|
|
272
|
+
}));
|
|
273
|
+
it('stops producing later story batches on failure and can retry the aggregate', /*#__PURE__*/_asyncToGenerator(function* () {
|
|
274
|
+
var fail = true;
|
|
275
|
+
var fetchMock = jest.fn(/*#__PURE__*/function () {
|
|
276
|
+
var _ref18 = _asyncToGenerator(function* (url, init) {
|
|
277
|
+
if (String(url).endsWith('/room')) {
|
|
278
|
+
return new Response(JSON.stringify({
|
|
279
|
+
newsroom: {
|
|
280
|
+
stories_number: 60000
|
|
281
|
+
}
|
|
282
|
+
}));
|
|
283
|
+
}
|
|
284
|
+
var _JSON$parse3 = JSON.parse(init.body),
|
|
285
|
+
offset = _JSON$parse3.offset;
|
|
286
|
+
if (offset === 0 && fail) throw new Error('page unavailable');
|
|
287
|
+
return new Response(JSON.stringify({
|
|
288
|
+
stories: [offset]
|
|
289
|
+
}));
|
|
290
|
+
});
|
|
291
|
+
return function (_x1, _x10) {
|
|
292
|
+
return _ref18.apply(this, arguments);
|
|
293
|
+
};
|
|
294
|
+
}());
|
|
295
|
+
globalThis.fetch = fetchMock;
|
|
296
|
+
var adapter = _server.PrezlyAdapter.connect(config, {
|
|
297
|
+
cache: cache()
|
|
298
|
+
});
|
|
299
|
+
yield expect(adapter.usePrezlyClient().contentDelivery.allStories()).rejects.toThrow('page unavailable');
|
|
300
|
+
yield tick();
|
|
301
|
+
expect(fetchMock).toHaveBeenCalledTimes(9); // newsroom + the first bounded batch only
|
|
302
|
+
fail = false;
|
|
303
|
+
expect(yield adapter.usePrezlyClient().contentDelivery.allStories()).toHaveLength(300);
|
|
304
|
+
}));
|