@@ -50,6 +50,8 @@ interface BaseSynapseConfig {
5050 /** Optional override for WarmStorage contract address */
5151 warmStorageAddress ?: string | undefined
5252 withCDN ?: boolean | undefined
53+ /** Default metadata to apply when creating or reusing datasets */
54+ dataSetMetadata ?: Record < string , string >
5355 /**
5456 * Telemetry configuration.
5557 * Defaults to enabled unless explicitly disabled.
@@ -271,16 +273,43 @@ async function setupSessionKey(synapse: Synapse, sessionWallet: Wallet, logger:
271273 const now = Math . floor ( Date . now ( ) / 1000 )
272274 const bufferTime = 30 * 60 // 30 minutes in seconds
273275 const minValidTime = now + bufferTime
274- const createExpiry = Number ( expiries [ CREATE_DATA_SET_TYPEHASH ] )
275- const addExpiry = Number ( expiries [ ADD_PIECES_TYPEHASH ] )
276+ const createDataSetExpiry = Number ( expiries [ CREATE_DATA_SET_TYPEHASH ] )
277+ const addPiecesExpiry = Number ( expiries [ ADD_PIECES_TYPEHASH ] )
276278
277- if ( createExpiry <= minValidTime || addExpiry <= minValidTime ) {
279+ // For CREATE_DATA_SET:
280+ // - 0 means no permission granted (OK - can still add to existing datasets)
281+ // - > 0 but < minValidTime means expired/expiring (ERROR)
282+ // - >= minValidTime means valid (OK)
283+ const hasCreateDataSetPermission = createDataSetExpiry > 0
284+ const isCreateDataSetPermissionUnavailable = hasCreateDataSetPermission && createDataSetExpiry < minValidTime
285+
286+ // For ADD_PIECES:
287+ // - Must always have valid permission
288+ const isAddPiecesPermissionUnavailable = addPiecesExpiry <= minValidTime
289+
290+ if ( isCreateDataSetPermissionUnavailable ) {
278291 throw new Error (
279- `Session key expired or expiring soon (requires 30+ minutes validity). CreateDataSet: ${ new Date ( createExpiry * 1000 ) . toISOString ( ) } , AddPieces: ${ new Date ( addExpiry * 1000 ) . toISOString ( ) } `
292+ `Session key expired or expiring soon (requires 30+ minutes validity). CreateDataSet: ${ new Date ( createDataSetExpiry * 1000 ) . toISOString ( ) } `
280293 )
281294 }
282295
283- logger . info ( { event : 'synapse.session_key.verified' , createExpiry, addExpiry } , 'Session key verified' )
296+ if ( isAddPiecesPermissionUnavailable ) {
297+ throw new Error (
298+ `Session key expired or expiring soon (requires 30+ minutes validity). AddPieces: ${ new Date ( addPiecesExpiry * 1000 ) . toISOString ( ) } `
299+ )
300+ }
301+
302+ if ( ! hasCreateDataSetPermission ) {
303+ logger . info (
304+ { event : 'synapse.session_key.limited_permissions' } ,
305+ 'Session key can only add pieces to existing datasets (no CREATE_DATA_SET permission)'
306+ )
307+ }
308+
309+ logger . info (
310+ { event : 'synapse.session_key.verified' , createExpiry : createDataSetExpiry , addExpiry : addPiecesExpiry } ,
311+ 'Session key verified'
312+ )
284313
285314 synapse . setSession ( sessionKey )
286315 logger . info ( { event : 'synapse.session_key.activated' } , 'Session key activated' )
@@ -427,6 +456,22 @@ export async function createStorageContext(
427456 'Connecting to existing dataset'
428457 )
429458 } else if ( options ?. dataset ?. createNew === true ) {
459+ // If explicitly creating a new dataset in session key mode, verify we have permission
460+ if ( isSessionKeyMode ( synapse ) ) {
461+ const signer = synapse . getSigner ( )
462+ const sessionKey = synapse . createSessionKey ( signer )
463+
464+ const expiries = await sessionKey . fetchExpiries ( [ CREATE_DATA_SET_TYPEHASH ] )
465+ const createDataSetExpiry = Number ( expiries [ CREATE_DATA_SET_TYPEHASH ] )
466+
467+ if ( createDataSetExpiry === 0 ) {
468+ throw new Error (
469+ 'Cannot create new dataset: Session key does not have CREATE_DATA_SET permission. ' +
470+ 'Either use an existing dataset or obtain a session key with dataset creation rights.'
471+ )
472+ }
473+ }
474+
430475 sdkOptions . forceCreateDataSet = true
431476 logger . info ( { event : 'synapse.storage.dataset.create_new' } , 'Forcing creation of new dataset' )
432477 }
@@ -568,7 +613,21 @@ export async function setupSynapse(
568613 const synapse = await initializeSynapse ( config , logger )
569614
570615 // Create storage context
571- const { storage, providerInfo } = await createStorageContext ( synapse , logger , options )
616+ let storageOptions = options ? { ...options } : undefined
617+ if ( config . dataSetMetadata && Object . keys ( config . dataSetMetadata ) . length > 0 ) {
618+ storageOptions = {
619+ ...( storageOptions ?? { } ) ,
620+ dataset : {
621+ ...( storageOptions ?. dataset ?? { } ) ,
622+ metadata : {
623+ ...config . dataSetMetadata ,
624+ ...( storageOptions ?. dataset ?. metadata ?? { } ) ,
625+ } ,
626+ } ,
627+ }
628+ }
629+
630+ const { storage, providerInfo } = await createStorageContext ( synapse , logger , storageOptions )
572631
573632 return { synapse, storage, providerInfo }
574633}
0 commit comments