Skip to content

Commit c714c20

Browse files
Avoid too many requests
1 parent b0e0c97 commit c714c20

4 files changed

Lines changed: 16 additions & 5 deletions

File tree

src/Config.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Config, Layer } from 'effect'
1+
import { Config, Effect, Layer, RateLimiter, pipe } from 'effect'
22
import { OrcidConfig } from './Orcid.js'
33
import { RedisConfig } from './Redis.js'
44
import { ZenodoConfig } from './Zenodo.js'
@@ -17,7 +17,7 @@ const redisConfig: Config.Config<RedisConfig> = Config.nested(
1717
'REDIS',
1818
)
1919

20-
const zenodoConfig: Config.Config<ZenodoConfig> = Config.nested(
20+
const zenodoConfig: Config.Config<Omit<ZenodoConfig, 'rateLimit'>> = Config.nested(
2121
Config.all({
2222
url: Config.mapAttempt(Config.string('URL'), url => new URL(url)),
2323
}),
@@ -27,5 +27,13 @@ const zenodoConfig: Config.Config<ZenodoConfig> = Config.nested(
2727
export const ConfigLive = Layer.mergeAll(
2828
Layer.effect(OrcidConfig, orcidConfig),
2929
Layer.effect(RedisConfig, redisConfig),
30-
Layer.effect(ZenodoConfig, zenodoConfig),
30+
Layer.effect(
31+
ZenodoConfig,
32+
pipe(
33+
zenodoConfig,
34+
Effect.bind('rateLimit', () =>
35+
RateLimiter.make({ limit: 1, interval: '1.5 seconds', algorithm: 'fixed-window' }),
36+
),
37+
),
38+
),
3139
)

src/Program.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ const processUser = (user: Users.User) =>
193193
Effect.annotateLogs('orcidId', user.orcidId),
194194
Effect.provideService(Orcid.OrcidAccessToken, { token: user.accessToken }),
195195
Effect.scoped,
196+
Effect.delay('1 second'),
196197
)
197198

198199
export const program = Users.getUsers.pipe(Stream.runForEach(processUser))

src/Zenodo.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { HttpClient } from '@effect/platform'
22
import { type ParseResult, Schema } from '@effect/schema'
3-
import { Context, Effect, type Record } from 'effect'
3+
import { Context, Effect, type RateLimiter, type Record } from 'effect'
44
import { DoiSchema } from './Doi.js'
55
import type * as OrcidId from './OrcidId.js'
66
import * as Temporal from './Temporal.js'
@@ -12,6 +12,7 @@ type GetRecordsForOrcidIdError = HttpClient.error.HttpClientError | ParseResult.
1212

1313
export interface ZenodoConfig {
1414
readonly url: URL
15+
readonly rateLimit: RateLimiter.RateLimiter
1516
}
1617

1718
export const ZenodoConfig = Context.GenericTag<ZenodoConfig>('ZenodoConfig')
@@ -78,5 +79,6 @@ const zenodoClient = Effect.gen(function* (_) {
7879
HttpClient.client.filterStatusOk,
7980
HttpClient.client.mapRequest(HttpClient.request.acceptJson),
8081
HttpClient.client.mapRequest(HttpClient.request.prependUrl(new URL('/api/', config.url).href)),
82+
HttpClient.client.transform(config.rateLimit),
8183
)
8284
})

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,6 @@ const ProgramLive = Layer.mergeAll(HttpClientLive, RedisLive).pipe(
4444
),
4545
)
4646

47-
const runnable = Effect.provide(program, ProgramLive)
47+
const runnable = Effect.provide(program, ProgramLive).pipe(Effect.scoped)
4848

4949
await Effect.runPromise(runnable)

0 commit comments

Comments
 (0)