2026-04-15 19:52:45 +08:00
|
|
|
package notify
|
|
|
|
|
|
|
|
|
|
const (
|
2026-09-23 15:33:17 +08:00
|
|
|
recordStreamMetadataCapBatchAckKey = "_notify.record_cap_batch_ack"
|
|
|
|
|
recordStreamMetadataUseBatchAckKey = "_notify.record_use_batch_ack"
|
|
|
|
|
recordStreamMetadataCapHalfCloseKey = "_notify.record_cap_half_close"
|
|
|
|
|
recordStreamMetadataUseHalfCloseKey = "_notify.record_use_half_close"
|
|
|
|
|
recordStreamMetadataEnabledValue = "1"
|
2026-04-15 19:52:45 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func advertiseRecordStreamOpenMetadata(metadata StreamMetadata) StreamMetadata {
|
|
|
|
|
metadata = cloneStreamMetadata(metadata)
|
|
|
|
|
if metadata == nil {
|
|
|
|
|
metadata = make(StreamMetadata, 1)
|
|
|
|
|
}
|
2026-09-23 15:33:17 +08:00
|
|
|
delete(metadata, recordStreamMetadataUseHalfCloseKey)
|
2026-04-15 19:52:45 +08:00
|
|
|
metadata[recordStreamMetadataCapBatchAckKey] = recordStreamMetadataEnabledValue
|
2026-09-23 15:33:17 +08:00
|
|
|
metadata[recordStreamMetadataCapHalfCloseKey] = recordStreamMetadataEnabledValue
|
2026-04-15 19:52:45 +08:00
|
|
|
return metadata
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func negotiateRecordStreamOpenMetadata(channel StreamChannel, metadata StreamMetadata) (StreamMetadata, StreamMetadata) {
|
|
|
|
|
metadata = cloneStreamMetadata(metadata)
|
|
|
|
|
if normalizeStreamChannel(channel) != StreamRecordChannel {
|
|
|
|
|
return metadata, nil
|
|
|
|
|
}
|
2026-09-23 15:33:17 +08:00
|
|
|
response := make(StreamMetadata)
|
|
|
|
|
if metadata[recordStreamMetadataCapBatchAckKey] == recordStreamMetadataEnabledValue {
|
|
|
|
|
metadata[recordStreamMetadataUseBatchAckKey] = recordStreamMetadataEnabledValue
|
|
|
|
|
response[recordStreamMetadataUseBatchAckKey] = recordStreamMetadataEnabledValue
|
2026-04-15 19:52:45 +08:00
|
|
|
}
|
2026-09-23 15:33:17 +08:00
|
|
|
delete(metadata, recordStreamMetadataUseHalfCloseKey)
|
|
|
|
|
if metadata[recordStreamMetadataCapHalfCloseKey] == recordStreamMetadataEnabledValue {
|
|
|
|
|
metadata[recordStreamMetadataUseHalfCloseKey] = recordStreamMetadataEnabledValue
|
|
|
|
|
response[recordStreamMetadataUseHalfCloseKey] = recordStreamMetadataEnabledValue
|
2026-04-15 19:52:45 +08:00
|
|
|
}
|
2026-09-23 15:33:17 +08:00
|
|
|
return metadata, response
|
2026-04-15 19:52:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func mergeStreamMetadata(base StreamMetadata, overlay StreamMetadata) StreamMetadata {
|
|
|
|
|
if len(base) == 0 && len(overlay) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
merged := cloneStreamMetadata(base)
|
|
|
|
|
if merged == nil {
|
|
|
|
|
merged = make(StreamMetadata, len(overlay))
|
|
|
|
|
}
|
|
|
|
|
for key, value := range overlay {
|
|
|
|
|
merged[key] = value
|
|
|
|
|
}
|
|
|
|
|
return merged
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func recordStreamUseBatchAck(metadata StreamMetadata) bool {
|
|
|
|
|
return metadata[recordStreamMetadataUseBatchAckKey] == recordStreamMetadataEnabledValue
|
|
|
|
|
}
|
2026-09-23 15:33:17 +08:00
|
|
|
|
|
|
|
|
func recordStreamUseHalfClose(metadata StreamMetadata) bool {
|
|
|
|
|
return metadata[recordStreamMetadataUseHalfCloseKey] == recordStreamMetadataEnabledValue
|
|
|
|
|
}
|