| author | |
| committer | |
| log | 268bb4bfa3c2e33aaedb456885475f61ca8b0845 |
| tree | edc63b572ca644af4193d3fec48c969876ae4309 |
| parent | 477b4f9d0ec7e7a48cb74357ea00ecf7bddfc62f |
5 files changed, 27 insertions(+), 46 deletions(-)
apps/server/integration/OrchestrationEngineHarness.integration.ts+2-12| ... | ... | @@ -253,22 +253,12 @@ export const makeOrchestrationIntegrationHarness = ( |
| 253 | 253 | ? makeProviderServiceLive().pipe( |
| 254 | 254 | Layer.provide(providerSessionDirectoryLayer), |
| 255 | 255 | Layer.provide(realCodexRegistry), |
| 256 | Layer.provide( | |
| 257 | Layer.succeed(AnalyticsService, { | |
| 258 | record: () => Effect.void, | |
| 259 | flush: Effect.void, | |
| 260 | }), | |
| 261 | ), | |
| 256 | Layer.provide(AnalyticsService.layerTest), | |
| 262 | 257 | ) |
| 263 | 258 | : makeProviderServiceLive().pipe( |
| 264 | 259 | Layer.provide(providerSessionDirectoryLayer), |
| 265 | 260 | Layer.provide(fakeRegistry!), |
| 266 | Layer.provide( | |
| 267 | Layer.succeed(AnalyticsService, { | |
| 268 | record: () => Effect.void, | |
| 269 | flush: Effect.void, | |
| 270 | }), | |
| 271 | ), | |
| 261 | Layer.provide(AnalyticsService.layerTest), | |
| 272 | 262 | ); |
| 273 | 263 | |
| 274 | 264 | const runtimeServicesLayer = Layer.mergeAll( |
apps/server/integration/providerService.integration.test.ts+1-4| ... | ... | @@ -60,10 +60,7 @@ const makeIntegrationFixture = Effect.gen(function* () { |
| 60 | 60 | const shared = Layer.mergeAll( |
| 61 | 61 | directoryLayer, |
| 62 | 62 | Layer.succeed(ProviderAdapterRegistry, registry), |
| 63 | Layer.succeed(AnalyticsService, { | |
| 64 | record: () => Effect.void, | |
| 65 | flush: Effect.void, | |
| 66 | }), | |
| 63 | AnalyticsService.layerTest, | |
| 67 | 64 | ).pipe(Layer.provide(SqlitePersistenceMemory)); |
| 68 | 65 | |
| 69 | 66 | const layer = makeProviderServiceLive().pipe(Layer.provide(shared)); |
apps/server/src/main.test.ts+1-4| ... | ... | @@ -49,10 +49,7 @@ const testLayer = Layer.mergeAll( |
| 49 | 49 | openBrowser: (_target: string) => Effect.void, |
| 50 | 50 | openInEditor: () => Effect.void, |
| 51 | 51 | } satisfies OpenShape), |
| 52 | Layer.succeed(AnalyticsService, { | |
| 53 | record: () => Effect.void, | |
| 54 | flush: Effect.void, | |
| 55 | }), | |
| 52 | AnalyticsService.layerTest, | |
| 56 | 53 | FetchHttpClient.layer, |
| 57 | 54 | NodeServices.layer, |
| 58 | 55 | ); |
apps/server/src/provider/Layers/ProviderService.test.ts+4-9| ... | ... | @@ -215,11 +215,6 @@ function makeFakeCodexAdapter(provider: ProviderKind = "codex") { |
| 215 | 215 | const sleep = (ms: number) => |
| 216 | 216 | Effect.promise(() => new Promise<void>((resolve) => setTimeout(resolve, ms))); |
| 217 | 217 | |
| 218 | const noopAnalyticsLayer = Layer.succeed(AnalyticsService, { | |
| 219 | record: () => Effect.void, | |
| 220 | flush: Effect.void, | |
| 221 | }); | |
| 222 | ||
| 223 | 218 | function makeProviderServiceLayer() { |
| 224 | 219 | const codex = makeFakeCodexAdapter(); |
| 225 | 220 | const registry: typeof ProviderAdapterRegistry.Service = { |
| ... | ... | @@ -241,7 +236,7 @@ function makeProviderServiceLayer() { |
| 241 | 236 | makeProviderServiceLive().pipe( |
| 242 | 237 | Layer.provide(providerAdapterLayer), |
| 243 | 238 | Layer.provide(directoryLayer), |
| 244 | Layer.provideMerge(noopAnalyticsLayer), | |
| 239 | Layer.provideMerge(AnalyticsService.layerTest), | |
| 245 | 240 | ), |
| 246 | 241 | directoryLayer, |
| 247 | 242 | |
| ... | ... | @@ -288,7 +283,7 @@ it.effect("ProviderServiceLive keeps persisted resumable sessions on startup", ( |
| 288 | 283 | const providerLayer = makeProviderServiceLive().pipe( |
| 289 | 284 | Layer.provide(Layer.succeed(ProviderAdapterRegistry, registry)), |
| 290 | 285 | Layer.provide(directoryLayer), |
| 291 | Layer.provide(noopAnalyticsLayer), | |
| 286 | Layer.provide(AnalyticsService.layerTest), | |
| 292 | 287 | ); |
| 293 | 288 | |
| 294 | 289 | yield* Effect.gen(function* () { |
| ... | ... | @@ -347,7 +342,7 @@ it.effect( |
| 347 | 342 | const firstProviderLayer = makeProviderServiceLive().pipe( |
| 348 | 343 | Layer.provide(Layer.succeed(ProviderAdapterRegistry, firstRegistry)), |
| 349 | 344 | Layer.provide(firstDirectoryLayer), |
| 350 | Layer.provide(noopAnalyticsLayer), | |
| 345 | Layer.provide(AnalyticsService.layerTest), | |
| 351 | 346 | ); |
| 352 | 347 | |
| 353 | 348 | const startedSession = yield* Effect.gen(function* () { |
| ... | ... | @@ -390,7 +385,7 @@ it.effect( |
| 390 | 385 | const secondProviderLayer = makeProviderServiceLive().pipe( |
| 391 | 386 | Layer.provide(Layer.succeed(ProviderAdapterRegistry, secondRegistry)), |
| 392 | 387 | Layer.provide(secondDirectoryLayer), |
| 393 | Layer.provide(noopAnalyticsLayer), | |
| 388 | Layer.provide(AnalyticsService.layerTest), | |
| 394 | 389 | ); |
| 395 | 390 | |
| 396 | 391 | secondCodex.startSession.mockClear(); |
apps/server/src/telemetry/Layers/AnalyticsService.ts+19-17| ... | ... | @@ -96,26 +96,28 @@ const makeAnalyticsService = Effect.gen(function* () { |
| 96 | 96 | }); |
| 97 | 97 | |
| 98 | 98 | const flush: AnalyticsServiceShape["flush"] = Effect.gen(function* () { |
| 99 | const batch = yield* Ref.modify(bufferRef, (current) => { | |
| 100 | if (current.length === 0) { | |
| 101 | return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const; | |
| 102 | } | |
| 103 | const nextBatch = current.slice(0, telemetryConfig.flushBatchSize); | |
| 104 | const remaining = current.slice(nextBatch.length); | |
| 105 | return [nextBatch, remaining] as const; | |
| 106 | }); | |
| 99 | while (true) { | |
| 100 | const batch = yield* Ref.modify(bufferRef, (current) => { | |
| 101 | if (current.length === 0) { | |
| 102 | return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const; | |
| 103 | } | |
| 104 | const nextBatch = current.slice(0, telemetryConfig.flushBatchSize); | |
| 105 | const remaining = current.slice(nextBatch.length); | |
| 106 | return [nextBatch, remaining] as const; | |
| 107 | }); | |
| 107 | 108 | |
| 108 | if (batch.length === 0) { | |
| 109 | return; | |
| 110 | } | |
| 109 | if (batch.length === 0) { | |
| 110 | return; | |
| 111 | } | |
| 111 | 112 | |
| 112 | yield* sendBatch(batch).pipe( | |
| 113 | Effect.catch((error) => | |
| 114 | Ref.update(bufferRef, (current) => [...batch, ...current]).pipe( | |
| 115 | Effect.flatMap(() => Effect.fail(error)), | |
| 113 | yield* sendBatch(batch).pipe( | |
| 114 | Effect.catch((error) => | |
| 115 | Ref.update(bufferRef, (current) => [...batch, ...current]).pipe( | |
| 116 | Effect.flatMap(() => Effect.fail(error)), | |
| 117 | ), | |
| 116 | 118 | ), |
| 117 | ), | |
| 118 | ); | |
| 119 | ); | |
| 120 | } | |
| 119 | 121 | }).pipe(Effect.catch((cause) => Effect.logError("Failed to flush telemetry", { cause }))); |
| 120 | 122 | |
| 121 | 123 | const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) { |