1- import { assertEquals , assertThrows } from "@std/assert" ;
1+ import { assertEquals } from "@std/assert" ;
22import type { HrTime , SpanContext , SpanStatus } from "@opentelemetry/api" ;
33import { SpanKind , SpanStatusCode , TraceFlags } from "@opentelemetry/api" ;
44import type { ReadableSpan , TimedEvent } from "@opentelemetry/sdk-trace-base" ;
5- import { type KvKey , type KvStore , MemoryKvStore } from "../federation/kv.ts" ;
5+ import {
6+ type KvKey ,
7+ type KvStore ,
8+ type KvStoreListEntry ,
9+ MemoryKvStore ,
10+ } from "../federation/kv.ts" ;
611import { test } from "../testing/mod.ts" ;
712import { FedifySpanExporter } from "./exporter.ts" ;
813
@@ -86,40 +91,12 @@ function createActivitySentEvent(options: {
8691}
8792
8893test ( "FedifySpanExporter" , async ( t ) => {
89- await t . step (
90- "constructor throws if KvStore has neither list() nor cas()" ,
91- ( ) => {
92- const kv : KvStore = {
93- get : ( ) => Promise . resolve ( undefined ) ,
94- set : ( ) => Promise . resolve ( ) ,
95- delete : ( ) => Promise . resolve ( ) ,
96- } ;
97-
98- assertThrows (
99- ( ) => new FedifySpanExporter ( kv ) ,
100- Error ,
101- "KvStore must support either list() or cas()" ,
102- ) ;
103- } ,
104- ) ;
105-
10694 await t . step ( "constructor accepts KvStore with list()" , ( ) => {
10795 const kv = new MemoryKvStore ( ) ;
10896 const exporter = new FedifySpanExporter ( kv ) ;
10997 assertEquals ( exporter instanceof FedifySpanExporter , true ) ;
11098 } ) ;
11199
112- await t . step ( "constructor accepts KvStore with cas() only" , ( ) => {
113- const kv : KvStore = {
114- get : ( ) => Promise . resolve ( undefined ) ,
115- set : ( ) => Promise . resolve ( ) ,
116- delete : ( ) => Promise . resolve ( ) ,
117- cas : ( ) => Promise . resolve ( true ) ,
118- } ;
119- const exporter = new FedifySpanExporter ( kv ) ;
120- assertEquals ( exporter instanceof FedifySpanExporter , true ) ;
121- } ) ;
122-
123100 await t . step ( "export() stores inbound activity from span event" , async ( ) => {
124101 const kv = new MemoryKvStore ( ) ;
125102 const exporter = new FedifySpanExporter ( kv ) ;
@@ -369,7 +346,7 @@ test("FedifySpanExporter", async (t) => {
369346 await exporter . shutdown ( ) ;
370347 } ) ;
371348
372- await t . step ( "works with cas()-only KvStore" , async ( ) => {
349+ await t . step ( "works with custom KvStore implementation " , async ( ) => {
373350 const storedData : Record < string , unknown > = { } ;
374351
375352 const kv : KvStore = {
@@ -387,14 +364,15 @@ test("FedifySpanExporter", async (t) => {
387364 delete storedData [ k ] ;
388365 return Promise . resolve ( ) ;
389366 } ,
390- cas : ( key : KvKey , expected : unknown , newValue : unknown ) => {
391- const k = JSON . stringify ( key ) ;
392- const current = storedData [ k ] ;
393- if ( JSON . stringify ( current ) === JSON . stringify ( expected ) ) {
394- storedData [ k ] = newValue ;
395- return Promise . resolve ( true ) ;
367+ async * list ( prefix ?: KvKey ) : AsyncIterable < KvStoreListEntry > {
368+ for ( const [ encodedKey , value ] of Object . entries ( storedData ) ) {
369+ const key = JSON . parse ( encodedKey ) as KvKey ;
370+ if ( prefix != null ) {
371+ if ( key . length < prefix . length ) continue ;
372+ if ( ! prefix . every ( ( p , i ) => key [ i ] === p ) ) continue ;
373+ }
374+ yield { key, value } ;
396375 }
397- return Promise . resolve ( false ) ;
398376 } ,
399377 } ;
400378
0 commit comments