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