diff --git a/packages/synapse-sdk/src/storage/context.ts b/packages/synapse-sdk/src/storage/context.ts index 7f90d308..a5cd06cd 100644 --- a/packages/synapse-sdk/src/storage/context.ts +++ b/packages/synapse-sdk/src/storage/context.ts @@ -436,7 +436,7 @@ export class StorageContext { ) } - const withCDN = dataSetInfo.cdnRailId > 0 + const withCDN = dataSetInfo.cdnRailId > 0 && METADATA_KEYS.WITH_CDN in dataSetMetadata if (options.withCDN != null && withCDN !== options.withCDN) { throw createError( 'StorageContext', diff --git a/packages/synapse-sdk/src/test/warm-storage-service.test.ts b/packages/synapse-sdk/src/test/warm-storage-service.test.ts index ed3f50ce..8b2560a9 100644 --- a/packages/synapse-sdk/src/test/warm-storage-service.test.ts +++ b/packages/synapse-sdk/src/test/warm-storage-service.test.ts @@ -332,6 +332,92 @@ describe('WarmStorageService', () => { assert.isTrue(managedDataSets[0].isManaged) }) + it('should set withCDN true when cdnRailId > 0 and withCDN metadata key present', async () => { + server.use( + JSONRPC({ + ...presets.basic, + warmStorageView: { + ...presets.basic.warmStorageView, + clientDataSets: () => [[242n]], + getDataSet: () => [ + { + pdpRailId: 48n, + cacheMissRailId: 50n, + cdnRailId: 51n, // CDN rail exists + payer: ADDRESSES.client1, + payee: ADDRESSES.payee1, + serviceProvider: ADDRESSES.serviceProvider1, + commissionBps: 100n, + clientDataSetId: 0n, + pdpEndEpoch: 0n, + providerId: 1n, + dataSetId: 242n, + }, + ], + getAllDataSetMetadata: () => [ + ['withCDN'], // withCDN key present + [''], + ], + }, + pdpVerifier: { + ...presets.basic.pdpVerifier, + dataSetLive: () => [true], + getNextPieceId: () => [2n], + getDataSetListener: () => [ADDRESSES.calibration.warmStorage], + }, + }) + ) + const warmStorageService = await createWarmStorageService() + const detailedDataSets = await warmStorageService.getClientDataSetsWithDetails(ADDRESSES.client1) + + assert.lengthOf(detailedDataSets, 1) + assert.equal(detailedDataSets[0].cdnRailId, 51) + assert.isTrue(detailedDataSets[0].withCDN) + }) + + it('should set withCDN false when cdnRailId > 0 but withCDN metadata key missing (terminated)', async () => { + server.use( + JSONRPC({ + ...presets.basic, + warmStorageView: { + ...presets.basic.warmStorageView, + clientDataSets: () => [[242n]], + getDataSet: () => [ + { + pdpRailId: 48n, + cacheMissRailId: 50n, + cdnRailId: 51n, // CDN rail still exists + payer: ADDRESSES.client1, + payee: ADDRESSES.payee1, + serviceProvider: ADDRESSES.serviceProvider1, + commissionBps: 100n, + clientDataSetId: 0n, + pdpEndEpoch: 0n, + providerId: 1n, + dataSetId: 242n, + }, + ], + getAllDataSetMetadata: () => [ + [], // No metadata keys - CDN was terminated + [], + ], + }, + pdpVerifier: { + ...presets.basic.pdpVerifier, + dataSetLive: () => [true], + getNextPieceId: () => [2n], + getDataSetListener: () => [ADDRESSES.calibration.warmStorage], + }, + }) + ) + const warmStorageService = await createWarmStorageService() + const detailedDataSets = await warmStorageService.getClientDataSetsWithDetails(ADDRESSES.client1) + + assert.lengthOf(detailedDataSets, 1) + assert.equal(detailedDataSets[0].cdnRailId, 51) + assert.isFalse(detailedDataSets[0].withCDN) // CDN terminated, metadata cleared + }) + it('should throw error when contract calls fail', async () => { server.use( JSONRPC({ diff --git a/packages/synapse-sdk/src/types.ts b/packages/synapse-sdk/src/types.ts index c7656ce3..bf21ec9c 100644 --- a/packages/synapse-sdk/src/types.ts +++ b/packages/synapse-sdk/src/types.ts @@ -237,7 +237,7 @@ export interface EnhancedDataSetInfo extends DataSetInfo { isLive: boolean /** Whether this data set is managed by the current Warm Storage contract */ isManaged: boolean - /** Whether the data set is using CDN (derived from cdnRailId > 0) */ + /** Whether the data set is using CDN (cdnRailId > 0 and withCDN metadata key present) */ withCDN: boolean /** Metadata associated with this data set (key-value pairs) */ metadata: Record diff --git a/packages/synapse-sdk/src/warm-storage/service.ts b/packages/synapse-sdk/src/warm-storage/service.ts index 2885da7b..5dcbad7c 100644 --- a/packages/synapse-sdk/src/warm-storage/service.ts +++ b/packages/synapse-sdk/src/warm-storage/service.ts @@ -31,7 +31,13 @@ import type { PaymentsService } from '../payments/service.ts' import type { DataSetCreationStatusResponse, PDPServer } from '../pdp/server.ts' import { PDPVerifier } from '../pdp/verifier.ts' import type { DataSetInfo, EnhancedDataSetInfo } from '../types.ts' -import { CONTRACT_ADDRESSES, SIZE_CONSTANTS, TIME_CONSTANTS, TIMING_CONSTANTS } from '../utils/constants.ts' +import { + CONTRACT_ADDRESSES, + METADATA_KEYS, + SIZE_CONSTANTS, + TIME_CONSTANTS, + TIMING_CONSTANTS, +} from '../utils/constants.ts' import { CONTRACT_ABIS, createError, getFilecoinNetworkType, TOKENS } from '../utils/index.ts' /** @@ -378,7 +384,7 @@ export class WarmStorageService { currentPieceCount: Number(nextPieceId), isLive, isManaged, - withCDN: base.cdnRailId > 0, + withCDN: base.cdnRailId > 0 && METADATA_KEYS.WITH_CDN in metadata, metadata, } } catch (error) {