@kairos-es/feed-algolia 0.0.0-stage → 0.0.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 (60) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +66 -2
  3. package/dist/cjs/classify.js +157 -0
  4. package/dist/cjs/classify.js.map +1 -0
  5. package/dist/cjs/identifiers.js +38 -0
  6. package/dist/cjs/identifiers.js.map +1 -0
  7. package/dist/cjs/index.js +39 -0
  8. package/dist/cjs/index.js.map +1 -0
  9. package/dist/cjs/records.js +105 -0
  10. package/dist/cjs/records.js.map +1 -0
  11. package/dist/cjs/rest.js +293 -0
  12. package/dist/cjs/rest.js.map +1 -0
  13. package/dist/cjs/sink.js +463 -0
  14. package/dist/cjs/sink.js.map +1 -0
  15. package/dist/dts-cjs/classify.d.ts +101 -0
  16. package/dist/dts-cjs/classify.d.ts.map +1 -0
  17. package/dist/dts-cjs/identifiers.d.ts +34 -0
  18. package/dist/dts-cjs/identifiers.d.ts.map +1 -0
  19. package/dist/dts-cjs/index.d.ts +39 -0
  20. package/dist/dts-cjs/index.d.ts.map +1 -0
  21. package/dist/dts-cjs/package.json +3 -0
  22. package/dist/dts-cjs/records.d.ts +56 -0
  23. package/dist/dts-cjs/records.d.ts.map +1 -0
  24. package/dist/dts-cjs/rest.d.ts +215 -0
  25. package/dist/dts-cjs/rest.d.ts.map +1 -0
  26. package/dist/dts-cjs/sink.d.ts +220 -0
  27. package/dist/dts-cjs/sink.d.ts.map +1 -0
  28. package/dist/dts-esm/classify.d.ts +101 -0
  29. package/dist/dts-esm/classify.d.ts.map +1 -0
  30. package/dist/dts-esm/identifiers.d.ts +34 -0
  31. package/dist/dts-esm/identifiers.d.ts.map +1 -0
  32. package/dist/dts-esm/index.d.ts +39 -0
  33. package/dist/dts-esm/index.d.ts.map +1 -0
  34. package/dist/dts-esm/package.json +3 -0
  35. package/dist/dts-esm/records.d.ts +56 -0
  36. package/dist/dts-esm/records.d.ts.map +1 -0
  37. package/dist/dts-esm/rest.d.ts +215 -0
  38. package/dist/dts-esm/rest.d.ts.map +1 -0
  39. package/dist/dts-esm/sink.d.ts +220 -0
  40. package/dist/dts-esm/sink.d.ts.map +1 -0
  41. package/dist/esm/classify.js +145 -0
  42. package/dist/esm/classify.js.map +1 -0
  43. package/dist/esm/identifiers.js +31 -0
  44. package/dist/esm/identifiers.js.map +1 -0
  45. package/dist/esm/index.js +38 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/package.json +4 -0
  48. package/dist/esm/records.js +96 -0
  49. package/dist/esm/records.js.map +1 -0
  50. package/dist/esm/rest.js +285 -0
  51. package/dist/esm/rest.js.map +1 -0
  52. package/dist/esm/sink.js +454 -0
  53. package/dist/esm/sink.js.map +1 -0
  54. package/package.json +33 -3
  55. package/src/classify.ts +201 -0
  56. package/src/identifiers.ts +45 -0
  57. package/src/index.ts +48 -0
  58. package/src/records.ts +109 -0
  59. package/src/rest.ts +773 -0
  60. package/src/sink.ts +733 -0
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeAlgoliaRest = exports.indexPath = void 0;
7
+ var _effect = require("effect");
8
+ var _http = require("effect/http");
9
+ var _classify = require("./classify.js");
10
+ var _identifiers = require("./identifiers.js");
11
+ /** The header Algolia reads the admin key from, lower-cased as `Headers` keeps it. */
12
+ const KEY_HEADER = 'x-algolia-api-key';
13
+ const APP_HEADER = 'x-algolia-application-id';
14
+ const DEFAULT_CONNECT_TIMEOUT = /*#__PURE__*/_effect.Duration.seconds(2);
15
+ const DEFAULT_READ_TIMEOUT = /*#__PURE__*/_effect.Duration.seconds(5);
16
+ const DEFAULT_WRITE_TIMEOUT = /*#__PURE__*/_effect.Duration.seconds(30);
17
+ /** How long a host that failed is skipped for: the official client's two minutes. */
18
+ const HOST_DOWN_MILLIS = /*#__PURE__*/_effect.Duration.toMillis(/*#__PURE__*/_effect.Duration.minutes(2));
19
+ /** The path of an index, or of something under it. */
20
+ const indexPath = (index, rest = '') => `/1/indexes/${encodeURIComponent(index)}${rest}`;
21
+ exports.indexPath = indexPath;
22
+ const TaskAnswer = /*#__PURE__*/_effect.Schema.Struct({
23
+ taskID: _identifiers.AlgoliaTaskId
24
+ });
25
+ const TaskStatus = /*#__PURE__*/_effect.Schema.Struct({
26
+ status: /*#__PURE__*/_effect.Schema.Literals(['published', 'notPublished'])
27
+ });
28
+ const IndexListAnswer = /*#__PURE__*/_effect.Schema.Struct({
29
+ items: /*#__PURE__*/_effect.Schema.Array(/*#__PURE__*/_effect.Schema.Struct({
30
+ name: _effect.Schema.String
31
+ })),
32
+ nbPages: /*#__PURE__*/_effect.Schema.optionalKey(_effect.Schema.Number)
33
+ });
34
+ const SettingsAnswer = /*#__PURE__*/_effect.Schema.Record(_effect.Schema.String, _effect.Schema.Unknown);
35
+ const BrowseAnswer = /*#__PURE__*/_effect.Schema.Struct({
36
+ hits: /*#__PURE__*/_effect.Schema.Array(/*#__PURE__*/_effect.Schema.Struct({
37
+ objectID: _effect.Schema.String
38
+ })),
39
+ cursor: /*#__PURE__*/_effect.Schema.optionalKey(_effect.Schema.String)
40
+ });
41
+ /**
42
+ * The most of a raw, non-JSON error body a reason carries. A proxy's or a load
43
+ * balancer's error page can be any size, and a reason is logged whole.
44
+ */
45
+ const RAW_BODY_LIMIT = 500;
46
+ /**
47
+ * Algolia's error body is `{ message, status }`; anything else is shown raw, cut
48
+ * to {@link RAW_BODY_LIMIT} characters.
49
+ */
50
+ const errorMessage = text => {
51
+ try {
52
+ const parsed = JSON.parse(text);
53
+ if (typeof parsed === 'object' && parsed !== null && 'message' in parsed && typeof parsed.message === 'string') {
54
+ return parsed.message;
55
+ }
56
+ } catch {
57
+ // Not JSON: the raw body is the best message there is.
58
+ }
59
+ if (text.length === 0) {
60
+ return '(empty body)';
61
+ }
62
+ return text.length <= RAW_BODY_LIMIT ? text : `${text.slice(0, RAW_BODY_LIMIT)}… (${text.length - RAW_BODY_LIMIT} more characters)`;
63
+ };
64
+ /**
65
+ * A status that says nothing about the request and something about the host: a
66
+ * 5xx, or a 1xx or 3xx, which no call here expects. Tried on the next host.
67
+ */
68
+ const hostFailedWith = status => status < 200 || status >= 300 && status < 400 || status >= 500;
69
+ const label = call => ({
70
+ method: call.method,
71
+ path: call.path
72
+ });
73
+ /** The fallback hosts' numbers: `<appId>-<n>.algolianet.com`. */
74
+ const FALLBACKS = [1, 2, 3];
75
+ /**
76
+ * The base URLs a call is tried on, in order; see the module doc. Shuffled from
77
+ * `Random`, so a test can seed it.
78
+ */
79
+ const hostsFor = connection => connection.host === undefined ? _effect.Effect.map(_effect.Random.shuffle(FALLBACKS.map(n => `https://${connection.appId}-${n}.algolianet.com`)), fallbacks => [`https://${connection.appId}.algolia.net`, ...fallbacks]) : _effect.Effect.succeed([connection.host.replace(/\/+$/, '')]);
80
+ /**
81
+ * Build the REST client over the `HttpClient` in context. The client is captured
82
+ * here, so every call the sink makes later needs nothing from its caller.
83
+ */
84
+ const makeAlgoliaRest = connection => _effect.Effect.gen(function* () {
85
+ const http = yield* _http.HttpClient.HttpClient;
86
+ const hosts = yield* hostsFor(connection);
87
+ const timeoutOf = (input, fallback) => input === undefined ? fallback : _effect.Duration.fromInputUnsafe(input);
88
+ const connect = timeoutOf(connection.timeouts?.connect, DEFAULT_CONNECT_TIMEOUT);
89
+ const readBudget = _effect.Duration.sum(connect, timeoutOf(connection.timeouts?.read, DEFAULT_READ_TIMEOUT));
90
+ const writeBudget = _effect.Duration.sum(connect, timeoutOf(connection.timeouts?.write, DEFAULT_WRITE_TIMEOUT));
91
+ /** When each host that failed comes back up, in `Clock` millis. */
92
+ const downUntil = yield* _effect.Ref.make(new Map());
93
+ const redactedNames = [..._http.Headers.CurrentRedactedNames.defaultValue(), KEY_HEADER];
94
+ const fromClientError = (call, error) => error.reason._tag === 'TransportError' || error.reason._tag === 'DecodeError' || error.reason._tag === 'EmptyBodyError' ? (0, _classify.transportFailure)(label(call), error.reason._tag) : (0, _classify.unreadableAnswer)(label(call), error.reason._tag);
95
+ /** One request to one host, unclassified. Fails only `SinkRetryable` or halted. */
96
+ const exchange = (host, spec) => {
97
+ const budget = spec.method === 'GET' || spec.read === true ? readBudget : writeBudget;
98
+ const request = _http.HttpClientRequest.make(spec.method)(`${host}${spec.path}`, {
99
+ headers: {
100
+ [APP_HEADER]: connection.appId,
101
+ [KEY_HEADER]: _effect.Redacted.value(connection.adminKey)
102
+ },
103
+ acceptJson: true,
104
+ ...(spec.body === undefined ? {} : {
105
+ body: _http.HttpBody.jsonUnsafe(spec.body)
106
+ })
107
+ });
108
+ return _effect.Effect.flatMap(http.execute(request), response => _effect.Effect.map(response.text, text => ({
109
+ status: response.status,
110
+ text,
111
+ retryAfter: _http.Headers.get(response.headers, 'retry-after')
112
+ }))).pipe(_effect.Effect.mapError(error => fromClientError(spec, error)), _effect.Effect.timeoutOrElse({
113
+ duration: budget,
114
+ orElse: () => _effect.Effect.fail((0, _classify.transportFailure)(label(spec), `no answer within ${_effect.Duration.format(budget)}`))
115
+ }));
116
+ };
117
+ const markDown = host => _effect.Effect.flatMap(_effect.Clock.currentTimeMillis, now => _effect.Ref.update(downUntil, down => new Map(down).set(host, now + HOST_DOWN_MILLIS)));
118
+ const markUp = host => _effect.Ref.update(downUntil, down => {
119
+ if (!down.has(host)) {
120
+ return down;
121
+ }
122
+ const next = new Map(down);
123
+ next.delete(host);
124
+ return next;
125
+ });
126
+ /**
127
+ * Say, at debug level, that a call is leaving `host` for `next` and why: the
128
+ * only trace a failover leaves, since the call that lands looks like any
129
+ * other. Hosts and the call's label only; the key is in a header, which
130
+ * nothing here reads.
131
+ */
132
+ const logFailover = (spec, host, next, why) => _effect.Effect.logDebug('feed-algolia: failing over to the next host', {
133
+ call: `${spec.method} ${spec.path}`,
134
+ failed: host,
135
+ next,
136
+ why
137
+ });
138
+ /**
139
+ * The request on each host in turn until one answers with a status that is
140
+ * the request's own rather than the host's; see the module doc. The last
141
+ * host's outcome is returned whatever it is, so a call every host failed ends
142
+ * as the last one did.
143
+ */
144
+ const tryHosts = (spec, [host, ...rest]) =>
145
+ // `matchEffect`, so a failure of the NEXT host's attempt is not caught here
146
+ // again: each host is asked once per call.
147
+ _effect.Effect.matchEffect(exchange(host, spec), {
148
+ onFailure: failure => failure._tag !== 'SinkRetryable' ? _effect.Effect.fail(failure) : _effect.Effect.andThen(markDown(host), _effect.Array.isReadonlyArrayNonEmpty(rest) ? _effect.Effect.andThen(logFailover(spec, host, rest[0], failure.reason), tryHosts(spec, rest)) : _effect.Effect.fail(failure)),
149
+ onSuccess: answer => !hostFailedWith(answer.status) ? _effect.Effect.as(markUp(host), answer) : _effect.Effect.andThen(markDown(host), _effect.Array.isReadonlyArrayNonEmpty(rest) ? _effect.Effect.andThen(logFailover(spec, host, rest[0], `answered ${answer.status}`), tryHosts(spec, rest)) : _effect.Effect.succeed(answer))
150
+ });
151
+ /** The hosts that are up, in order; every host when none is. */
152
+ const acrossHosts = spec => _effect.Effect.gen(function* () {
153
+ const now = yield* _effect.Clock.currentTimeMillis;
154
+ const down = yield* _effect.Ref.get(downUntil);
155
+ const up = hosts.filter(host => (down.get(host) ?? 0) <= now);
156
+ return yield* tryHosts(spec, _effect.Array.isReadonlyArrayNonEmpty(up) ? up : hosts);
157
+ });
158
+ /**
159
+ * One call, classified. A 404 is answered rather than failed, beside the
160
+ * failure it would be — Algolia's message kept — so each caller decides
161
+ * whether a missing index is an outcome or a halt.
162
+ */
163
+ const send = spec => _effect.Effect.gen(function* () {
164
+ const answer = yield* acrossHosts(spec);
165
+ if (answer.status >= 200 && answer.status < 300) {
166
+ try {
167
+ return {
168
+ found: true,
169
+ json: answer.text.length === 0 ? {} : JSON.parse(answer.text)
170
+ };
171
+ } catch {
172
+ return yield* _effect.Effect.fail((0, _classify.unreadableAnswer)(label(spec), 'the body is not JSON'));
173
+ }
174
+ }
175
+ const now = yield* _effect.Clock.currentTimeMillis;
176
+ const failure = (0, _classify.classifyAnswer)(label(spec), {
177
+ status: answer.status,
178
+ message: errorMessage(answer.text),
179
+ retryAfter: answer.retryAfter
180
+ }, spec.batchKeys ?? new Set(), now);
181
+ return answer.status === 404 ? {
182
+ found: false,
183
+ failure
184
+ } : yield* _effect.Effect.fail(failure);
185
+ }).pipe(_effect.Effect.provideService(_http.Headers.CurrentRedactedNames, redactedNames));
186
+ const call = spec => _effect.Effect.map(send(spec), sent => sent.found ? _effect.Option.some(sent.json) : _effect.Option.none());
187
+ /** A call whose 404 is a failure like any other 4xx, Algolia's message kept. */
188
+ const required = spec => _effect.Effect.flatMap(send(spec), sent => sent.found ? _effect.Effect.succeed(sent.json) : _effect.Effect.fail(sent.failure));
189
+ const decode = (schema, spec) => json => _effect.Option.match(_effect.Schema.decodeUnknownOption(schema)(json), {
190
+ onNone: () => _effect.Effect.fail((0, _classify.unreadableAnswer)(label(spec), 'the body is not the documented shape')),
191
+ onSome: _effect.Effect.succeed
192
+ });
193
+ /** One `getTask`; a 404 is answered beside its failure, as `send` does. */
194
+ const taskPoll = (index, taskID) => {
195
+ const spec = {
196
+ method: 'GET',
197
+ path: indexPath(index, `/task/${taskID}`)
198
+ };
199
+ return _effect.Effect.flatMap(send(spec), sent => sent.found ? _effect.Effect.map(decode(TaskStatus, spec)(sent.json), answer => answer.status === 'published') : _effect.Effect.succeed({
200
+ indexMissing: sent.failure
201
+ }));
202
+ };
203
+ const taskOf = spec => json => _effect.Effect.map(decode(TaskAnswer, spec)(json), answer => answer.taskID);
204
+ /** A call whose 404 means "no such index", answered with a task otherwise. */
205
+ const optionalTask = spec => _effect.Effect.flatMap(call(spec), answer => _effect.Option.match(answer, {
206
+ onNone: () => _effect.Effect.succeed(_effect.Option.none()),
207
+ onSome: json => _effect.Effect.map(taskOf(spec)(json), _effect.Option.some)
208
+ }));
209
+ return {
210
+ call,
211
+ batch: (index, operations, batchKeys) => {
212
+ const spec = {
213
+ method: 'POST',
214
+ path: indexPath(index, '/batch'),
215
+ body: {
216
+ requests: operations
217
+ },
218
+ batchKeys
219
+ };
220
+ return _effect.Effect.flatMap(required(spec), taskOf(spec));
221
+ },
222
+ taskPublished: (index, taskID) => _effect.Effect.flatMap(taskPoll(index, taskID), poll => typeof poll === 'boolean' ? _effect.Effect.succeed(poll) : _effect.Effect.fail(poll.indexMissing)),
223
+ taskStateUnlessIndexMissing: (index, taskID) => _effect.Effect.map(taskPoll(index, taskID), poll => typeof poll !== 'boolean' ? 'indexMissing' : poll ? 'published' : 'pending'),
224
+ operation: (source, operation) => {
225
+ const spec = {
226
+ method: 'POST',
227
+ path: indexPath(source, '/operation'),
228
+ body: operation
229
+ };
230
+ return _effect.Effect.flatMap(required(spec), taskOf(spec));
231
+ },
232
+ deleteIndex: index => optionalTask({
233
+ method: 'DELETE',
234
+ path: indexPath(index)
235
+ }),
236
+ readSettings: index => {
237
+ const spec = {
238
+ method: 'GET',
239
+ path: indexPath(index, '/settings')
240
+ };
241
+ return _effect.Effect.flatMap(call(spec), answer => _effect.Option.match(answer, {
242
+ onNone: () => _effect.Effect.succeed(_effect.Option.none()),
243
+ onSome: json => _effect.Effect.map(decode(SettingsAnswer, spec)(json), _effect.Option.some)
244
+ }));
245
+ },
246
+ writeSettings: (index, settings) => {
247
+ const spec = {
248
+ method: 'PUT',
249
+ path: indexPath(index, '/settings'),
250
+ body: settings
251
+ };
252
+ return _effect.Effect.flatMap(required(spec), taskOf(spec));
253
+ },
254
+ listIndexNames: (page, hitsPerPage) => {
255
+ const spec = {
256
+ method: 'GET',
257
+ path: `/1/indexes?page=${page}&hitsPerPage=${hitsPerPage}`
258
+ };
259
+ // An answer without `nbPages` is unpaginated, so it is the last page; so
260
+ // is an empty one, which keeps a miscounted `nbPages` from looping.
261
+ return _effect.Effect.map(_effect.Effect.flatMap(required(spec), decode(IndexListAnswer, spec)), answer => ({
262
+ names: answer.items.map(item => item.name),
263
+ more: answer.items.length > 0 && answer.nbPages !== undefined && page + 1 < answer.nbPages
264
+ }));
265
+ },
266
+ browseObjectIds: (index, cursor, hitsPerPage) => {
267
+ const spec = {
268
+ method: 'POST',
269
+ path: indexPath(index, '/browse'),
270
+ read: true,
271
+ body: {
272
+ attributesToRetrieve: ['objectID'],
273
+ hitsPerPage,
274
+ ...(_effect.Option.isSome(cursor) ? {
275
+ cursor: cursor.value
276
+ } : {})
277
+ }
278
+ };
279
+ return _effect.Effect.flatMap(call(spec), answer => _effect.Option.match(answer, {
280
+ onNone: () => _effect.Effect.succeed({
281
+ objectIDs: [],
282
+ cursor: _effect.Option.none()
283
+ }),
284
+ onSome: json => _effect.Effect.map(decode(BrowseAnswer, spec)(json), page => ({
285
+ objectIDs: page.hits.map(hit => hit.objectID),
286
+ cursor: _effect.Option.fromUndefinedOr(page.cursor)
287
+ }))
288
+ }));
289
+ }
290
+ };
291
+ });
292
+ exports.makeAlgoliaRest = makeAlgoliaRest;
293
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","names":["_effect","require","_http","_classify","_identifiers","KEY_HEADER","APP_HEADER","DEFAULT_CONNECT_TIMEOUT","Duration","seconds","DEFAULT_READ_TIMEOUT","DEFAULT_WRITE_TIMEOUT","HOST_DOWN_MILLIS","toMillis","minutes","indexPath","index","rest","encodeURIComponent","exports","TaskAnswer","Schema","Struct","taskID","AlgoliaTaskId","TaskStatus","status","Literals","IndexListAnswer","items","Array","name","String","nbPages","optionalKey","Number","SettingsAnswer","Record","Unknown","BrowseAnswer","hits","objectID","cursor","RAW_BODY_LIMIT","errorMessage","text","parsed","JSON","parse","message","length","slice","hostFailedWith","label","call","method","path","FALLBACKS","hostsFor","connection","host","undefined","Effect","map","Random","shuffle","n","appId","fallbacks","succeed","replace","makeAlgoliaRest","gen","http","HttpClient","hosts","timeoutOf","input","fallback","fromInputUnsafe","connect","timeouts","readBudget","sum","read","writeBudget","write","downUntil","Ref","make","Map","redactedNames","Headers","CurrentRedactedNames","defaultValue","fromClientError","error","reason","_tag","transportFailure","unreadableAnswer","exchange","spec","budget","request","HttpClientRequest","headers","Redacted","value","adminKey","acceptJson","body","HttpBody","jsonUnsafe","flatMap","execute","response","retryAfter","get","pipe","mapError","timeoutOrElse","duration","orElse","fail","format","markDown","Clock","currentTimeMillis","now","update","down","set","markUp","has","next","delete","logFailover","why","logDebug","failed","tryHosts","matchEffect","onFailure","failure","andThen","Arr","isReadonlyArrayNonEmpty","onSuccess","answer","as","acrossHosts","up","filter","send","found","json","classifyAnswer","batchKeys","Set","provideService","sent","Option","some","none","required","decode","schema","match","decodeUnknownOption","onNone","onSome","taskPoll","indexMissing","taskOf","optionalTask","batch","operations","requests","taskPublished","poll","taskStateUnlessIndexMissing","operation","source","deleteIndex","readSettings","writeSettings","settings","listIndexNames","page","hitsPerPage","names","item","more","browseObjectIds","attributesToRetrieve","isSome","objectIDs","hit","fromUndefinedOr"],"sources":["../../src/rest.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}