const AccessTokenLive = Layer.scoped(
AccessToken,
Effect.gen(function* ($) {
const authorizationRequest = Effect.request(
new AuthorizationRequest(),
AuthorizationRequestResolver,
);
const response = yield* $(authorizationRequest);
const accessTokenRef = yield* $(SynchronizedRef.make(response.accessToken));
const updateAccessToken = Effect.tap(
authorizationRequest,
({ accessToken }) =>
SynchronizedRef.update(accessTokenRef, () => accessToken).pipe(
Effect.tap(() => Effect.logDebug(accessToken)),
),
);
yield* $(
Effect.scheduleForked(
Effect.void,
Schedule.modifyDelayEffect(
Schedule.fixed(Duration.seconds(response.expiresIn)),
() =>
Effect.map(updateAccessToken, ({ expiresIn }) =>
Duration.seconds(expiresIn),
),
),
),
);
return accessTokenRef;
}),
).pipe(Layer.provide(AuthorizationRequestResolverLive));
const AccessTokenLive = Layer.scoped(
AccessToken,
Effect.gen(function* ($) {
const authorizationRequest = Effect.request(
new AuthorizationRequest(),
AuthorizationRequestResolver,
);
const response = yield* $(authorizationRequest);
const accessTokenRef = yield* $(SynchronizedRef.make(response.accessToken));
const updateAccessToken = Effect.tap(
authorizationRequest,
({ accessToken }) =>
SynchronizedRef.update(accessTokenRef, () => accessToken).pipe(
Effect.tap(() => Effect.logDebug(accessToken)),
),
);
yield* $(
Effect.scheduleForked(
Effect.void,
Schedule.modifyDelayEffect(
Schedule.fixed(Duration.seconds(response.expiresIn)),
() =>
Effect.map(updateAccessToken, ({ expiresIn }) =>
Duration.seconds(expiresIn),
),
),
),
);
return accessTokenRef;
}),
).pipe(Layer.provide(AuthorizationRequestResolverLive));