@azure/storage-blob-changefeed 12.0.0-alpha.20250407.1 → 12.0.0-alpha.20250520.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -37
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/AvroReaderFactory.d.ts +2 -2
- package/dist/browser/AvroReaderFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/AvroReaderFactory.js +1 -1
- package/dist/browser/AvroReaderFactory.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/BlobChangeFeedClient.d.ts +74 -56
- package/dist/browser/BlobChangeFeedClient.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/BlobChangeFeedClient.js +52 -44
- package/dist/browser/BlobChangeFeedClient.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/ChangeFeed.d.ts +4 -4
- package/dist/browser/ChangeFeed.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/ChangeFeed.js +2 -2
- package/dist/browser/ChangeFeed.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/ChangeFeedFactory.d.ts +3 -3
- package/dist/browser/ChangeFeedFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/ChangeFeedFactory.js +14 -11
- package/dist/browser/ChangeFeedFactory.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/Chunk.d.ts +2 -3
- package/dist/browser/Chunk.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/Chunk.js +1 -1
- package/dist/browser/Chunk.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/ChunkFactory.d.ts +3 -3
- package/dist/browser/ChunkFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/ChunkFactory.js +3 -3
- package/dist/browser/ChunkFactory.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/LazyLoadingBlobStream.d.ts +2 -2
- package/dist/browser/LazyLoadingBlobStream.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/LazyLoadingBlobStream.js +2 -2
- package/dist/browser/LazyLoadingBlobStream.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/LazyLoadingBlobStreamFactory.d.ts +2 -2
- package/dist/browser/LazyLoadingBlobStreamFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/LazyLoadingBlobStreamFactory.js +1 -1
- package/dist/browser/LazyLoadingBlobStreamFactory.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/Segment.d.ts +3 -3
- package/dist/browser/Segment.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/Segment.js +1 -1
- package/dist/browser/Segment.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/SegmentFactory.d.ts +3 -3
- package/dist/browser/SegmentFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/SegmentFactory.js +5 -5
- package/dist/browser/SegmentFactory.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/Shard.d.ts +4 -4
- package/dist/browser/Shard.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/Shard.js +1 -1
- package/dist/browser/Shard.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/ShardFactory.d.ts +3 -3
- package/dist/browser/ShardFactory.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/ShardFactory.js +2 -2
- package/dist/browser/ShardFactory.js.map +1 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +6 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/log.d.ts.map +1 -0
- package/dist/browser/log.js.map +1 -0
- package/dist/browser/models/BlobChangeFeedEvent.d.ts.map +1 -0
- package/dist/browser/models/BlobChangeFeedEvent.js.map +1 -0
- package/dist/browser/models/ChangeFeedCursor.d.ts.map +1 -0
- package/dist/browser/models/ChangeFeedCursor.js.map +1 -0
- package/dist/browser/models/models.d.ts.map +1 -0
- package/dist/browser/models/models.js.map +1 -0
- package/dist/browser/package.json +3 -0
- package/dist/browser/utils/constants.d.ts.map +1 -0
- package/dist/browser/utils/constants.js.map +1 -0
- package/dist/browser/utils/tracing.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/utils/tracing.js +1 -1
- package/dist/browser/utils/tracing.js.map +1 -0
- package/dist/browser/utils/utils.browser.d.ts.map +1 -0
- package/dist/browser/utils/utils.browser.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/utils/utils.common.d.ts +1 -1
- package/dist/browser/utils/utils.common.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/utils/utils.common.js +2 -2
- package/dist/browser/utils/utils.common.js.map +1 -0
- package/{types/latest/storage-blob-changefeed/src → dist/browser}/utils/utils.node.d.ts +1 -1
- package/dist/browser/utils/utils.node.d.ts.map +1 -0
- package/{dist-esm/storage-blob-changefeed/src → dist/browser}/utils/utils.node.js +1 -1
- package/dist/browser/utils/utils.node.js.map +1 -0
- package/dist/commonjs/AvroReaderFactory.d.ts +10 -0
- package/dist/commonjs/AvroReaderFactory.d.ts.map +1 -0
- package/dist/commonjs/AvroReaderFactory.js +21 -0
- package/dist/commonjs/AvroReaderFactory.js.map +1 -0
- package/dist/commonjs/BlobChangeFeedClient.d.ts +201 -0
- package/dist/commonjs/BlobChangeFeedClient.d.ts.map +1 -0
- package/dist/commonjs/BlobChangeFeedClient.js +239 -0
- package/dist/commonjs/BlobChangeFeedClient.js.map +1 -0
- package/dist/commonjs/ChangeFeed.d.ts +37 -0
- package/dist/commonjs/ChangeFeed.d.ts.map +1 -0
- package/dist/commonjs/ChangeFeed.js +97 -0
- package/dist/commonjs/ChangeFeed.js.map +1 -0
- package/dist/commonjs/ChangeFeedFactory.d.ts +13 -0
- package/dist/commonjs/ChangeFeedFactory.d.ts.map +1 -0
- package/dist/commonjs/ChangeFeedFactory.js +124 -0
- package/dist/commonjs/ChangeFeedFactory.js.map +1 -0
- package/dist/commonjs/Chunk.d.ts +27 -0
- package/dist/commonjs/Chunk.d.ts.map +1 -0
- package/dist/commonjs/Chunk.js +44 -0
- package/dist/commonjs/Chunk.js.map +1 -0
- package/dist/commonjs/ChunkFactory.d.ts +23 -0
- package/dist/commonjs/ChunkFactory.d.ts.map +1 -0
- package/dist/commonjs/ChunkFactory.js +34 -0
- package/dist/commonjs/ChunkFactory.js.map +1 -0
- package/dist/commonjs/LazyLoadingBlobStream.d.ts +46 -0
- package/dist/commonjs/LazyLoadingBlobStream.d.ts.map +1 -0
- package/dist/commonjs/LazyLoadingBlobStream.js +85 -0
- package/dist/commonjs/LazyLoadingBlobStream.js.map +1 -0
- package/dist/commonjs/LazyLoadingBlobStreamFactory.d.ts +7 -0
- package/dist/commonjs/LazyLoadingBlobStreamFactory.d.ts.map +1 -0
- package/dist/commonjs/LazyLoadingBlobStreamFactory.js +13 -0
- package/dist/commonjs/LazyLoadingBlobStreamFactory.js.map +1 -0
- package/dist/commonjs/Segment.d.ts +29 -0
- package/dist/commonjs/Segment.d.ts.map +1 -0
- package/dist/commonjs/Segment.js +64 -0
- package/dist/commonjs/Segment.js.map +1 -0
- package/dist/commonjs/SegmentFactory.d.ts +29 -0
- package/dist/commonjs/SegmentFactory.d.ts.map +1 -0
- package/dist/commonjs/SegmentFactory.js +50 -0
- package/dist/commonjs/SegmentFactory.js.map +1 -0
- package/dist/commonjs/Shard.d.ts +28 -0
- package/dist/commonjs/Shard.d.ts.map +1 -0
- package/dist/commonjs/Shard.js +45 -0
- package/dist/commonjs/Shard.js.map +1 -0
- package/dist/commonjs/ShardFactory.d.ts +21 -0
- package/dist/commonjs/ShardFactory.d.ts.map +1 -0
- package/dist/commonjs/ShardFactory.js +72 -0
- package/dist/commonjs/ShardFactory.js.map +1 -0
- package/dist/commonjs/index.d.ts +4 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +9 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/log.d.ts +5 -0
- package/dist/commonjs/log.d.ts.map +1 -0
- package/dist/commonjs/log.js +11 -0
- package/dist/commonjs/log.js.map +1 -0
- package/dist/commonjs/models/BlobChangeFeedEvent.d.ts +233 -0
- package/dist/commonjs/models/BlobChangeFeedEvent.d.ts.map +1 -0
- package/dist/commonjs/models/BlobChangeFeedEvent.js +5 -0
- package/dist/commonjs/models/BlobChangeFeedEvent.js.map +1 -0
- package/dist/commonjs/models/ChangeFeedCursor.d.ts +17 -0
- package/dist/commonjs/models/ChangeFeedCursor.d.ts.map +1 -0
- package/dist/commonjs/models/ChangeFeedCursor.js +5 -0
- package/dist/commonjs/models/ChangeFeedCursor.js.map +1 -0
- package/dist/commonjs/models/models.d.ts +23 -0
- package/dist/commonjs/models/models.d.ts.map +1 -0
- package/dist/commonjs/models/models.js +5 -0
- package/dist/commonjs/models/models.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/{types/latest → dist/commonjs}/tsdoc-metadata.json +1 -1
- package/dist/commonjs/utils/constants.d.ts +9 -0
- package/dist/commonjs/utils/constants.d.ts.map +1 -0
- package/dist/commonjs/utils/constants.js +14 -0
- package/dist/commonjs/utils/constants.js.map +1 -0
- package/dist/commonjs/utils/tracing.d.ts +6 -0
- package/dist/commonjs/utils/tracing.d.ts.map +1 -0
- package/dist/commonjs/utils/tracing.js +17 -0
- package/dist/commonjs/utils/tracing.js.map +1 -0
- package/dist/commonjs/utils/utils.browser.d.ts +14 -0
- package/dist/commonjs/utils/utils.browser.d.ts.map +1 -0
- package/dist/commonjs/utils/utils.browser.js +34 -0
- package/dist/commonjs/utils/utils.browser.js.map +1 -0
- package/dist/commonjs/utils/utils.common.d.ts +37 -0
- package/dist/commonjs/utils/utils.common.d.ts.map +1 -0
- package/dist/commonjs/utils/utils.common.js +207 -0
- package/dist/commonjs/utils/utils.common.js.map +1 -0
- package/dist/commonjs/utils/utils.node.d.ts +14 -0
- package/dist/commonjs/utils/utils.node.d.ts.map +1 -0
- package/dist/commonjs/utils/utils.node.js +32 -0
- package/dist/commonjs/utils/utils.node.js.map +1 -0
- package/dist/esm/AvroReaderFactory.d.ts +10 -0
- package/dist/esm/AvroReaderFactory.d.ts.map +1 -0
- package/dist/esm/AvroReaderFactory.js +17 -0
- package/dist/esm/AvroReaderFactory.js.map +1 -0
- package/dist/esm/BlobChangeFeedClient.d.ts +201 -0
- package/dist/esm/BlobChangeFeedClient.d.ts.map +1 -0
- package/dist/esm/BlobChangeFeedClient.js +233 -0
- package/dist/esm/BlobChangeFeedClient.js.map +1 -0
- package/dist/esm/ChangeFeed.d.ts +37 -0
- package/dist/esm/ChangeFeed.d.ts.map +1 -0
- package/dist/esm/ChangeFeed.js +93 -0
- package/dist/esm/ChangeFeed.js.map +1 -0
- package/dist/esm/ChangeFeedFactory.d.ts +13 -0
- package/dist/esm/ChangeFeedFactory.d.ts.map +1 -0
- package/dist/esm/ChangeFeedFactory.js +120 -0
- package/dist/esm/ChangeFeedFactory.js.map +1 -0
- package/dist/esm/Chunk.d.ts +27 -0
- package/dist/esm/Chunk.d.ts.map +1 -0
- package/dist/esm/Chunk.js +40 -0
- package/dist/esm/Chunk.js.map +1 -0
- package/dist/esm/ChunkFactory.d.ts +23 -0
- package/dist/esm/ChunkFactory.d.ts.map +1 -0
- package/dist/esm/ChunkFactory.js +30 -0
- package/dist/esm/ChunkFactory.js.map +1 -0
- package/dist/esm/LazyLoadingBlobStream.d.ts +46 -0
- package/dist/esm/LazyLoadingBlobStream.d.ts.map +1 -0
- package/dist/esm/LazyLoadingBlobStream.js +81 -0
- package/dist/esm/LazyLoadingBlobStream.js.map +1 -0
- package/dist/esm/LazyLoadingBlobStreamFactory.d.ts +7 -0
- package/dist/esm/LazyLoadingBlobStreamFactory.d.ts.map +1 -0
- package/dist/esm/LazyLoadingBlobStreamFactory.js +9 -0
- package/dist/esm/LazyLoadingBlobStreamFactory.js.map +1 -0
- package/dist/esm/Segment.d.ts +29 -0
- package/dist/esm/Segment.d.ts.map +1 -0
- package/dist/esm/Segment.js +60 -0
- package/dist/esm/Segment.js.map +1 -0
- package/dist/esm/SegmentFactory.d.ts +29 -0
- package/dist/esm/SegmentFactory.d.ts.map +1 -0
- package/dist/esm/SegmentFactory.js +46 -0
- package/dist/esm/SegmentFactory.js.map +1 -0
- package/dist/esm/Shard.d.ts +28 -0
- package/dist/esm/Shard.d.ts.map +1 -0
- package/dist/esm/Shard.js +41 -0
- package/dist/esm/Shard.js.map +1 -0
- package/dist/esm/ShardFactory.d.ts +21 -0
- package/dist/esm/ShardFactory.d.ts.map +1 -0
- package/dist/esm/ShardFactory.js +68 -0
- package/dist/esm/ShardFactory.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/log.d.ts +5 -0
- package/dist/esm/log.d.ts.map +1 -0
- package/dist/esm/log.js +8 -0
- package/dist/esm/log.js.map +1 -0
- package/dist/esm/models/BlobChangeFeedEvent.d.ts +233 -0
- package/dist/esm/models/BlobChangeFeedEvent.d.ts.map +1 -0
- package/{dist-esm/storage-internal-avro/src/AvroReadable.js → dist/esm/models/BlobChangeFeedEvent.js} +2 -3
- package/dist/esm/models/BlobChangeFeedEvent.js.map +1 -0
- package/dist/esm/models/ChangeFeedCursor.d.ts +17 -0
- package/dist/esm/models/ChangeFeedCursor.d.ts.map +1 -0
- package/dist/esm/models/ChangeFeedCursor.js +4 -0
- package/dist/esm/models/ChangeFeedCursor.js.map +1 -0
- package/dist/esm/models/models.d.ts +23 -0
- package/dist/esm/models/models.d.ts.map +1 -0
- package/dist/esm/models/models.js +4 -0
- package/dist/esm/models/models.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/utils/constants.d.ts +9 -0
- package/dist/esm/utils/constants.d.ts.map +1 -0
- package/dist/esm/utils/constants.js +11 -0
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/tracing.d.ts +6 -0
- package/dist/esm/utils/tracing.d.ts.map +1 -0
- package/dist/esm/utils/tracing.js +14 -0
- package/dist/esm/utils/tracing.js.map +1 -0
- package/dist/esm/utils/utils.browser.d.ts +14 -0
- package/dist/esm/utils/utils.browser.d.ts.map +1 -0
- package/dist/esm/utils/utils.browser.js +29 -0
- package/dist/esm/utils/utils.browser.js.map +1 -0
- package/dist/esm/utils/utils.common.d.ts +37 -0
- package/dist/esm/utils/utils.common.d.ts.map +1 -0
- package/dist/esm/utils/utils.common.js +197 -0
- package/dist/esm/utils/utils.common.js.map +1 -0
- package/dist/esm/utils/utils.node.d.ts +14 -0
- package/dist/esm/utils/utils.node.d.ts.map +1 -0
- package/dist/esm/utils/utils.node.js +28 -0
- package/dist/esm/utils/utils.node.js.map +1 -0
- package/dist/react-native/AvroReaderFactory.d.ts +10 -0
- package/dist/react-native/AvroReaderFactory.d.ts.map +1 -0
- package/dist/react-native/AvroReaderFactory.js +17 -0
- package/dist/react-native/AvroReaderFactory.js.map +1 -0
- package/dist/react-native/BlobChangeFeedClient.d.ts +201 -0
- package/dist/react-native/BlobChangeFeedClient.d.ts.map +1 -0
- package/dist/react-native/BlobChangeFeedClient.js +233 -0
- package/dist/react-native/BlobChangeFeedClient.js.map +1 -0
- package/dist/react-native/ChangeFeed.d.ts +37 -0
- package/dist/react-native/ChangeFeed.d.ts.map +1 -0
- package/dist/react-native/ChangeFeed.js +93 -0
- package/dist/react-native/ChangeFeed.js.map +1 -0
- package/dist/react-native/ChangeFeedFactory.d.ts +13 -0
- package/dist/react-native/ChangeFeedFactory.d.ts.map +1 -0
- package/dist/react-native/ChangeFeedFactory.js +120 -0
- package/dist/react-native/ChangeFeedFactory.js.map +1 -0
- package/dist/react-native/Chunk.d.ts +27 -0
- package/dist/react-native/Chunk.d.ts.map +1 -0
- package/dist/react-native/Chunk.js +40 -0
- package/dist/react-native/Chunk.js.map +1 -0
- package/dist/react-native/ChunkFactory.d.ts +23 -0
- package/dist/react-native/ChunkFactory.d.ts.map +1 -0
- package/dist/react-native/ChunkFactory.js +30 -0
- package/dist/react-native/ChunkFactory.js.map +1 -0
- package/dist/react-native/LazyLoadingBlobStream.d.ts +46 -0
- package/dist/react-native/LazyLoadingBlobStream.d.ts.map +1 -0
- package/dist/react-native/LazyLoadingBlobStream.js +81 -0
- package/dist/react-native/LazyLoadingBlobStream.js.map +1 -0
- package/dist/react-native/LazyLoadingBlobStreamFactory.d.ts +7 -0
- package/dist/react-native/LazyLoadingBlobStreamFactory.d.ts.map +1 -0
- package/dist/react-native/LazyLoadingBlobStreamFactory.js +9 -0
- package/dist/react-native/LazyLoadingBlobStreamFactory.js.map +1 -0
- package/dist/react-native/Segment.d.ts +29 -0
- package/dist/react-native/Segment.d.ts.map +1 -0
- package/dist/react-native/Segment.js +60 -0
- package/dist/react-native/Segment.js.map +1 -0
- package/dist/react-native/SegmentFactory.d.ts +29 -0
- package/dist/react-native/SegmentFactory.d.ts.map +1 -0
- package/dist/react-native/SegmentFactory.js +46 -0
- package/dist/react-native/SegmentFactory.js.map +1 -0
- package/dist/react-native/Shard.d.ts +28 -0
- package/dist/react-native/Shard.d.ts.map +1 -0
- package/dist/react-native/Shard.js +41 -0
- package/dist/react-native/Shard.js.map +1 -0
- package/dist/react-native/ShardFactory.d.ts +21 -0
- package/dist/react-native/ShardFactory.d.ts.map +1 -0
- package/dist/react-native/ShardFactory.js +68 -0
- package/dist/react-native/ShardFactory.js.map +1 -0
- package/dist/react-native/index.d.ts +4 -0
- package/dist/react-native/index.d.ts.map +1 -0
- package/dist/react-native/index.js +6 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/react-native/log.d.ts +5 -0
- package/dist/react-native/log.d.ts.map +1 -0
- package/dist/react-native/log.js +8 -0
- package/dist/react-native/log.js.map +1 -0
- package/dist/react-native/models/BlobChangeFeedEvent.d.ts +233 -0
- package/dist/react-native/models/BlobChangeFeedEvent.d.ts.map +1 -0
- package/dist/react-native/models/BlobChangeFeedEvent.js +4 -0
- package/dist/react-native/models/BlobChangeFeedEvent.js.map +1 -0
- package/dist/react-native/models/ChangeFeedCursor.d.ts +17 -0
- package/dist/react-native/models/ChangeFeedCursor.d.ts.map +1 -0
- package/dist/react-native/models/ChangeFeedCursor.js +4 -0
- package/dist/react-native/models/ChangeFeedCursor.js.map +1 -0
- package/dist/react-native/models/models.d.ts +23 -0
- package/dist/react-native/models/models.d.ts.map +1 -0
- package/dist/react-native/models/models.js +4 -0
- package/dist/react-native/models/models.js.map +1 -0
- package/dist/react-native/package.json +3 -0
- package/dist/react-native/utils/constants.d.ts +9 -0
- package/dist/react-native/utils/constants.d.ts.map +1 -0
- package/dist/react-native/utils/constants.js +11 -0
- package/dist/react-native/utils/constants.js.map +1 -0
- package/dist/react-native/utils/tracing.d.ts +6 -0
- package/dist/react-native/utils/tracing.d.ts.map +1 -0
- package/dist/react-native/utils/tracing.js +14 -0
- package/dist/react-native/utils/tracing.js.map +1 -0
- package/dist/react-native/utils/utils.browser.d.ts +14 -0
- package/dist/react-native/utils/utils.browser.d.ts.map +1 -0
- package/dist/react-native/utils/utils.browser.js +29 -0
- package/dist/react-native/utils/utils.browser.js.map +1 -0
- package/dist/react-native/utils/utils.common.d.ts +37 -0
- package/dist/react-native/utils/utils.common.d.ts.map +1 -0
- package/dist/react-native/utils/utils.common.js +197 -0
- package/dist/react-native/utils/utils.common.js.map +1 -0
- package/dist/react-native/utils/utils.node.d.ts +14 -0
- package/dist/react-native/utils/utils.node.d.ts.map +1 -0
- package/dist/react-native/utils/utils.node.js +28 -0
- package/dist/react-native/utils/utils.node.js.map +1 -0
- package/package.json +69 -68
- package/dist/index.js +0 -1577
- package/dist/index.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/AvroReaderFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/BlobChangeFeedClient.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/ChangeFeed.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/ChangeFeedFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/Chunk.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/ChunkFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/LazyLoadingBlobStream.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/LazyLoadingBlobStreamFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/Segment.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/SegmentFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/Shard.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/ShardFactory.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/index.js +0 -6
- package/dist-esm/storage-blob-changefeed/src/index.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/log.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/models/BlobChangeFeedEvent.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/models/ChangeFeedCursor.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/models/models.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/utils/constants.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/utils/tracing.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/utils/utils.browser.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/utils/utils.common.js.map +0 -1
- package/dist-esm/storage-blob-changefeed/src/utils/utils.node.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroConstants.js +0 -7
- package/dist-esm/storage-internal-avro/src/AvroConstants.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroParser.js +0 -317
- package/dist-esm/storage-internal-avro/src/AvroParser.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroReadable.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroReadableFromBlob.js +0 -47
- package/dist-esm/storage-internal-avro/src/AvroReadableFromBlob.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroReadableFromStream.js +0 -84
- package/dist-esm/storage-internal-avro/src/AvroReadableFromStream.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/AvroReader.js +0 -106
- package/dist-esm/storage-internal-avro/src/AvroReader.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/index.browser.js +0 -6
- package/dist-esm/storage-internal-avro/src/index.browser.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/index.js +0 -6
- package/dist-esm/storage-internal-avro/src/index.js.map +0 -1
- package/dist-esm/storage-internal-avro/src/utils/utils.common.js +0 -16
- package/dist-esm/storage-internal-avro/src/utils/utils.common.js.map +0 -1
- package/types/latest/storage-blob-changefeed/samples-dev/blobChangeFeedClient.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/samples-dev/blobChangeFeedClient.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/samples-dev/resumeListChanges.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/samples-dev/resumeListChanges.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/AvroReaderFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/BlobChangeFeedClient.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/ChangeFeed.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/ChangeFeedFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/Chunk.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/ChunkFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/LazyLoadingBlobStream.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/LazyLoadingBlobStreamFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/Segment.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/SegmentFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/Shard.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/ShardFactory.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/index.d.ts +0 -4
- package/types/latest/storage-blob-changefeed/src/index.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/log.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/models/BlobChangeFeedEvent.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/models/ChangeFeedCursor.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/models/models.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/utils/constants.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/utils/tracing.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/utils/utils.browser.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/utils/utils.common.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/src/utils/utils.node.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/blobchangefeedclient.spec.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/test/blobchangefeedclient.spec.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/changefeed.spec.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/test/changefeed.spec.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/chunk.spec.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/test/chunk.spec.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/segment.spec.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/test/segment.spec.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/shard.spec.d.ts +0 -2
- package/types/latest/storage-blob-changefeed/test/shard.spec.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/utils/index.d.ts +0 -15
- package/types/latest/storage-blob-changefeed/test/utils/index.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed/test/utils/testutils.common.d.ts +0 -67
- package/types/latest/storage-blob-changefeed/test/utils/testutils.common.d.ts.map +0 -1
- package/types/latest/storage-blob-changefeed.d.ts +0 -453
- package/types/latest/storage-internal-avro/src/AvroConstants.d.ts +0 -5
- package/types/latest/storage-internal-avro/src/AvroConstants.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/AvroParser.d.ts +0 -57
- package/types/latest/storage-internal-avro/src/AvroParser.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/AvroReadable.d.ts +0 -16
- package/types/latest/storage-internal-avro/src/AvroReadable.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/AvroReadableFromBlob.d.ts +0 -10
- package/types/latest/storage-internal-avro/src/AvroReadableFromBlob.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/AvroReadableFromStream.d.ts +0 -11
- package/types/latest/storage-internal-avro/src/AvroReadableFromStream.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/AvroReader.d.ts +0 -32
- package/types/latest/storage-internal-avro/src/AvroReader.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/index.browser.d.ts +0 -4
- package/types/latest/storage-internal-avro/src/index.browser.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/index.d.ts +0 -4
- package/types/latest/storage-internal-avro/src/index.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/src/utils/utils.common.d.ts +0 -6
- package/types/latest/storage-internal-avro/src/utils/utils.common.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/test/browser/avroreadable.spec.d.ts +0 -2
- package/types/latest/storage-internal-avro/test/browser/avroreadable.spec.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/test/node/avroreadable.spec.d.ts +0 -2
- package/types/latest/storage-internal-avro/test/node/avroreadable.spec.d.ts.map +0 -1
- package/types/latest/storage-internal-avro/test/node/avroreader.spec.d.ts +0 -2
- package/types/latest/storage-internal-avro/test/node/avroreader.spec.d.ts.map +0 -1
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/log.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/log.js +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/models/BlobChangeFeedEvent.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/models/BlobChangeFeedEvent.js +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/models/ChangeFeedCursor.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/models/ChangeFeedCursor.js +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/models/models.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/models/models.js +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/utils/constants.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/utils/constants.js +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/utils/tracing.d.ts +0 -0
- /package/{types/latest/storage-blob-changefeed/src → dist/browser}/utils/utils.browser.d.ts +0 -0
- /package/{dist-esm/storage-blob-changefeed/src → dist/browser}/utils/utils.browser.js +0 -0
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/constants.ts","../src/utils/tracing.ts","../src/utils/utils.common.ts","../src/ChangeFeed.ts","../../storage-internal-avro/src/AvroConstants.ts","../../storage-internal-avro/src/AvroParser.ts","../../storage-internal-avro/src/utils/utils.common.ts","../../storage-internal-avro/src/AvroReader.ts","../../storage-internal-avro/src/AvroReadable.ts","../../storage-internal-avro/src/AvroReadableFromStream.ts","../src/utils/utils.node.ts","../src/Segment.ts","../src/SegmentFactory.ts","../src/Shard.ts","../src/ShardFactory.ts","../src/Chunk.ts","../src/ChunkFactory.ts","../src/AvroReaderFactory.ts","../src/LazyLoadingBlobStream.ts","../src/LazyLoadingBlobStreamFactory.ts","../src/ChangeFeedFactory.ts","../src/BlobChangeFeedClient.ts"],"sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport const SDK_VERSION: string = \"12.0.0-preview.5\";\n\nexport const CHANGE_FEED_CONTAINER_NAME: string = \"$blobchangefeed\";\nexport const CHANGE_FEED_META_SEGMENT_PATH: string = \"meta/segments.json\";\nexport const CHANGE_FEED_STATUS_FINALIZED: string = \"Finalized\";\nexport const CHANGE_FEED_SEGMENT_PREFIX: string = \"idx/segments/\";\nexport const CHANGE_FEED_INITIALIZATION_SEGMENT: string = \"1601\";\n\nexport const CHANGE_FEED_MAX_PAGE_SIZE: number = 5000; // align with rest API list operations\nexport const CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE: number = 16 * 1024 * 1024;\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { createTracingClient } from \"@azure/core-tracing\";\nimport { SDK_VERSION } from \"./constants\";\n\n/**\n * Creates a span using the global tracer.\n * @internal\n */\nexport const tracingClient = createTracingClient({\n packageName: \"@azure/storage-blob-changefeed\",\n packageVersion: SDK_VERSION,\n namespace: \"Microsoft.Storage\",\n});\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport { CHANGE_FEED_SEGMENT_PREFIX, CHANGE_FEED_INITIALIZATION_SEGMENT } from \"./constants\";\nimport { tracingClient } from \"./tracing\";\nimport type { BlobChangeFeedEvent, UpdatedBlobProperties } from \"../models/BlobChangeFeedEvent\";\n\nconst millisecondsInAnHour = 60 * 60 * 1000;\nexport function ceilToNearestHour(date: Date | undefined): Date | undefined {\n if (date === undefined) {\n return undefined;\n }\n return new Date(Math.ceil(date.getTime() / millisecondsInAnHour) * millisecondsInAnHour);\n}\n\nexport function floorToNearestHour(date: Date | undefined): Date | undefined {\n if (date === undefined) {\n return undefined;\n }\n return new Date(Math.floor(date.getTime() / millisecondsInAnHour) * millisecondsInAnHour);\n}\n\n/**\n * Get host from an URL string.\n *\n * @param url - Source URL string\n */\nexport function getHost(url: string): string | undefined {\n const urlParsed = new URL(url);\n return urlParsed.hostname;\n}\n\n/**\n * Options to configure {@link getYearsPaths} operation.\n */\nexport interface GetYearsPathsOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport async function getYearsPaths(\n containerClient: ContainerClient,\n options: GetYearsPathsOptions = {},\n): Promise<number[]> {\n return tracingClient.withSpan(\"getYearsPaths\", options, async (updatedOptions) => {\n const years: number[] = [];\n for await (const item of containerClient.listBlobsByHierarchy(\"/\", {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n prefix: CHANGE_FEED_SEGMENT_PREFIX,\n })) {\n if (item.kind === \"prefix\" && !item.name.includes(CHANGE_FEED_INITIALIZATION_SEGMENT)) {\n const yearStr = item.name.slice(CHANGE_FEED_SEGMENT_PREFIX.length, -1);\n years.push(parseInt(yearStr));\n }\n }\n return years.sort((a, b) => a - b);\n });\n}\n\n/**\n * Options to configure {@link getSegmentsInYear} operation.\n */\nexport interface GetSegmentsInYearOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport async function getSegmentsInYear(\n containerClient: ContainerClient,\n year: number,\n startTime?: Date,\n endTime?: Date,\n options: GetSegmentsInYearOptions = {},\n): Promise<string[]> {\n return tracingClient.withSpan(\"getSegmentsInYear\", options, async (updatedOptions) => {\n const segments: string[] = [];\n const yearBeginTime = new Date(Date.UTC(year, 0));\n if (endTime && yearBeginTime >= endTime) {\n return segments;\n }\n\n const prefix = `${CHANGE_FEED_SEGMENT_PREFIX}${year}/`;\n for await (const item of containerClient.listBlobsFlat({\n prefix,\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n })) {\n const segmentTime = parseDateFromSegmentPath(item.name);\n if ((startTime && segmentTime < startTime) || (endTime && segmentTime >= endTime)) {\n continue;\n }\n segments.push(item.name);\n }\n return segments;\n });\n}\n\nexport function parseDateFromSegmentPath(segmentPath: string): Date {\n const splitPath = segmentPath.split(\"/\");\n if (splitPath.length < 3) {\n throw new Error(`${segmentPath} is not a valid segment path.`);\n }\n\n const segmentTime = new Date(0);\n segmentTime.setUTCFullYear(parseInt(splitPath[2]));\n\n if (splitPath.length >= 4) {\n segmentTime.setUTCMonth(parseInt(splitPath[3]) - 1);\n }\n if (splitPath.length >= 5) {\n segmentTime.setUTCDate(parseInt(splitPath[4]));\n }\n if (splitPath.length >= 6) {\n segmentTime.setUTCHours(parseInt(splitPath[5]) / 100);\n }\n return segmentTime;\n}\n\nexport function minDate(dateA: Date, dateB?: Date): Date {\n if (dateB && dateB < dateA) {\n return dateB;\n }\n return dateA;\n}\n\nexport function rawEventToBlobChangeFeedEvent(rawEvent: Record<string, any>): BlobChangeFeedEvent {\n if (rawEvent.eventTime) {\n rawEvent.eventTime = new Date(rawEvent.eventTime);\n }\n if (rawEvent.eTag) {\n rawEvent.etag = rawEvent.eTag;\n delete rawEvent.eTag;\n }\n if (rawEvent.data) {\n if (rawEvent.data.recursive !== undefined) {\n rawEvent.data.isRecursive = rawEvent.data.recursive;\n delete rawEvent.data.recursive;\n }\n if (rawEvent.data.previousInfo) {\n const previousInfo = rawEvent.data.previousInfo;\n\n if (previousInfo.SoftDeleteSnapshot) {\n previousInfo.softDeleteSnapshot = previousInfo.SoftDeleteSnapshot;\n delete previousInfo.SoftDeleteSnapshot;\n }\n if (previousInfo.WasBlobSoftDeleted) {\n previousInfo.isBlobSoftDeleted = previousInfo.WasBlobSoftDeleted === \"true\";\n delete previousInfo.WasBlobSoftDeleted;\n }\n if (previousInfo.BlobVersion) {\n previousInfo.newBlobVersion = previousInfo.BlobVersion;\n delete previousInfo.BlobVersion;\n }\n if (previousInfo.LastVersion) {\n previousInfo.oldBlobVersion = previousInfo.LastVersion;\n delete previousInfo.LastVersion;\n }\n if (previousInfo.PreviousTier) {\n previousInfo.previousTier = previousInfo.PreviousTier;\n delete previousInfo.PreviousTier;\n }\n\n rawEvent.data.previousInfo = previousInfo;\n }\n\n if (rawEvent.data.blobPropertiesUpdated) {\n const updatedBlobProperties: UpdatedBlobProperties = {};\n Object.entries(rawEvent.data.blobPropertiesUpdated).map((item) => {\n const blobPropertyChange = {\n propertyName: item[0],\n oldValue: (item[1] as any).previous as string,\n newValue: (item[1] as any).current as string,\n };\n updatedBlobProperties[item[0]] = blobPropertyChange;\n });\n rawEvent.data.updatedBlobProperties = updatedBlobProperties;\n delete rawEvent.data.blobPropertiesUpdated;\n }\n\n if (rawEvent.data.asyncOperationInfo) {\n const longRunningOperationInfo = rawEvent.data.asyncOperationInfo;\n if (longRunningOperationInfo.DestinationTier) {\n longRunningOperationInfo.destinationAccessTier = longRunningOperationInfo.DestinationTier;\n delete longRunningOperationInfo.DestinationTier;\n }\n if (\"WasAsyncOperation\" in longRunningOperationInfo) {\n longRunningOperationInfo.isAsync = longRunningOperationInfo.WasAsyncOperation === \"true\";\n delete longRunningOperationInfo.WasAsyncOperation;\n }\n if (longRunningOperationInfo.CopyId) {\n longRunningOperationInfo.copyId = longRunningOperationInfo.CopyId;\n delete longRunningOperationInfo.CopyId;\n }\n rawEvent.data.longRunningOperationInfo = longRunningOperationInfo;\n delete rawEvent.data.asyncOperationInfo;\n }\n\n if (rawEvent.data.blobTagsUpdated) {\n rawEvent.data.updatedBlobTags = {\n newTags: rawEvent.data.blobTagsUpdated.current,\n oldTags: rawEvent.data.blobTagsUpdated.previous,\n };\n\n delete rawEvent.data.blobTagsUpdated;\n }\n\n if (rawEvent.data.blobTier) {\n rawEvent.data.blobAccessTier = rawEvent.data.blobTier;\n delete rawEvent.data.blobTier;\n }\n }\n\n return rawEvent as BlobChangeFeedEvent;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { Segment } from \"./Segment\";\nimport type { SegmentFactory } from \"./SegmentFactory\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { ChangeFeedCursor } from \"./models/ChangeFeedCursor\";\nimport { getSegmentsInYear, minDate, getHost } from \"./utils/utils.common\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link ChangeFeed.getChange} operation.\n */\nexport interface ChangeFeedGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ChangeFeed {\n /**\n * BlobContainerClient for making List Blob requests and creating Segments.\n */\n private readonly containerClient?: ContainerClient;\n\n private readonly segmentFactory?: SegmentFactory;\n\n private readonly years: number[];\n\n private segments: string[];\n\n private currentSegment?: Segment;\n\n private lastConsumable?: Date;\n\n private startTime?: Date;\n\n private endTime?: Date;\n\n private end?: Date;\n\n constructor();\n constructor(\n containerClient: ContainerClient,\n segmentFactory: SegmentFactory,\n years: number[],\n segments: string[],\n currentSegment: Segment,\n lastConsumable: Date,\n startTime?: Date,\n endTime?: Date,\n );\n\n constructor(\n containerClient?: ContainerClient,\n segmentFactory?: SegmentFactory,\n years?: number[],\n segments?: string[],\n currentSegment?: Segment,\n lastConsumable?: Date,\n startTime?: Date,\n endTime?: Date,\n ) {\n this.containerClient = containerClient;\n this.segmentFactory = segmentFactory;\n this.years = years || [];\n this.segments = segments || [];\n this.currentSegment = currentSegment;\n this.lastConsumable = lastConsumable;\n this.startTime = startTime;\n this.endTime = endTime;\n if (this.lastConsumable) {\n this.end = minDate(this.lastConsumable, this.endTime);\n }\n }\n\n private async advanceSegmentIfNecessary(options: ChangeFeedGetChangeOptions = {}): Promise<void> {\n return tracingClient.withSpan(\n \"ChangeFeed-advanceSegmentIfNecessary\",\n options,\n async (updatedOptions) => {\n if (!this.currentSegment) {\n throw new Error(\"Empty Change Feed shouldn't call this function.\");\n }\n\n // If the current segment has more Events, we don't need to do anything.\n if (this.currentSegment.hasNext()) {\n return;\n }\n\n // If the current segment is completed, remove it\n if (this.segments.length > 0) {\n this.currentSegment = await this.segmentFactory!.create(\n this.containerClient!,\n this.segments.shift()!,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n // If segments is empty, refill it\n else if (this.segments.length === 0 && this.years.length > 0) {\n const year = this.years.shift();\n this.segments = await getSegmentsInYear(\n this.containerClient!,\n year!,\n this.startTime,\n this.end,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n\n if (this.segments.length > 0) {\n this.currentSegment = await this.segmentFactory!.create(\n this.containerClient!,\n this.segments.shift()!,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n } else {\n this.currentSegment = undefined;\n }\n }\n },\n );\n }\n\n public hasNext(): boolean {\n // Empty ChangeFeed, using currentSegment as the indicator.\n if (!this.currentSegment) {\n return false;\n }\n\n if (this.segments.length === 0 && this.years.length === 0 && !this.currentSegment.hasNext()) {\n return false;\n }\n\n return this.currentSegment.dateTime < this.end!;\n }\n\n public async getChange(\n options: ChangeFeedGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"ChangeFeed-getChange\", options, async (updatedOptions) => {\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n event = await this.currentSegment!.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n await this.advanceSegmentIfNecessary({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n }\n return event;\n });\n }\n\n public getCursor(): ChangeFeedCursor {\n if (!this.currentSegment) {\n throw new Error(\"Empty Change Feed shouldn't call this function.\");\n }\n\n return {\n CursorVersion: 1,\n UrlHost: getHost(this.containerClient!.url)!,\n EndTime: this.endTime?.toJSON(),\n CurrentSegmentCursor: this.currentSegment!.getCursor(),\n };\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport const AVRO_SYNC_MARKER_SIZE: number = 16;\nexport const AVRO_INIT_BYTES: Uint8Array = new Uint8Array([79, 98, 106, 1]);\nexport const AVRO_CODEC_KEY: string = \"avro.codec\";\nexport const AVRO_SCHEMA_KEY: string = \"avro.schema\";\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// TODO: Do a review of the Object usage and non-interfaces\n/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AvroReadable } from \"./AvroReadable\";\nimport type { KeyValuePair } from \"./utils/utils.common\";\n\n/**\n * Options to configure the AvroParser read methods.\n * See {@link AvroParser.readFixedBytes}, {@link AvroParser.readMap} and etc.\n */\ninterface AvroParserReadOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class AvroParser {\n /**\n * Reads a fixed number of bytes from the stream.\n *\n * @param stream -\n * @param length -\n * @param options -\n */\n public static async readFixedBytes(\n stream: AvroReadable,\n length: number,\n options: AvroParserReadOptions = {},\n ): Promise<Uint8Array> {\n const bytes = await stream.read(length, { abortSignal: options.abortSignal });\n if (bytes.length !== length) {\n throw new Error(\"Hit stream end.\");\n }\n return bytes;\n }\n\n /**\n * Reads a single byte from the stream.\n *\n * @param stream -\n * @param options -\n */\n private static async readByte(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n const buf = await AvroParser.readFixedBytes(stream, 1, options);\n return buf[0];\n }\n\n // int and long are stored in variable-length zig-zag coding.\n // variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt\n // zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types\n private static async readZigZagLong(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n let zigZagEncoded = 0;\n let significanceInBit = 0;\n let byte, haveMoreByte, significanceInFloat;\n\n do {\n byte = await AvroParser.readByte(stream, options);\n haveMoreByte = byte & 0x80;\n zigZagEncoded |= (byte & 0x7f) << significanceInBit;\n significanceInBit += 7;\n } while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers\n\n if (haveMoreByte) {\n // Switch to float arithmetic\n // eslint-disable-next-line no-self-assign\n zigZagEncoded = zigZagEncoded;\n significanceInFloat = 268435456; // 2 ** 28.\n do {\n byte = await AvroParser.readByte(stream, options);\n zigZagEncoded += (byte & 0x7f) * significanceInFloat;\n significanceInFloat *= 128; // 2 ** 7\n } while (byte & 0x80);\n\n const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;\n if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {\n throw new Error(\"Integer overflow.\");\n }\n return res;\n }\n\n return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);\n }\n\n public static async readLong(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n return AvroParser.readZigZagLong(stream, options);\n }\n\n public static async readInt(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n return AvroParser.readZigZagLong(stream, options);\n }\n\n public static async readNull(): Promise<null> {\n return null;\n }\n\n public static async readBoolean(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<boolean> {\n const b = await AvroParser.readByte(stream, options);\n if (b === 1) {\n return true;\n } else if (b === 0) {\n return false;\n } else {\n throw new Error(\"Byte was not a boolean.\");\n }\n }\n\n public static async readFloat(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n const u8arr = await AvroParser.readFixedBytes(stream, 4, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat32(0, true); // littleEndian = true\n }\n\n public static async readDouble(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<number> {\n const u8arr = await AvroParser.readFixedBytes(stream, 8, options);\n const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);\n return view.getFloat64(0, true); // littleEndian = true\n }\n\n public static async readBytes(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<Uint8Array> {\n const size = await AvroParser.readLong(stream, options);\n if (size < 0) {\n throw new Error(\"Bytes size was negative.\");\n }\n\n return stream.read(size, { abortSignal: options.abortSignal });\n }\n\n public static async readString(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n ): Promise<string> {\n const u8arr = await AvroParser.readBytes(stream, options);\n const utf8decoder = new TextDecoder();\n return utf8decoder.decode(u8arr);\n }\n\n private static async readMapPair<T>(\n stream: AvroReadable,\n readItemMethod: (s: AvroReadable, options?: AvroParserReadOptions) => Promise<T>,\n options: AvroParserReadOptions = {},\n ): Promise<KeyValuePair<T>> {\n const key = await AvroParser.readString(stream, options);\n // FUTURE: this won't work with readFixed (currently not supported) which needs a length as the parameter.\n const value = await readItemMethod(stream, options);\n return { key, value };\n }\n\n public static async readMap<T>(\n stream: AvroReadable,\n readItemMethod: (s: AvroReadable, options?: AvroParserReadOptions) => Promise<T>,\n options: AvroParserReadOptions = {},\n ): Promise<Record<string, T>> {\n const readPairMethod = (\n s: AvroReadable,\n opts: AvroParserReadOptions = {},\n ): Promise<KeyValuePair<T>> => {\n return AvroParser.readMapPair(s, readItemMethod, opts);\n };\n\n const pairs: KeyValuePair<T>[] = await AvroParser.readArray(stream, readPairMethod, options);\n\n const dict: Record<string, T> = {};\n for (const pair of pairs) {\n dict[pair.key] = pair.value;\n }\n return dict;\n }\n\n private static async readArray<T>(\n stream: AvroReadable,\n readItemMethod: (s: AvroReadable, options?: AvroParserReadOptions) => Promise<T>,\n options: AvroParserReadOptions = {},\n ): Promise<T[]> {\n const items: T[] = [];\n for (\n let count = await AvroParser.readLong(stream, options);\n count !== 0;\n count = await AvroParser.readLong(stream, options)\n ) {\n if (count < 0) {\n // Ignore block sizes\n await AvroParser.readLong(stream, options);\n count = -count;\n }\n\n while (count--) {\n const item: T = await readItemMethod(stream, options);\n items.push(item);\n }\n }\n return items;\n }\n}\n\ninterface RecordField {\n name: string;\n type: string | ObjectSchema | (string | ObjectSchema)[]; // Unions may not immediately contain other unions.\n}\n\nenum AvroComplex {\n RECORD = \"record\",\n ENUM = \"enum\",\n ARRAY = \"array\",\n MAP = \"map\",\n UNION = \"union\",\n FIXED = \"fixed\",\n}\n\ninterface ObjectSchema {\n type: Exclude<AvroComplex, AvroComplex.UNION>;\n name?: string;\n aliases?: string;\n fields?: RecordField[];\n symbols?: string[];\n values?: string;\n size?: number;\n}\n\nenum AvroPrimitive {\n NULL = \"null\",\n BOOLEAN = \"boolean\",\n INT = \"int\",\n LONG = \"long\",\n FLOAT = \"float\",\n DOUBLE = \"double\",\n BYTES = \"bytes\",\n STRING = \"string\",\n}\n\nexport abstract class AvroType {\n /**\n * Reads an object from the stream.\n */\n public abstract read(\n stream: AvroReadable,\n options?: AvroParserReadOptions,\n ): Promise<Object | null>; // eslint-disable-line @typescript-eslint/no-wrapper-object-types\n\n /**\n * Determines the AvroType from the Avro Schema.\n */\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n public static fromSchema(schema: string | Object): AvroType {\n if (typeof schema === \"string\") {\n return AvroType.fromStringSchema(schema);\n } else if (Array.isArray(schema)) {\n return AvroType.fromArraySchema(schema);\n } else {\n return AvroType.fromObjectSchema(schema as ObjectSchema);\n }\n }\n\n private static fromStringSchema(schema: string): AvroType {\n switch (schema) {\n case AvroPrimitive.NULL:\n case AvroPrimitive.BOOLEAN:\n case AvroPrimitive.INT:\n case AvroPrimitive.LONG:\n case AvroPrimitive.FLOAT:\n case AvroPrimitive.DOUBLE:\n case AvroPrimitive.BYTES:\n case AvroPrimitive.STRING:\n return new AvroPrimitiveType(schema as AvroPrimitive);\n default:\n throw new Error(`Unexpected Avro type ${schema}`);\n }\n }\n\n private static fromArraySchema(schema: any[]): AvroType {\n return new AvroUnionType(schema.map(AvroType.fromSchema));\n }\n\n private static fromObjectSchema(schema: ObjectSchema): AvroType {\n const type = schema.type;\n // Primitives can be defined as strings or objects\n try {\n return AvroType.fromStringSchema(type);\n } catch {\n // no-op\n }\n\n switch (type) {\n case AvroComplex.RECORD:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.name) {\n throw new Error(`Required attribute 'name' doesn't exist on schema: ${schema}`);\n }\n\n // eslint-disable-next-line no-case-declarations\n const fields: Record<string, AvroType> = {};\n if (!schema.fields) {\n throw new Error(`Required attribute 'fields' doesn't exist on schema: ${schema}`);\n }\n for (const field of schema.fields) {\n fields[field.name] = AvroType.fromSchema(field.type);\n }\n return new AvroRecordType(fields, schema.name);\n case AvroComplex.ENUM:\n if (schema.aliases) {\n throw new Error(`aliases currently is not supported, schema: ${schema}`);\n }\n if (!schema.symbols) {\n throw new Error(`Required attribute 'symbols' doesn't exist on schema: ${schema}`);\n }\n return new AvroEnumType(schema.symbols);\n case AvroComplex.MAP:\n if (!schema.values) {\n throw new Error(`Required attribute 'values' doesn't exist on schema: ${schema}`);\n }\n return new AvroMapType(AvroType.fromSchema(schema.values));\n case AvroComplex.ARRAY: // Unused today\n case AvroComplex.FIXED: // Unused today\n default:\n throw new Error(`Unexpected Avro type ${type} in ${schema}`);\n }\n }\n}\n\nclass AvroPrimitiveType extends AvroType {\n private _primitive: AvroPrimitive;\n\n constructor(primitive: AvroPrimitive) {\n super();\n this._primitive = primitive;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n public read(stream: AvroReadable, options: AvroParserReadOptions = {}): Promise<Object | null> {\n switch (this._primitive) {\n case AvroPrimitive.NULL:\n return AvroParser.readNull();\n case AvroPrimitive.BOOLEAN:\n return AvroParser.readBoolean(stream, options);\n case AvroPrimitive.INT:\n return AvroParser.readInt(stream, options);\n case AvroPrimitive.LONG:\n return AvroParser.readLong(stream, options);\n case AvroPrimitive.FLOAT:\n return AvroParser.readFloat(stream, options);\n case AvroPrimitive.DOUBLE:\n return AvroParser.readDouble(stream, options);\n case AvroPrimitive.BYTES:\n return AvroParser.readBytes(stream, options);\n case AvroPrimitive.STRING:\n return AvroParser.readString(stream, options);\n default:\n throw new Error(\"Unknown Avro Primitive\");\n }\n }\n}\n\nclass AvroEnumType extends AvroType {\n private readonly _symbols: string[];\n\n constructor(symbols: string[]) {\n super();\n this._symbols = symbols;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n public async read(stream: AvroReadable, options: AvroParserReadOptions = {}): Promise<Object> {\n const value = await AvroParser.readInt(stream, options);\n return this._symbols[value];\n }\n}\n\nclass AvroUnionType extends AvroType {\n private readonly _types: AvroType[];\n\n constructor(types: AvroType[]) {\n super();\n this._types = types;\n }\n\n public async read(\n stream: AvroReadable,\n options: AvroParserReadOptions = {},\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n ): Promise<Object | null> {\n const typeIndex = await AvroParser.readInt(stream, options);\n return this._types[typeIndex].read(stream, options);\n }\n}\n\nclass AvroMapType extends AvroType {\n private readonly _itemType: AvroType;\n\n constructor(itemType: AvroType) {\n super();\n this._itemType = itemType;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n public read(stream: AvroReadable, options: AvroParserReadOptions = {}): Promise<Object> {\n const readItemMethod = (\n s: AvroReadable,\n opts?: AvroParserReadOptions,\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n ): Promise<Object | null> => {\n return this._itemType.read(s, opts);\n };\n return AvroParser.readMap(stream, readItemMethod, options);\n }\n}\n\nclass AvroRecordType extends AvroType {\n private readonly _name: string;\n private readonly _fields: Record<string, AvroType>;\n\n constructor(fields: Record<string, AvroType>, name: string) {\n super();\n this._fields = fields;\n this._name = name;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n public async read(stream: AvroReadable, options: AvroParserReadOptions = {}): Promise<Object> {\n // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types\n const record: Record<string, Object | null> = {};\n record[\"$schema\"] = this._name;\n for (const key in this._fields) {\n if (Object.prototype.hasOwnProperty.call(this._fields, key)) {\n record[key] = await this._fields[key].read(stream, options);\n }\n }\n return record;\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport interface KeyValuePair<T> {\n key: string;\n value: T;\n}\n\nexport function arraysEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) return true;\n\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// TODO: Do a review of non-interfaces\n/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */\n\nimport {\n AVRO_CODEC_KEY,\n AVRO_INIT_BYTES,\n AVRO_SCHEMA_KEY,\n AVRO_SYNC_MARKER_SIZE,\n} from \"./AvroConstants\";\nimport { AvroParser, AvroType } from \"./AvroParser\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AvroReadable } from \"./AvroReadable\";\nimport { arraysEqual } from \"./utils/utils.common\";\n\n/**\n * Options to configure the {@link AvroReader.parseObjects} operation.\n */\nexport interface AvroParseOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class AvroReader {\n private readonly _dataStream: AvroReadable;\n\n private readonly _headerStream: AvroReadable;\n\n private _syncMarker?: Uint8Array;\n\n private _metadata?: Record<string, string>;\n\n private _itemType?: AvroType;\n\n private _itemsRemainingInBlock?: number;\n\n // Remembers where we started if partial data stream was provided.\n private readonly _initialBlockOffset: number;\n\n /// The byte offset within the Avro file (both header and data)\n /// of the start of the current block.\n private _blockOffset: number;\n public get blockOffset(): number {\n return this._blockOffset;\n }\n\n private _objectIndex: number;\n public get objectIndex(): number {\n return this._objectIndex;\n }\n\n private _initialized: boolean;\n\n constructor(dataStream: AvroReadable);\n\n constructor(\n dataStream: AvroReadable,\n headerStream: AvroReadable,\n currentBlockOffset: number,\n indexWithinCurrentBlock: number,\n );\n\n constructor(\n dataStream: AvroReadable,\n headerStream?: AvroReadable,\n currentBlockOffset?: number,\n indexWithinCurrentBlock?: number,\n ) {\n this._dataStream = dataStream;\n this._headerStream = headerStream || dataStream;\n this._initialized = false;\n this._blockOffset = currentBlockOffset || 0;\n this._objectIndex = indexWithinCurrentBlock || 0;\n this._initialBlockOffset = currentBlockOffset || 0;\n }\n\n private async initialize(options: AvroParseOptions = {}): Promise<void> {\n const header = await AvroParser.readFixedBytes(this._headerStream, AVRO_INIT_BYTES.length, {\n abortSignal: options.abortSignal,\n });\n if (!arraysEqual(header, AVRO_INIT_BYTES)) {\n throw new Error(\"Stream is not an Avro file.\");\n }\n\n // File metadata is written as if defined by the following map schema:\n // { \"type\": \"map\", \"values\": \"bytes\"}\n this._metadata = await AvroParser.readMap(this._headerStream, AvroParser.readString, {\n abortSignal: options.abortSignal,\n });\n\n // Validate codec\n const codec = this._metadata![AVRO_CODEC_KEY];\n if (!(codec === undefined || codec === null || codec === \"null\")) {\n throw new Error(\"Codecs are not supported\");\n }\n\n // The 16-byte, randomly-generated sync marker for this file.\n this._syncMarker = await AvroParser.readFixedBytes(this._headerStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n });\n\n // Parse the schema\n const schema = JSON.parse(this._metadata![AVRO_SCHEMA_KEY]);\n this._itemType = AvroType.fromSchema(schema);\n\n if (this._blockOffset === 0) {\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n }\n\n this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n });\n // skip block length\n await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });\n\n this._initialized = true;\n if (this._objectIndex && this._objectIndex > 0) {\n for (let i = 0; i < this._objectIndex; i++) {\n await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });\n this._itemsRemainingInBlock!--;\n }\n }\n }\n\n public hasNext(): boolean {\n return !this._initialized || this._itemsRemainingInBlock! > 0;\n }\n\n public async *parseObjects(\n options: AvroParseOptions = {},\n ): AsyncIterableIterator<Record<string, any> | null> {\n if (!this._initialized) {\n await this.initialize(options);\n }\n\n while (this.hasNext()) {\n const result = await this._itemType!.read(this._dataStream, {\n abortSignal: options.abortSignal,\n });\n\n this._itemsRemainingInBlock!--;\n this._objectIndex!++;\n\n if (this._itemsRemainingInBlock === 0) {\n const marker = await AvroParser.readFixedBytes(this._dataStream, AVRO_SYNC_MARKER_SIZE, {\n abortSignal: options.abortSignal,\n });\n\n this._blockOffset = this._initialBlockOffset + this._dataStream.position;\n this._objectIndex = 0;\n\n if (!arraysEqual(this._syncMarker!, marker)) {\n throw new Error(\"Stream is not a valid Avro file.\");\n }\n\n try {\n this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {\n abortSignal: options.abortSignal,\n });\n } catch {\n // We hit the end of the stream.\n this._itemsRemainingInBlock = 0;\n }\n\n if (this._itemsRemainingInBlock! > 0) {\n // Ignore block size\n await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });\n }\n }\n yield result;\n }\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\n\n/**\n * Options to configure the {@link AvroReadable.read} operation.\n */\nexport interface AvroReadableReadOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport abstract class AvroReadable {\n public abstract get position(): number;\n public abstract read(size: number, options?: AvroReadableReadOptions): Promise<Uint8Array>;\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReadableReadOptions } from \"./AvroReadable\";\nimport { AvroReadable } from \"./AvroReadable\";\nimport { AbortError } from \"@azure/abort-controller\";\n\nconst ABORT_ERROR = new AbortError(\"Reading from the avro stream was aborted.\");\n\nexport class AvroReadableFromStream extends AvroReadable {\n private _position: number;\n private _readable: NodeJS.ReadableStream;\n\n private toUint8Array(data: string | Buffer): Uint8Array {\n if (typeof data === \"string\") {\n return Buffer.from(data);\n }\n return data;\n }\n\n constructor(readable: NodeJS.ReadableStream) {\n super();\n this._readable = readable;\n this._position = 0;\n }\n public get position(): number {\n return this._position;\n }\n public async read(size: number, options: AvroReadableReadOptions = {}): Promise<Uint8Array> {\n if (options.abortSignal?.aborted) {\n throw ABORT_ERROR;\n }\n\n if (size < 0) {\n throw new Error(`size parameter should be positive: ${size}`);\n }\n\n if (size === 0) {\n return new Uint8Array();\n }\n\n if (!this._readable.readable) {\n throw new Error(\"Stream no longer readable.\");\n }\n // See if there is already enough data.\n const chunk = this._readable.read(size);\n if (chunk) {\n this._position += chunk.length;\n // chunk.length maybe less than desired size if the stream ends.\n return this.toUint8Array(chunk);\n } else {\n // register callback to wait for enough data to read\n return new Promise((resolve, reject) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const cleanUp: () => void = () => {\n this._readable.removeListener(\"readable\", readableCallback);\n this._readable.removeListener(\"error\", rejectCallback);\n this._readable.removeListener(\"end\", rejectCallback);\n this._readable.removeListener(\"close\", rejectCallback);\n\n if (options.abortSignal) {\n options.abortSignal!.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n const readableCallback: () => void = () => {\n const callbackChunk = this._readable.read(size);\n if (callbackChunk) {\n this._position += callbackChunk.length;\n cleanUp();\n // callbackChunk.length maybe less than desired size if the stream ends.\n resolve(this.toUint8Array(callbackChunk));\n }\n };\n\n const rejectCallback: () => void = () => {\n cleanUp();\n reject();\n };\n\n const abortHandler: () => void = () => {\n cleanUp();\n reject(ABORT_ERROR);\n };\n\n this._readable.on(\"readable\", readableCallback);\n this._readable.once(\"error\", rejectCallback);\n this._readable.once(\"end\", rejectCallback);\n this._readable.once(\"close\", rejectCallback);\n if (options.abortSignal) {\n options.abortSignal!.addEventListener(\"abort\", abortHandler);\n }\n /* eslint-enable @typescript-eslint/no-use-before-define */\n });\n }\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReadable } from \"../../../storage-internal-avro/src\";\nimport { AvroReadableFromStream } from \"../../../storage-internal-avro/src\";\n\n/**\n * Read body from downloading operation methods to string.\n * Works in both Node.js and browsers.\n *\n * @param response - Convenience layer methods response with downloaded body\n * @param length - Length of Readable stream, needed for Node.js environment\n */\nexport async function bodyToString(\n response: {\n readableStreamBody?: NodeJS.ReadableStream;\n blobBody?: Promise<Blob>;\n },\n length?: number,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n response.readableStreamBody!.on(\"readable\", () => {\n const chunk = response.readableStreamBody!.read(length);\n if (chunk) {\n resolve(chunk.toString());\n }\n });\n\n response.readableStreamBody!.on(\"error\", reject);\n response.readableStreamBody!.on(\"end\", () => {\n resolve(\"\");\n });\n });\n}\n\nexport function streamToAvroReadable(readableStream: NodeJS.ReadableStream): AvroReadable {\n return new AvroReadableFromStream(readableStream);\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { Shard } from \"./Shard\";\nimport type { SegmentCursor, ShardCursor } from \"./models/ChangeFeedCursor\";\nimport type { CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link Segment.getChange} operation.\n */\nexport interface SegmentGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Segment {\n private readonly shards: Shard[];\n\n // Track shards that we have finished reading from.\n private shardDone: boolean[];\n private shardDoneCount: number;\n\n private shardIndex: number;\n\n // Assuming the dateTime of segments is rounded to hour. If not, our logic for fetching\n // change events between a time range would be incorrect.\n private _dateTime: Date;\n public get dateTime(): Date {\n return this._dateTime;\n }\n\n constructor(\n shards: Shard[],\n shardIndex: number,\n dateTime: Date,\n private readonly manifestPath: string,\n ) {\n this.shards = shards;\n this.shardIndex = shardIndex;\n this._dateTime = dateTime;\n\n this.shardDone = Array(shards.length).fill(false);\n this.shardDoneCount = 0;\n }\n\n public hasNext(): boolean {\n return this.shards.length > this.shardDoneCount;\n }\n\n public async getChange(\n options: SegmentGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"Segment-getChange\", options, async (updatedOptions) => {\n if (this.shardIndex >= this.shards.length || this.shardIndex < 0) {\n throw new Error(\"shardIndex invalid.\");\n }\n\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n if (this.shardDone[this.shardIndex]) {\n this.shardIndex = (this.shardIndex + 1) % this.shards.length; // find next available shard\n continue;\n }\n\n const currentShard = this.shards[this.shardIndex];\n event = await currentShard.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n\n if (!currentShard.hasNext()) {\n this.shardDone[this.shardIndex] = true;\n this.shardDoneCount++;\n }\n // Round robin with shards\n this.shardIndex = (this.shardIndex + 1) % this.shards.length;\n }\n return event;\n });\n }\n\n public getCursor(): SegmentCursor {\n const shardCursors: ShardCursor[] = [];\n for (const shard of this.shards) {\n const shardCursor = shard.getCursor();\n if (shardCursor) {\n shardCursors.push(shardCursor);\n }\n }\n\n return {\n SegmentPath: this.manifestPath,\n ShardCursors: shardCursors,\n CurrentShardPath: this.shards[this.shardIndex].shardPath,\n };\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ShardFactory } from \"./ShardFactory\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport { CHANGE_FEED_CONTAINER_NAME } from \"./utils/constants\";\nimport type { Shard } from \"./Shard\";\nimport { Segment } from \"./Segment\";\nimport type { SegmentCursor } from \"./models/ChangeFeedCursor\";\nimport { bodyToString } from \"./utils/utils.node\";\nimport { parseDateFromSegmentPath } from \"./utils/utils.common\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\nexport interface SegmentManifest {\n version?: number;\n begin?: Date;\n intervalSecs?: number;\n status: string;\n config?: any;\n chunkFilePaths: string[];\n}\n\n/**\n * Options to configure {@link SegmentFactory.create} operation.\n */\nexport interface CreateSegmentOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class SegmentFactory {\n private readonly shardFactory: ShardFactory;\n\n constructor(shardFactory: ShardFactory) {\n this.shardFactory = shardFactory;\n }\n\n public async create(\n containerClient: ContainerClient,\n manifestPath: string,\n cursor?: SegmentCursor,\n options: CreateSegmentOptions = {},\n ): Promise<Segment> {\n return tracingClient.withSpan(\"SegmentFactory-create\", options, async (updatedOptions) => {\n const shards: Shard[] = [];\n const dateTime: Date = parseDateFromSegmentPath(manifestPath);\n\n const blobClient = containerClient.getBlobClient(manifestPath);\n const blobDownloadRes = await blobClient.download(undefined, undefined, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n const blobContent: string = await bodyToString(blobDownloadRes);\n\n const segmentManifest = JSON.parse(blobContent) as SegmentManifest;\n\n const containerPrefixLength = CHANGE_FEED_CONTAINER_NAME.length + 1; // \"$blobchangefeed/\"\n for (const shardPath of segmentManifest.chunkFilePaths) {\n const shardPathSubStr = shardPath.substring(containerPrefixLength);\n const shardCursor = cursor?.ShardCursors.find((x) =>\n x.CurrentChunkPath.startsWith(shardPathSubStr),\n );\n const shard: Shard = await this.shardFactory.create(\n containerClient,\n shardPathSubStr,\n shardCursor,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n if (shard.hasNext()) {\n shards.push(shard);\n }\n }\n\n let shardIndex = 0;\n if (cursor?.CurrentShardPath) {\n shardIndex = shards.findIndex((s) => s.shardPath === cursor?.CurrentShardPath);\n if (shardIndex === -1) {\n shardIndex = 0;\n }\n }\n return new Segment(shards, shardIndex, dateTime, manifestPath);\n });\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { ChunkFactory } from \"./ChunkFactory\";\nimport type { Chunk } from \"./Chunk\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { ShardCursor } from \"./models/ChangeFeedCursor\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link Shard.getChange} operation.\n */\nexport interface ShardGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Shard {\n private readonly containerClient: ContainerClient;\n\n private readonly chunkFactory: ChunkFactory;\n\n private readonly chunks: string[];\n\n private currentChunk: Chunk | undefined;\n\n constructor(\n containerClient: ContainerClient,\n chunkFactory: ChunkFactory,\n chunks: string[],\n currentChunk: Chunk | undefined,\n public readonly shardPath: string,\n ) {\n this.containerClient = containerClient;\n this.chunkFactory = chunkFactory;\n this.chunks = chunks;\n this.currentChunk = currentChunk;\n }\n\n public hasNext(): boolean {\n return (\n this.chunks.length > 0 || (this.currentChunk !== undefined && this.currentChunk.hasNext())\n );\n }\n\n public async getChange(\n options: ShardGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"Shard-getChange\", options, async (updatedOptions) => {\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n event = await this.currentChunk!.getChange();\n\n // Remove currentChunk if it doesn't have more events.\n if (!this.currentChunk!.hasNext() && this.chunks.length > 0) {\n this.currentChunk = await this.chunkFactory.create(\n this.containerClient,\n this.chunks.shift()!,\n undefined,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n }\n return event;\n });\n }\n\n public getCursor(): ShardCursor | undefined {\n return this.currentChunk === undefined\n ? undefined\n : {\n CurrentChunkPath: this.currentChunk.chunkPath,\n BlockOffset: this.currentChunk.blockOffset,\n EventIndex: this.currentChunk.eventIndex,\n };\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChunkFactory } from \"./ChunkFactory\";\nimport type { ShardCursor } from \"./models/ChangeFeedCursor\";\nimport { Shard } from \"./Shard\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { Chunk } from \"./Chunk\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link ShardFactory.create} operation.\n */\nexport interface CreateShardOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ShardFactory {\n private readonly chunkFactory: ChunkFactory;\n\n constructor(chunkFactory: ChunkFactory) {\n this.chunkFactory = chunkFactory;\n }\n\n public async create(\n containerClient: ContainerClient,\n shardPath: string,\n shardCursor?: ShardCursor,\n options: CreateShardOptions = {},\n ): Promise<Shard> {\n return tracingClient.withSpan(\"ShardFactory-create\", options, async (updatedOptions) => {\n const chunks: string[] = [];\n const blockOffset: number = shardCursor?.BlockOffset || 0;\n const eventIndex: number = shardCursor?.EventIndex || 0;\n\n for await (const blobItem of containerClient.listBlobsFlat({\n prefix: shardPath,\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n })) {\n chunks.push(blobItem.name);\n }\n\n const currentChunkPath = shardCursor?.CurrentChunkPath;\n let chunkIndex = -1;\n let currentChunk: Chunk | undefined = undefined;\n // Chunks can be empty right after hour flips.\n if (chunks.length !== 0) {\n // Fast forward to current Chunk\n if (currentChunkPath) {\n for (let i = 0; i < chunks.length; i++) {\n if (chunks[i] === currentChunkPath) {\n chunkIndex = i;\n break;\n }\n }\n if (chunkIndex === -1) {\n throw new Error(`Chunk ${currentChunkPath} not found.`);\n }\n } else {\n chunkIndex = 0;\n }\n\n // Fast forward to current Chunk.\n if (chunkIndex > 0) {\n chunks.splice(0, chunkIndex);\n }\n\n currentChunk = await this.chunkFactory.create(\n containerClient,\n chunks.shift()!,\n blockOffset,\n eventIndex,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n\n return new Shard(containerClient, this.chunkFactory, chunks, currentChunk, shardPath);\n });\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReader } from \"../../storage-internal-avro/src\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AvroParseOptions } from \"../../storage-internal-avro/src/AvroReader\";\nimport { rawEventToBlobChangeFeedEvent } from \"./utils/utils.common\";\n\n/**\n * Options to configure {@link Chunk.getChange} operation.\n */\nexport interface ChunkGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Chunk {\n private readonly avroReader: AvroReader;\n private readonly iter: AsyncIterableIterator<Record<string, any> | null>;\n\n private _blockOffset: number;\n public get blockOffset(): number {\n return this._blockOffset;\n }\n\n private _eventIndex: number;\n public get eventIndex(): number {\n return this._eventIndex;\n }\n\n constructor(\n avroReader: AvroReader,\n blockOffset: number,\n eventIndex: number,\n public readonly chunkPath: string,\n avroOptions: AvroParseOptions = {},\n ) {\n this.avroReader = avroReader;\n this._blockOffset = blockOffset;\n this._eventIndex = eventIndex;\n\n this.iter = this.avroReader.parseObjects(avroOptions);\n }\n\n public hasNext(): boolean {\n return this.avroReader.hasNext();\n }\n\n public async getChange(): Promise<BlobChangeFeedEvent | undefined> {\n if (!this.hasNext()) {\n return undefined;\n }\n\n const next = await this.iter.next();\n this._eventIndex = this.avroReader.objectIndex;\n this._blockOffset = this.avroReader.blockOffset;\n if (next.done) {\n return undefined;\n } else {\n const eventRaw = next.value;\n if (eventRaw === null) {\n return undefined;\n }\n\n return rawEventToBlobChangeFeedEvent(eventRaw);\n }\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReaderFactory } from \"./AvroReaderFactory\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport { Chunk } from \"./Chunk\";\nimport type { AvroReader } from \"../../storage-internal-avro/src\";\nimport { streamToAvroReadable } from \"./utils/utils.node\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { LazyLoadingBlobStreamFactory } from \"./LazyLoadingBlobStreamFactory\";\nimport { CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE } from \"./utils/constants\";\n\n/**\n * Options to configure {@link ChunkFactory.create} operation.\n */\nexport interface CreateChunkOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ChunkFactory {\n private readonly avroReaderFactory: AvroReaderFactory;\n private readonly lazyLoadingBlobStreamFactory: LazyLoadingBlobStreamFactory;\n private readonly maxTransferSize?: number;\n\n constructor(\n avroReaderFactory: AvroReaderFactory,\n lazyLoadingBlobStreamFactory: LazyLoadingBlobStreamFactory,\n maxTransferSize?: number,\n ) {\n this.avroReaderFactory = avroReaderFactory;\n this.lazyLoadingBlobStreamFactory = lazyLoadingBlobStreamFactory;\n this.maxTransferSize = maxTransferSize;\n }\n\n public async create(\n containerClient: ContainerClient,\n chunkPath: string,\n blockOffset?: number,\n eventIndex?: number,\n options: CreateChunkOptions = {},\n ): Promise<Chunk> {\n const blobClient = containerClient.getBlobClient(chunkPath);\n blockOffset = blockOffset || 0;\n eventIndex = eventIndex || 0;\n\n const dataStream = streamToAvroReadable(\n this.lazyLoadingBlobStreamFactory.create(\n blobClient,\n blockOffset,\n this.maxTransferSize ? this.maxTransferSize : CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE,\n options,\n ),\n );\n\n let avroReader: AvroReader;\n if (blockOffset !== 0) {\n const headerStream = streamToAvroReadable(\n this.lazyLoadingBlobStreamFactory.create(\n blobClient,\n 0,\n this.maxTransferSize ? this.maxTransferSize : CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE,\n options,\n ),\n );\n avroReader = this.avroReaderFactory.create(dataStream, headerStream, blockOffset, eventIndex);\n } else {\n avroReader = this.avroReaderFactory.create(dataStream);\n }\n\n return new Chunk(avroReader, blockOffset, eventIndex, chunkPath, {\n abortSignal: options.abortSignal,\n });\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReadable } from \"../../storage-internal-avro/src\";\nimport { AvroReader } from \"../../storage-internal-avro/src\";\n\n/**\n * Creates AvroReaders. Allows us to inject mock AvroReaders in the Chunk unit tests.\n */\nexport class AvroReaderFactory {\n public create(headerAndDataStream: AvroReadable): AvroReader;\n\n public create(\n dataStream: AvroReadable,\n headerStream: AvroReadable,\n blockOffset: number,\n eventIndex: number,\n ): AvroReader;\n\n public create(\n dataStream: AvroReadable,\n headerStream?: AvroReadable,\n blockOffset?: number,\n eventIndex?: number,\n ): AvroReader {\n if (headerStream) {\n return new AvroReader(dataStream, headerStream, blockOffset!, eventIndex!);\n } else {\n return new AvroReader(dataStream);\n }\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ReadableOptions } from \"stream\";\nimport { Readable } from \"stream\";\nimport type { BlobClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure the LazyLoadingBlobStream.\n */\nexport interface LazyLoadingBlobStreamOptions extends ReadableOptions, CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\ninterface LazyLoadingBlobStreamDownloadBlockOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * This class generates a readable stream from a blobClient's data.\n */\nexport class LazyLoadingBlobStream extends Readable {\n /**\n * BlobClient to make download calls with.\n */\n private readonly blobClient: BlobClient;\n\n /**\n * The offset within the blob of the next block we will download.\n */\n private offset: number;\n\n private readonly blockSize: number;\n\n private lastDownloadBytes: number;\n\n private lastDownloadData?: Buffer;\n\n private blobLength: number;\n\n private options?: LazyLoadingBlobStreamOptions;\n\n /**\n * Creates an instance of LazyLoadingBlobStream.\n *\n * @param byteLength - The total length of data contained in the buffers\n */\n constructor(\n blobClient: BlobClient,\n offset: number,\n blockSize: number,\n options?: LazyLoadingBlobStreamOptions,\n ) {\n super(options);\n this.blobClient = blobClient;\n this.offset = offset;\n this.blockSize = blockSize;\n this.lastDownloadBytes = -1;\n this.blobLength = -1;\n this.options = options;\n }\n\n private async downloadBlock(options: LazyLoadingBlobStreamDownloadBlockOptions = {}) {\n return tracingClient.withSpan(\n \"LazyLoadingBlobStream-downloadBlock\",\n options,\n async (updatedOptions) => {\n const properties = await this.blobClient.getProperties({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n this.blobLength = properties.contentLength!;\n\n this.lastDownloadBytes = Math.min(this.blockSize, this.blobLength - this.offset);\n if (this.lastDownloadBytes === 0) {\n this.lastDownloadData = undefined;\n return;\n }\n\n this.lastDownloadData = await this.blobClient.downloadToBuffer(\n this.offset,\n this.lastDownloadBytes,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n this.offset += this.lastDownloadBytes;\n },\n );\n }\n\n /**\n * Internal _read() that will be called when the stream wants to pull more data in.\n *\n * @param size - Optional. The size of data to be read\n */\n public async _read(size?: number): Promise<void> {\n return tracingClient.withSpan(\n \"LazyLoadingBlobStream-read\",\n this.options ?? {},\n async (updatedOptions) => {\n if (!size) {\n size = this.readableHighWaterMark;\n }\n let count = 0;\n let chunkSize = 0;\n const chunksToPush = [];\n do {\n if (this.lastDownloadData === undefined || this.lastDownloadData?.byteLength === 0) {\n await this.downloadBlock({\n abortSignal: this.options?.abortSignal,\n tracingOptions: updatedOptions?.tracingOptions,\n });\n }\n if (this.lastDownloadData?.byteLength) {\n chunkSize = Math.min(size - count, this.lastDownloadData?.byteLength);\n chunksToPush.push(this.lastDownloadData.slice(0, chunkSize));\n this.lastDownloadData = this.lastDownloadData.slice(chunkSize);\n count += chunkSize;\n } else {\n chunkSize = 0;\n }\n } while (chunkSize > 0 && count < size);\n\n this.push(Buffer.concat(chunksToPush));\n\n if (count < size) {\n this.push(null);\n }\n },\n );\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobClient } from \"@azure/storage-blob\";\nimport type { LazyLoadingBlobStreamOptions } from \"./LazyLoadingBlobStream\";\nimport { LazyLoadingBlobStream } from \"./LazyLoadingBlobStream\";\n\nexport class LazyLoadingBlobStreamFactory {\n public create(\n blobClient: BlobClient,\n offset: number,\n blockSize: number,\n options?: LazyLoadingBlobStreamOptions,\n ): LazyLoadingBlobStream {\n return new LazyLoadingBlobStream(blobClient, offset, blockSize, options);\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobServiceClient, ContainerClient } from \"@azure/storage-blob\";\nimport { ChangeFeed } from \"./ChangeFeed\";\nimport type { ChangeFeedCursor } from \"./models/ChangeFeedCursor\";\nimport { CHANGE_FEED_CONTAINER_NAME, CHANGE_FEED_META_SEGMENT_PATH } from \"./utils/constants\";\nimport {\n ceilToNearestHour,\n floorToNearestHour,\n getYearsPaths,\n getSegmentsInYear,\n minDate,\n getHost,\n parseDateFromSegmentPath,\n} from \"./utils/utils.common\";\nimport { bodyToString } from \"./utils/utils.node\";\nimport { SegmentFactory } from \"./SegmentFactory\";\nimport { ShardFactory } from \"./ShardFactory\";\nimport { ChunkFactory } from \"./ChunkFactory\";\nimport { AvroReaderFactory } from \"./AvroReaderFactory\";\nimport type { Segment } from \"./Segment\";\nimport type { BlobChangeFeedListChangesOptions } from \"./models/models\";\nimport { tracingClient } from \"./utils/tracing\";\nimport { LazyLoadingBlobStreamFactory } from \"./LazyLoadingBlobStreamFactory\";\n\ninterface MetaSegments {\n version?: number;\n lastConsumable: string;\n}\n\nexport class ChangeFeedFactory {\n private readonly segmentFactory: SegmentFactory;\n private readonly maxTransferSize?: number;\n\n constructor(maxTransferSize?: number);\n constructor(segmentFactory: SegmentFactory);\n constructor(segmentFactoryOrMaxTransferSize?: SegmentFactory | number) {\n let segmentFactory: SegmentFactory | undefined;\n if (segmentFactoryOrMaxTransferSize) {\n if (Number.isFinite(segmentFactoryOrMaxTransferSize)) {\n this.maxTransferSize = segmentFactoryOrMaxTransferSize as number;\n } else if (segmentFactoryOrMaxTransferSize instanceof SegmentFactory) {\n segmentFactory = segmentFactoryOrMaxTransferSize as SegmentFactory;\n }\n }\n\n if (segmentFactory) {\n this.segmentFactory = segmentFactory;\n } else {\n this.segmentFactory = new SegmentFactory(\n new ShardFactory(\n new ChunkFactory(\n new AvroReaderFactory(),\n new LazyLoadingBlobStreamFactory(),\n this.maxTransferSize,\n ),\n ),\n );\n }\n }\n\n private static validateCursor(containerClient: ContainerClient, cursor: ChangeFeedCursor): void {\n if (getHost(containerClient.url) !== cursor.UrlHost) {\n throw new Error(\"Cursor URL host does not match container URL host.\");\n }\n if (cursor.CursorVersion !== 1) {\n throw new Error(\"Unsupported cursor version.\");\n }\n }\n\n public async create(\n blobServiceClient: BlobServiceClient,\n continuationToken?: string,\n options: BlobChangeFeedListChangesOptions = {},\n ): Promise<ChangeFeed> {\n return tracingClient.withSpan(\"ChangeFeedFactory-create\", options, async (updatedOptions) => {\n const containerClient = blobServiceClient.getContainerClient(CHANGE_FEED_CONTAINER_NAME);\n let cursor: ChangeFeedCursor | undefined = undefined;\n // Create cursor.\n if (continuationToken) {\n cursor = JSON.parse(continuationToken);\n ChangeFeedFactory.validateCursor(containerClient, cursor!);\n options.start = parseDateFromSegmentPath(cursor!.CurrentSegmentCursor.SegmentPath!);\n options.end = new Date(cursor!.EndTime!);\n }\n // Round start and end time if we are not using the cursor.\n else {\n options.start = floorToNearestHour(options.start);\n options.end = ceilToNearestHour(options.end);\n }\n\n // Check if Change Feed has been enabled for this account.\n const changeFeedContainerExists = await containerClient.exists({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n if (!changeFeedContainerExists) {\n throw new Error(\n \"Change Feed hasn't been enabled on this account, or is currently being enabled.\",\n );\n }\n\n if (options.start && options.end && options.start >= options.end) {\n return new ChangeFeed();\n }\n\n // Get last consumable.\n const blobClient = containerClient.getBlobClient(CHANGE_FEED_META_SEGMENT_PATH);\n let blobDownloadRes;\n try {\n blobDownloadRes = await blobClient.download(undefined, undefined, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n } catch (err: any) {\n if (err.statusCode === 404) {\n return new ChangeFeed();\n } else {\n throw err;\n }\n }\n const lastConsumable = new Date(\n (JSON.parse(await bodyToString(blobDownloadRes)) as MetaSegments).lastConsumable,\n );\n\n // Get year paths\n const years: number[] = await getYearsPaths(containerClient, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n\n // Dequeue any years that occur before start time.\n if (options.start) {\n const startYear = options.start.getUTCFullYear();\n while (years.length > 0 && years[0] < startYear) {\n years.shift();\n }\n }\n if (years.length === 0) {\n return new ChangeFeed();\n }\n\n let segments: string[] = [];\n while (segments.length === 0 && years.length !== 0) {\n segments = await getSegmentsInYear(\n containerClient,\n years.shift()!,\n options.start,\n minDate(lastConsumable, options.end),\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n if (segments.length === 0) {\n return new ChangeFeed();\n }\n const currentSegment: Segment = await this.segmentFactory.create(\n containerClient,\n segments.shift()!,\n cursor?.CurrentSegmentCursor,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n\n return new ChangeFeed(\n containerClient,\n this.segmentFactory,\n years,\n segments,\n currentSegment,\n lastConsumable,\n options.start,\n options.end,\n );\n });\n }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n StoragePipelineOptions,\n StorageSharedKeyCredential,\n AnonymousCredential,\n} from \"@azure/storage-blob\";\nimport { BlobServiceClient, Pipeline } from \"@azure/storage-blob\";\nimport type { PagedAsyncIterableIterator, PageSettings } from \"@azure/core-paging\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport { ChangeFeedFactory } from \"./ChangeFeedFactory\";\nimport type { ChangeFeed } from \"./ChangeFeed\";\nimport { CHANGE_FEED_MAX_PAGE_SIZE, SDK_VERSION } from \"./utils/constants\";\nimport type { BlobChangeFeedListChangesOptions } from \"./models/models\";\nimport type { TokenCredential } from \"@azure/core-auth\";\n\n/**\n * Contains paged response data for the {@link BlobChangeFeedClient.listChanges} operation.\n */\nexport class BlobChangeFeedEventPage {\n /**\n * Array of {@link BlobChangeFeedEvent}.\n */\n public events: BlobChangeFeedEvent[];\n\n /**\n * The token that keeps track of where to continue the iterator.\n */\n public continuationToken: string;\n\n constructor() {\n this.events = [];\n this.continuationToken = \"\";\n }\n}\n\n/**\n * Creates a new Pipeline object with Credential provided.\n *\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param pipelineOptions - Optional. Options.\n * @returns A new Pipeline object.\n */\nexport function newPipeline(\n credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential,\n pipelineOptions: StoragePipelineOptions = {},\n): Pipeline {\n return newPipeline(credential, appendUserAgentPrefix(pipelineOptions));\n}\n\nfunction appendUserAgentPrefix(options?: StoragePipelineOptions): StoragePipelineOptions {\n if (!options) {\n options = {};\n }\n if (options.userAgentOptions === undefined) {\n options.userAgentOptions = {};\n }\n\n if (options.userAgentOptions.userAgentPrefix === undefined) {\n options.userAgentOptions.userAgentPrefix = \"\";\n } else if (options.userAgentOptions.userAgentPrefix !== \"\") {\n options.userAgentOptions.userAgentPrefix += \" \";\n }\n options.userAgentOptions.userAgentPrefix += `changefeed-js/${SDK_VERSION}`;\n return options;\n}\n\n/**\n * Blob Change Feed client options.\n */\nexport interface BlobChangeFeedClientOptions {\n /**\n * The maximum length of an transfer in bytes.\n */\n maximumTransferSize?: number;\n}\n\n/**\n * BlobChangeFeedClient.\n * @see https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-change-feed?tabs=azure-portal\n */\nexport class BlobChangeFeedClient {\n /**\n * blobServiceClient provided by `@azure/storage-blob` package.\n */\n private blobServiceClient: BlobServiceClient;\n private changeFeedFactory: ChangeFeedFactory;\n private changeFeedClientOptions: BlobChangeFeedClientOptions;\n\n /**\n *\n * Creates an instance of BlobChangeFeedClient from connection string.\n *\n * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.\n * [ Note - Account connection string can only be used in NODE.JS runtime. ]\n * Account connection string example -\n * `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`\n * SAS connection string example -\n * `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`\n * @param options - Optional. Options to configure the HTTP pipeline.\n */\n public static fromConnectionString(\n connectionString: string,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n // Static method to construct an object, the option is for the object not for the method.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n ): BlobChangeFeedClient {\n const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString, options);\n return new BlobChangeFeedClient(\n blobServiceClient.url,\n blobServiceClient.credential,\n appendUserAgentPrefix(options),\n changeFeedClientOptions,\n );\n }\n\n /**\n * Creates an instance of BlobChangeFeedClient.\n *\n * @param url - A Client string pointing to Azure Storage blob service, such as\n * \"https://myaccount.blob.core.windows.net\". You can append a SAS\n * if using AnonymousCredential, such as \"https://myaccount.blob.core.windows.net?sasString\".\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param options - Optional. Options to configure the HTTP pipeline.\n *\n * Example using DefaultAzureCredential from `@azure/identity`:\n *\n * ```js\n * const account = \"<storage account name>\";\n *\n * const defaultAzureCredential = new DefaultAzureCredential();\n *\n * const blobChangeFeedClient = new BlobChangeFeedClient(\n * `https://${account}.blob.core.windows.net`,\n * defaultAzureCredential\n * );\n * ```\n *\n * Example using an account name/key:\n *\n * ```js\n * const account = \"<storage account name>\"\n * const sharedKeyCredential = new StorageSharedKeyCredential(account, \"<account key>\");\n *\n * const blobChangeFeedClient = new BlobChangeFeedClient(\n * `https://${account}.blob.core.windows.net`,\n * sharedKeyCredential\n * );\n * ```\n */\n constructor(\n url: string,\n credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n );\n\n /**\n * Creates an instance of BlobChangeFeedClient.\n *\n * @param url - A Client string pointing to Azure Storage blob service, such as\n * \"https://myaccount.blob.core.windows.net\". You can append a SAS\n * if using AnonymousCredential, such as \"https://myaccount.blob.core.windows.net?sasString\".\n * @param pipeline - Call newPipeline() to create a default\n * pipeline, or provide a customized pipeline.\n */\n constructor(url: string, pipeline: Pipeline);\n constructor(\n urlOrClient: string,\n credentialOrPipeline?:\n | StorageSharedKeyCredential\n | AnonymousCredential\n | TokenCredential\n | Pipeline,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n ) {\n this.changeFeedClientOptions = changeFeedClientOptions || {};\n this.changeFeedFactory = new ChangeFeedFactory(\n this.changeFeedClientOptions.maximumTransferSize,\n );\n\n if (credentialOrPipeline instanceof Pipeline) {\n this.blobServiceClient = new BlobServiceClient(urlOrClient, credentialOrPipeline);\n } else {\n this.blobServiceClient = new BlobServiceClient(\n urlOrClient,\n credentialOrPipeline,\n appendUserAgentPrefix(options),\n );\n }\n }\n\n private async *getChange(\n options: BlobChangeFeedListChangesOptions = {},\n ): AsyncIterableIterator<BlobChangeFeedEvent> {\n const changeFeed: ChangeFeed = await this.changeFeedFactory.create(\n this.blobServiceClient,\n undefined,\n options,\n );\n\n while (changeFeed.hasNext()) {\n const event = await changeFeed.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: options.tracingOptions,\n });\n if (event) {\n yield event;\n } else {\n return;\n }\n }\n }\n\n // start in ChangeFeedListChangesOptions will be ignored when continuationToken is specified.\n private async *getPage(\n continuationToken?: string,\n maxPageSize?: number,\n options: BlobChangeFeedListChangesOptions = {},\n ): AsyncIterableIterator<BlobChangeFeedEventPage> {\n const changeFeed: ChangeFeed = await this.changeFeedFactory.create(\n this.blobServiceClient,\n continuationToken,\n options,\n );\n\n if (!maxPageSize || maxPageSize > CHANGE_FEED_MAX_PAGE_SIZE) {\n maxPageSize = CHANGE_FEED_MAX_PAGE_SIZE;\n }\n while (changeFeed.hasNext()) {\n const eventPage = new BlobChangeFeedEventPage();\n while (changeFeed.hasNext() && eventPage.events.length < maxPageSize) {\n const event = await changeFeed.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: options.tracingOptions,\n });\n if (event) {\n eventPage.events.push(event);\n }\n }\n if (changeFeed.hasNext()) {\n eventPage.continuationToken = JSON.stringify(changeFeed.getCursor());\n }\n if (eventPage.events.length > 0) {\n yield eventPage;\n } else {\n return;\n }\n }\n }\n\n /**\n * Returns an async iterable iterator to list all the change feed events\n * in the specified account.\n *\n * .byPage() returns an async iterable iterator to list the change feed events in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const event of blobChangeFeedClient.listChanges()) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobChangeFeedClient.listChanges();\n * let eventItem = await iter.next();\n * while (!eventItem.done) {\n * console.log(`Event ${i++}, type: ${eventItem.eventType}`);\n * eventItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const eventPage of blobChangeFeedClient.listChanges().byPage({ maxPageSize: 20 })) {\n * if (eventPage.events) {\n * for (const event of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobChangeFeedClient.listChanges().byPage({ maxPageSize: 2 });\n * let eventPage = (await iterator.next()).value;\n *\n * if (eventPage.events) {\n * for (const container of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = eventPage.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobChangeFeedClient\n * .listChanges()\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * eventPage = (await iterator.next()).value;\n *\n * if (eventPage.events) {\n * for (const container of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n * ```\n *\n * @param options - Options to list change feed events.\n * @returns An asyncIterableIterator that supports paging.\n */\n public listChanges(\n options: BlobChangeFeedListChangesOptions = {},\n ): PagedAsyncIterableIterator<BlobChangeFeedEvent, BlobChangeFeedEventPage> {\n const iter = this.getChange(options);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n async next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings: PageSettings = {}) => {\n return this.getPage(settings.continuationToken, settings.maxPageSize, options);\n },\n };\n }\n}\n"],"names":["createTracingClient","__asyncValues","__asyncGenerator","__await","AbortError","Readable","BlobServiceClient","Pipeline"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AvroReaderFactory.js","sourceRoot":"","sources":["../../../src/AvroReaderFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAUrB,MAAM,CACX,UAAwB,EACxB,YAA2B,EAC3B,WAAoB,EACpB,UAAmB;QAEnB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,IAAI,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,WAAY,EAAE,UAAW,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReadable } from \"../../storage-internal-avro/src\";\nimport { AvroReader } from \"../../storage-internal-avro/src\";\n\n/**\n * Creates AvroReaders. Allows us to inject mock AvroReaders in the Chunk unit tests.\n */\nexport class AvroReaderFactory {\n public create(headerAndDataStream: AvroReadable): AvroReader;\n\n public create(\n dataStream: AvroReadable,\n headerStream: AvroReadable,\n blockOffset: number,\n eventIndex: number,\n ): AvroReader;\n\n public create(\n dataStream: AvroReadable,\n headerStream?: AvroReadable,\n blockOffset?: number,\n eventIndex?: number,\n ): AvroReader {\n if (headerStream) {\n return new AvroReader(dataStream, headerStream, blockOffset!, eventIndex!);\n } else {\n return new AvroReader(dataStream);\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlobChangeFeedClient.js","sourceRoot":"","sources":["../../../src/BlobChangeFeedClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n StoragePipelineOptions,\n StorageSharedKeyCredential,\n AnonymousCredential,\n} from \"@azure/storage-blob\";\nimport { BlobServiceClient, Pipeline } from \"@azure/storage-blob\";\nimport type { PagedAsyncIterableIterator, PageSettings } from \"@azure/core-paging\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport { ChangeFeedFactory } from \"./ChangeFeedFactory\";\nimport type { ChangeFeed } from \"./ChangeFeed\";\nimport { CHANGE_FEED_MAX_PAGE_SIZE, SDK_VERSION } from \"./utils/constants\";\nimport type { BlobChangeFeedListChangesOptions } from \"./models/models\";\nimport type { TokenCredential } from \"@azure/core-auth\";\n\n/**\n * Contains paged response data for the {@link BlobChangeFeedClient.listChanges} operation.\n */\nexport class BlobChangeFeedEventPage {\n /**\n * Array of {@link BlobChangeFeedEvent}.\n */\n public events: BlobChangeFeedEvent[];\n\n /**\n * The token that keeps track of where to continue the iterator.\n */\n public continuationToken: string;\n\n constructor() {\n this.events = [];\n this.continuationToken = \"\";\n }\n}\n\n/**\n * Creates a new Pipeline object with Credential provided.\n *\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param pipelineOptions - Optional. Options.\n * @returns A new Pipeline object.\n */\nexport function newPipeline(\n credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential,\n pipelineOptions: StoragePipelineOptions = {},\n): Pipeline {\n return newPipeline(credential, appendUserAgentPrefix(pipelineOptions));\n}\n\nfunction appendUserAgentPrefix(options?: StoragePipelineOptions): StoragePipelineOptions {\n if (!options) {\n options = {};\n }\n if (options.userAgentOptions === undefined) {\n options.userAgentOptions = {};\n }\n\n if (options.userAgentOptions.userAgentPrefix === undefined) {\n options.userAgentOptions.userAgentPrefix = \"\";\n } else if (options.userAgentOptions.userAgentPrefix !== \"\") {\n options.userAgentOptions.userAgentPrefix += \" \";\n }\n options.userAgentOptions.userAgentPrefix += `changefeed-js/${SDK_VERSION}`;\n return options;\n}\n\n/**\n * Blob Change Feed client options.\n */\nexport interface BlobChangeFeedClientOptions {\n /**\n * The maximum length of an transfer in bytes.\n */\n maximumTransferSize?: number;\n}\n\n/**\n * BlobChangeFeedClient.\n * @see https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-change-feed?tabs=azure-portal\n */\nexport class BlobChangeFeedClient {\n /**\n * blobServiceClient provided by `@azure/storage-blob` package.\n */\n private blobServiceClient: BlobServiceClient;\n private changeFeedFactory: ChangeFeedFactory;\n private changeFeedClientOptions: BlobChangeFeedClientOptions;\n\n /**\n *\n * Creates an instance of BlobChangeFeedClient from connection string.\n *\n * @param connectionString - Account connection string or a SAS connection string of an Azure storage account.\n * [ Note - Account connection string can only be used in NODE.JS runtime. ]\n * Account connection string example -\n * `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`\n * SAS connection string example -\n * `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`\n * @param options - Optional. Options to configure the HTTP pipeline.\n */\n public static fromConnectionString(\n connectionString: string,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n // Static method to construct an object, the option is for the object not for the method.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n ): BlobChangeFeedClient {\n const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString, options);\n return new BlobChangeFeedClient(\n blobServiceClient.url,\n blobServiceClient.credential,\n appendUserAgentPrefix(options),\n changeFeedClientOptions,\n );\n }\n\n /**\n * Creates an instance of BlobChangeFeedClient.\n *\n * @param url - A Client string pointing to Azure Storage blob service, such as\n * \"https://myaccount.blob.core.windows.net\". You can append a SAS\n * if using AnonymousCredential, such as \"https://myaccount.blob.core.windows.net?sasString\".\n * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n * @param options - Optional. Options to configure the HTTP pipeline.\n *\n * Example using DefaultAzureCredential from `@azure/identity`:\n *\n * ```js\n * const account = \"<storage account name>\";\n *\n * const defaultAzureCredential = new DefaultAzureCredential();\n *\n * const blobChangeFeedClient = new BlobChangeFeedClient(\n * `https://${account}.blob.core.windows.net`,\n * defaultAzureCredential\n * );\n * ```\n *\n * Example using an account name/key:\n *\n * ```js\n * const account = \"<storage account name>\"\n * const sharedKeyCredential = new StorageSharedKeyCredential(account, \"<account key>\");\n *\n * const blobChangeFeedClient = new BlobChangeFeedClient(\n * `https://${account}.blob.core.windows.net`,\n * sharedKeyCredential\n * );\n * ```\n */\n constructor(\n url: string,\n credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n );\n\n /**\n * Creates an instance of BlobChangeFeedClient.\n *\n * @param url - A Client string pointing to Azure Storage blob service, such as\n * \"https://myaccount.blob.core.windows.net\". You can append a SAS\n * if using AnonymousCredential, such as \"https://myaccount.blob.core.windows.net?sasString\".\n * @param pipeline - Call newPipeline() to create a default\n * pipeline, or provide a customized pipeline.\n */\n constructor(url: string, pipeline: Pipeline);\n constructor(\n urlOrClient: string,\n credentialOrPipeline?:\n | StorageSharedKeyCredential\n | AnonymousCredential\n | TokenCredential\n | Pipeline,\n // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line.\n /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */\n options?: StoragePipelineOptions,\n changeFeedClientOptions?: BlobChangeFeedClientOptions,\n ) {\n this.changeFeedClientOptions = changeFeedClientOptions || {};\n this.changeFeedFactory = new ChangeFeedFactory(\n this.changeFeedClientOptions.maximumTransferSize,\n );\n\n if (credentialOrPipeline instanceof Pipeline) {\n this.blobServiceClient = new BlobServiceClient(urlOrClient, credentialOrPipeline);\n } else {\n this.blobServiceClient = new BlobServiceClient(\n urlOrClient,\n credentialOrPipeline,\n appendUserAgentPrefix(options),\n );\n }\n }\n\n private async *getChange(\n options: BlobChangeFeedListChangesOptions = {},\n ): AsyncIterableIterator<BlobChangeFeedEvent> {\n const changeFeed: ChangeFeed = await this.changeFeedFactory.create(\n this.blobServiceClient,\n undefined,\n options,\n );\n\n while (changeFeed.hasNext()) {\n const event = await changeFeed.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: options.tracingOptions,\n });\n if (event) {\n yield event;\n } else {\n return;\n }\n }\n }\n\n // start in ChangeFeedListChangesOptions will be ignored when continuationToken is specified.\n private async *getPage(\n continuationToken?: string,\n maxPageSize?: number,\n options: BlobChangeFeedListChangesOptions = {},\n ): AsyncIterableIterator<BlobChangeFeedEventPage> {\n const changeFeed: ChangeFeed = await this.changeFeedFactory.create(\n this.blobServiceClient,\n continuationToken,\n options,\n );\n\n if (!maxPageSize || maxPageSize > CHANGE_FEED_MAX_PAGE_SIZE) {\n maxPageSize = CHANGE_FEED_MAX_PAGE_SIZE;\n }\n while (changeFeed.hasNext()) {\n const eventPage = new BlobChangeFeedEventPage();\n while (changeFeed.hasNext() && eventPage.events.length < maxPageSize) {\n const event = await changeFeed.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: options.tracingOptions,\n });\n if (event) {\n eventPage.events.push(event);\n }\n }\n if (changeFeed.hasNext()) {\n eventPage.continuationToken = JSON.stringify(changeFeed.getCursor());\n }\n if (eventPage.events.length > 0) {\n yield eventPage;\n } else {\n return;\n }\n }\n }\n\n /**\n * Returns an async iterable iterator to list all the change feed events\n * in the specified account.\n *\n * .byPage() returns an async iterable iterator to list the change feed events in pages.\n *\n * Example using `for await` syntax:\n *\n * ```js\n * let i = 1;\n * for await (const event of blobChangeFeedClient.listChanges()) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * ```\n *\n * Example using `iter.next()`:\n *\n * ```js\n * let i = 1;\n * const iter = blobChangeFeedClient.listChanges();\n * let eventItem = await iter.next();\n * while (!eventItem.done) {\n * console.log(`Event ${i++}, type: ${eventItem.eventType}`);\n * eventItem = await iter.next();\n * }\n * ```\n *\n * Example using `byPage()`:\n *\n * ```js\n * // passing optional maxPageSize in the page settings\n * let i = 1;\n * for await (const eventPage of blobChangeFeedClient.listChanges().byPage({ maxPageSize: 20 })) {\n * if (eventPage.events) {\n * for (const event of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n * }\n * ```\n *\n * Example using paging with a marker:\n *\n * ```js\n * let i = 1;\n * let iterator = blobChangeFeedClient.listChanges().byPage({ maxPageSize: 2 });\n * let eventPage = (await iterator.next()).value;\n *\n * if (eventPage.events) {\n * for (const container of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n *\n * // Gets next marker\n * let marker = eventPage.continuationToken;\n * // Passing next marker as continuationToken\n * iterator = blobChangeFeedClient\n * .listChanges()\n * .byPage({ continuationToken: marker, maxPageSize: 10 });\n * eventPage = (await iterator.next()).value;\n *\n * if (eventPage.events) {\n * for (const container of eventPage.events) {\n * console.log(`Event ${i++}, type: ${event.eventType}`);\n * }\n * }\n * ```\n *\n * @param options - Options to list change feed events.\n * @returns An asyncIterableIterator that supports paging.\n */\n public listChanges(\n options: BlobChangeFeedListChangesOptions = {},\n ): PagedAsyncIterableIterator<BlobChangeFeedEvent, BlobChangeFeedEventPage> {\n const iter = this.getChange(options);\n return {\n /**\n * The next method, part of the iteration protocol\n */\n async next() {\n return iter.next();\n },\n /**\n * The connection to the async iterator, part of the iteration protocol\n */\n [Symbol.asyncIterator]() {\n return this;\n },\n /**\n * Return an AsyncIterableIterator that works a page at a time\n */\n byPage: (settings: PageSettings = {}) => {\n return this.getPage(settings.continuationToken, settings.maxPageSize, options);\n },\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeFeed.js","sourceRoot":"","sources":["../../../src/ChangeFeed.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { Segment } from \"./Segment\";\nimport type { SegmentFactory } from \"./SegmentFactory\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { ChangeFeedCursor } from \"./models/ChangeFeedCursor\";\nimport { getSegmentsInYear, minDate, getHost } from \"./utils/utils.common\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link ChangeFeed.getChange} operation.\n */\nexport interface ChangeFeedGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ChangeFeed {\n /**\n * BlobContainerClient for making List Blob requests and creating Segments.\n */\n private readonly containerClient?: ContainerClient;\n\n private readonly segmentFactory?: SegmentFactory;\n\n private readonly years: number[];\n\n private segments: string[];\n\n private currentSegment?: Segment;\n\n private lastConsumable?: Date;\n\n private startTime?: Date;\n\n private endTime?: Date;\n\n private end?: Date;\n\n constructor();\n constructor(\n containerClient: ContainerClient,\n segmentFactory: SegmentFactory,\n years: number[],\n segments: string[],\n currentSegment: Segment,\n lastConsumable: Date,\n startTime?: Date,\n endTime?: Date,\n );\n\n constructor(\n containerClient?: ContainerClient,\n segmentFactory?: SegmentFactory,\n years?: number[],\n segments?: string[],\n currentSegment?: Segment,\n lastConsumable?: Date,\n startTime?: Date,\n endTime?: Date,\n ) {\n this.containerClient = containerClient;\n this.segmentFactory = segmentFactory;\n this.years = years || [];\n this.segments = segments || [];\n this.currentSegment = currentSegment;\n this.lastConsumable = lastConsumable;\n this.startTime = startTime;\n this.endTime = endTime;\n if (this.lastConsumable) {\n this.end = minDate(this.lastConsumable, this.endTime);\n }\n }\n\n private async advanceSegmentIfNecessary(options: ChangeFeedGetChangeOptions = {}): Promise<void> {\n return tracingClient.withSpan(\n \"ChangeFeed-advanceSegmentIfNecessary\",\n options,\n async (updatedOptions) => {\n if (!this.currentSegment) {\n throw new Error(\"Empty Change Feed shouldn't call this function.\");\n }\n\n // If the current segment has more Events, we don't need to do anything.\n if (this.currentSegment.hasNext()) {\n return;\n }\n\n // If the current segment is completed, remove it\n if (this.segments.length > 0) {\n this.currentSegment = await this.segmentFactory!.create(\n this.containerClient!,\n this.segments.shift()!,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n // If segments is empty, refill it\n else if (this.segments.length === 0 && this.years.length > 0) {\n const year = this.years.shift();\n this.segments = await getSegmentsInYear(\n this.containerClient!,\n year!,\n this.startTime,\n this.end,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n\n if (this.segments.length > 0) {\n this.currentSegment = await this.segmentFactory!.create(\n this.containerClient!,\n this.segments.shift()!,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n } else {\n this.currentSegment = undefined;\n }\n }\n },\n );\n }\n\n public hasNext(): boolean {\n // Empty ChangeFeed, using currentSegment as the indicator.\n if (!this.currentSegment) {\n return false;\n }\n\n if (this.segments.length === 0 && this.years.length === 0 && !this.currentSegment.hasNext()) {\n return false;\n }\n\n return this.currentSegment.dateTime < this.end!;\n }\n\n public async getChange(\n options: ChangeFeedGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"ChangeFeed-getChange\", options, async (updatedOptions) => {\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n event = await this.currentSegment!.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n await this.advanceSegmentIfNecessary({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n }\n return event;\n });\n }\n\n public getCursor(): ChangeFeedCursor {\n if (!this.currentSegment) {\n throw new Error(\"Empty Change Feed shouldn't call this function.\");\n }\n\n return {\n CursorVersion: 1,\n UrlHost: getHost(this.containerClient!.url)!,\n EndTime: this.endTime?.toJSON(),\n CurrentSegmentCursor: this.currentSegment!.getCursor(),\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeFeedFactory.js","sourceRoot":"","sources":["../../../src/ChangeFeedFactory.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobServiceClient, ContainerClient } from \"@azure/storage-blob\";\nimport { ChangeFeed } from \"./ChangeFeed\";\nimport type { ChangeFeedCursor } from \"./models/ChangeFeedCursor\";\nimport { CHANGE_FEED_CONTAINER_NAME, CHANGE_FEED_META_SEGMENT_PATH } from \"./utils/constants\";\nimport {\n ceilToNearestHour,\n floorToNearestHour,\n getYearsPaths,\n getSegmentsInYear,\n minDate,\n getHost,\n parseDateFromSegmentPath,\n} from \"./utils/utils.common\";\nimport { bodyToString } from \"./utils/utils.node\";\nimport { SegmentFactory } from \"./SegmentFactory\";\nimport { ShardFactory } from \"./ShardFactory\";\nimport { ChunkFactory } from \"./ChunkFactory\";\nimport { AvroReaderFactory } from \"./AvroReaderFactory\";\nimport type { Segment } from \"./Segment\";\nimport type { BlobChangeFeedListChangesOptions } from \"./models/models\";\nimport { tracingClient } from \"./utils/tracing\";\nimport { LazyLoadingBlobStreamFactory } from \"./LazyLoadingBlobStreamFactory\";\n\ninterface MetaSegments {\n version?: number;\n lastConsumable: string;\n}\n\nexport class ChangeFeedFactory {\n private readonly segmentFactory: SegmentFactory;\n private readonly maxTransferSize?: number;\n\n constructor(maxTransferSize?: number);\n constructor(segmentFactory: SegmentFactory);\n constructor(segmentFactoryOrMaxTransferSize?: SegmentFactory | number) {\n let segmentFactory: SegmentFactory | undefined;\n if (segmentFactoryOrMaxTransferSize) {\n if (Number.isFinite(segmentFactoryOrMaxTransferSize)) {\n this.maxTransferSize = segmentFactoryOrMaxTransferSize as number;\n } else if (segmentFactoryOrMaxTransferSize instanceof SegmentFactory) {\n segmentFactory = segmentFactoryOrMaxTransferSize as SegmentFactory;\n }\n }\n\n if (segmentFactory) {\n this.segmentFactory = segmentFactory;\n } else {\n this.segmentFactory = new SegmentFactory(\n new ShardFactory(\n new ChunkFactory(\n new AvroReaderFactory(),\n new LazyLoadingBlobStreamFactory(),\n this.maxTransferSize,\n ),\n ),\n );\n }\n }\n\n private static validateCursor(containerClient: ContainerClient, cursor: ChangeFeedCursor): void {\n if (getHost(containerClient.url) !== cursor.UrlHost) {\n throw new Error(\"Cursor URL host does not match container URL host.\");\n }\n if (cursor.CursorVersion !== 1) {\n throw new Error(\"Unsupported cursor version.\");\n }\n }\n\n public async create(\n blobServiceClient: BlobServiceClient,\n continuationToken?: string,\n options: BlobChangeFeedListChangesOptions = {},\n ): Promise<ChangeFeed> {\n return tracingClient.withSpan(\"ChangeFeedFactory-create\", options, async (updatedOptions) => {\n const containerClient = blobServiceClient.getContainerClient(CHANGE_FEED_CONTAINER_NAME);\n let cursor: ChangeFeedCursor | undefined = undefined;\n // Create cursor.\n if (continuationToken) {\n cursor = JSON.parse(continuationToken);\n ChangeFeedFactory.validateCursor(containerClient, cursor!);\n options.start = parseDateFromSegmentPath(cursor!.CurrentSegmentCursor.SegmentPath!);\n options.end = new Date(cursor!.EndTime!);\n }\n // Round start and end time if we are not using the cursor.\n else {\n options.start = floorToNearestHour(options.start);\n options.end = ceilToNearestHour(options.end);\n }\n\n // Check if Change Feed has been enabled for this account.\n const changeFeedContainerExists = await containerClient.exists({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n if (!changeFeedContainerExists) {\n throw new Error(\n \"Change Feed hasn't been enabled on this account, or is currently being enabled.\",\n );\n }\n\n if (options.start && options.end && options.start >= options.end) {\n return new ChangeFeed();\n }\n\n // Get last consumable.\n const blobClient = containerClient.getBlobClient(CHANGE_FEED_META_SEGMENT_PATH);\n let blobDownloadRes;\n try {\n blobDownloadRes = await blobClient.download(undefined, undefined, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n } catch (err: any) {\n if (err.statusCode === 404) {\n return new ChangeFeed();\n } else {\n throw err;\n }\n }\n const lastConsumable = new Date(\n (JSON.parse(await bodyToString(blobDownloadRes)) as MetaSegments).lastConsumable,\n );\n\n // Get year paths\n const years: number[] = await getYearsPaths(containerClient, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n\n // Dequeue any years that occur before start time.\n if (options.start) {\n const startYear = options.start.getUTCFullYear();\n while (years.length > 0 && years[0] < startYear) {\n years.shift();\n }\n }\n if (years.length === 0) {\n return new ChangeFeed();\n }\n\n let segments: string[] = [];\n while (segments.length === 0 && years.length !== 0) {\n segments = await getSegmentsInYear(\n containerClient,\n years.shift()!,\n options.start,\n minDate(lastConsumable, options.end),\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n if (segments.length === 0) {\n return new ChangeFeed();\n }\n const currentSegment: Segment = await this.segmentFactory.create(\n containerClient,\n segments.shift()!,\n cursor?.CurrentSegmentCursor,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n\n return new ChangeFeed(\n containerClient,\n this.segmentFactory,\n years,\n segments,\n currentSegment,\n lastConsumable,\n options.start,\n options.end,\n );\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Chunk.js","sourceRoot":"","sources":["../../../src/Chunk.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAOlC,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAarE,MAAM,OAAO,KAAK;IAKhB,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAGD,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,YACE,UAAsB,EACtB,WAAmB,EACnB,UAAkB,EACF,SAAiB,EACjC,cAAgC,EAAE;QADlB,cAAS,GAAT,SAAS,CAAQ;QAGjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,SAAS;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAChD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;YAC5B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReader } from \"../../storage-internal-avro/src\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AvroParseOptions } from \"../../storage-internal-avro/src/AvroReader\";\nimport { rawEventToBlobChangeFeedEvent } from \"./utils/utils.common\";\n\n/**\n * Options to configure {@link Chunk.getChange} operation.\n */\nexport interface ChunkGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Chunk {\n private readonly avroReader: AvroReader;\n private readonly iter: AsyncIterableIterator<Record<string, any> | null>;\n\n private _blockOffset: number;\n public get blockOffset(): number {\n return this._blockOffset;\n }\n\n private _eventIndex: number;\n public get eventIndex(): number {\n return this._eventIndex;\n }\n\n constructor(\n avroReader: AvroReader,\n blockOffset: number,\n eventIndex: number,\n public readonly chunkPath: string,\n avroOptions: AvroParseOptions = {},\n ) {\n this.avroReader = avroReader;\n this._blockOffset = blockOffset;\n this._eventIndex = eventIndex;\n\n this.iter = this.avroReader.parseObjects(avroOptions);\n }\n\n public hasNext(): boolean {\n return this.avroReader.hasNext();\n }\n\n public async getChange(): Promise<BlobChangeFeedEvent | undefined> {\n if (!this.hasNext()) {\n return undefined;\n }\n\n const next = await this.iter.next();\n this._eventIndex = this.avroReader.objectIndex;\n this._blockOffset = this.avroReader.blockOffset;\n if (next.done) {\n return undefined;\n } else {\n const eventRaw = next.value;\n if (eventRaw === null) {\n return undefined;\n }\n\n return rawEventToBlobChangeFeedEvent(eventRaw);\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChunkFactory.js","sourceRoot":"","sources":["../../../src/ChunkFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mBAAmB,CAAC;AAa1E,MAAM,OAAO,YAAY;IAKvB,YACE,iBAAoC,EACpC,4BAA0D,EAC1D,eAAwB;QAExB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;QACjE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,eAAgC,EAChC,SAAiB,EACjB,WAAoB,EACpB,UAAmB,EACnB,UAA8B,EAAE;QAEhC,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5D,WAAW,GAAG,WAAW,IAAI,CAAC,CAAC;QAC/B,UAAU,GAAG,UAAU,IAAI,CAAC,CAAC;QAE7B,MAAM,UAAU,GAAG,oBAAoB,CACrC,IAAI,CAAC,4BAA4B,CAAC,MAAM,CACtC,UAAU,EACV,WAAW,EACX,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,qCAAqC,EACnF,OAAO,CACR,CACF,CAAC;QAEF,IAAI,UAAsB,CAAC;QAC3B,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,oBAAoB,CACvC,IAAI,CAAC,4BAA4B,CAAC,MAAM,CACtC,UAAU,EACV,CAAC,EACD,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,qCAAqC,EACnF,OAAO,CACR,CACF,CAAC;YACF,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE;YAC/D,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { AvroReaderFactory } from \"./AvroReaderFactory\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport { Chunk } from \"./Chunk\";\nimport type { AvroReader } from \"../../storage-internal-avro/src\";\nimport { streamToAvroReadable } from \"./utils/utils.node\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { LazyLoadingBlobStreamFactory } from \"./LazyLoadingBlobStreamFactory\";\nimport { CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE } from \"./utils/constants\";\n\n/**\n * Options to configure {@link ChunkFactory.create} operation.\n */\nexport interface CreateChunkOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ChunkFactory {\n private readonly avroReaderFactory: AvroReaderFactory;\n private readonly lazyLoadingBlobStreamFactory: LazyLoadingBlobStreamFactory;\n private readonly maxTransferSize?: number;\n\n constructor(\n avroReaderFactory: AvroReaderFactory,\n lazyLoadingBlobStreamFactory: LazyLoadingBlobStreamFactory,\n maxTransferSize?: number,\n ) {\n this.avroReaderFactory = avroReaderFactory;\n this.lazyLoadingBlobStreamFactory = lazyLoadingBlobStreamFactory;\n this.maxTransferSize = maxTransferSize;\n }\n\n public async create(\n containerClient: ContainerClient,\n chunkPath: string,\n blockOffset?: number,\n eventIndex?: number,\n options: CreateChunkOptions = {},\n ): Promise<Chunk> {\n const blobClient = containerClient.getBlobClient(chunkPath);\n blockOffset = blockOffset || 0;\n eventIndex = eventIndex || 0;\n\n const dataStream = streamToAvroReadable(\n this.lazyLoadingBlobStreamFactory.create(\n blobClient,\n blockOffset,\n this.maxTransferSize ? this.maxTransferSize : CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE,\n options,\n ),\n );\n\n let avroReader: AvroReader;\n if (blockOffset !== 0) {\n const headerStream = streamToAvroReadable(\n this.lazyLoadingBlobStreamFactory.create(\n blobClient,\n 0,\n this.maxTransferSize ? this.maxTransferSize : CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE,\n options,\n ),\n );\n avroReader = this.avroReaderFactory.create(dataStream, headerStream, blockOffset, eventIndex);\n } else {\n avroReader = this.avroReaderFactory.create(dataStream);\n }\n\n return new Chunk(avroReader, blockOffset, eventIndex, chunkPath, {\n abortSignal: options.abortSignal,\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyLoadingBlobStream.js","sourceRoot":"","sources":["../../../src/LazyLoadingBlobStream.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ReadableOptions } from \"stream\";\nimport { Readable } from \"stream\";\nimport type { BlobClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure the LazyLoadingBlobStream.\n */\nexport interface LazyLoadingBlobStreamOptions extends ReadableOptions, CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\ninterface LazyLoadingBlobStreamDownloadBlockOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\n/**\n * This class generates a readable stream from a blobClient's data.\n */\nexport class LazyLoadingBlobStream extends Readable {\n /**\n * BlobClient to make download calls with.\n */\n private readonly blobClient: BlobClient;\n\n /**\n * The offset within the blob of the next block we will download.\n */\n private offset: number;\n\n private readonly blockSize: number;\n\n private lastDownloadBytes: number;\n\n private lastDownloadData?: Buffer;\n\n private blobLength: number;\n\n private options?: LazyLoadingBlobStreamOptions;\n\n /**\n * Creates an instance of LazyLoadingBlobStream.\n *\n * @param byteLength - The total length of data contained in the buffers\n */\n constructor(\n blobClient: BlobClient,\n offset: number,\n blockSize: number,\n options?: LazyLoadingBlobStreamOptions,\n ) {\n super(options);\n this.blobClient = blobClient;\n this.offset = offset;\n this.blockSize = blockSize;\n this.lastDownloadBytes = -1;\n this.blobLength = -1;\n this.options = options;\n }\n\n private async downloadBlock(options: LazyLoadingBlobStreamDownloadBlockOptions = {}) {\n return tracingClient.withSpan(\n \"LazyLoadingBlobStream-downloadBlock\",\n options,\n async (updatedOptions) => {\n const properties = await this.blobClient.getProperties({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n this.blobLength = properties.contentLength!;\n\n this.lastDownloadBytes = Math.min(this.blockSize, this.blobLength - this.offset);\n if (this.lastDownloadBytes === 0) {\n this.lastDownloadData = undefined;\n return;\n }\n\n this.lastDownloadData = await this.blobClient.downloadToBuffer(\n this.offset,\n this.lastDownloadBytes,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n this.offset += this.lastDownloadBytes;\n },\n );\n }\n\n /**\n * Internal _read() that will be called when the stream wants to pull more data in.\n *\n * @param size - Optional. The size of data to be read\n */\n public async _read(size?: number): Promise<void> {\n return tracingClient.withSpan(\n \"LazyLoadingBlobStream-read\",\n this.options ?? {},\n async (updatedOptions) => {\n if (!size) {\n size = this.readableHighWaterMark;\n }\n let count = 0;\n let chunkSize = 0;\n const chunksToPush = [];\n do {\n if (this.lastDownloadData === undefined || this.lastDownloadData?.byteLength === 0) {\n await this.downloadBlock({\n abortSignal: this.options?.abortSignal,\n tracingOptions: updatedOptions?.tracingOptions,\n });\n }\n if (this.lastDownloadData?.byteLength) {\n chunkSize = Math.min(size - count, this.lastDownloadData?.byteLength);\n chunksToPush.push(this.lastDownloadData.slice(0, chunkSize));\n this.lastDownloadData = this.lastDownloadData.slice(chunkSize);\n count += chunkSize;\n } else {\n chunkSize = 0;\n }\n } while (chunkSize > 0 && count < size);\n\n this.push(Buffer.concat(chunksToPush));\n\n if (count < size) {\n this.push(null);\n }\n },\n );\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyLoadingBlobStreamFactory.js","sourceRoot":"","sources":["../../../src/LazyLoadingBlobStreamFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,OAAO,4BAA4B;IAChC,MAAM,CACX,UAAsB,EACtB,MAAc,EACd,SAAiB,EACjB,OAAsC;QAEtC,OAAO,IAAI,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobClient } from \"@azure/storage-blob\";\nimport type { LazyLoadingBlobStreamOptions } from \"./LazyLoadingBlobStream\";\nimport { LazyLoadingBlobStream } from \"./LazyLoadingBlobStream\";\n\nexport class LazyLoadingBlobStreamFactory {\n public create(\n blobClient: BlobClient,\n offset: number,\n blockSize: number,\n options?: LazyLoadingBlobStreamOptions,\n ): LazyLoadingBlobStream {\n return new LazyLoadingBlobStream(blobClient, offset, blockSize, options);\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Segment.js","sourceRoot":"","sources":["../../../src/Segment.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAOlC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAahD,MAAM,OAAO,OAAO;IAYlB,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,YACE,MAAe,EACf,UAAkB,EAClB,QAAc,EACG,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;QAErC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAE1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,UAAmC,EAAE;QAErC,OAAO,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YACnF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,KAAK,GAAoC,SAAS,CAAC;YACvD,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,4BAA4B;oBAC1F,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClD,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC;oBACnC,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;iBAC9C,CAAC,CAAC;gBAEH,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;oBACvC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,CAAC;gBACD,0BAA0B;gBAC1B,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC/D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,SAAS;QACd,MAAM,YAAY,GAAkB,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,YAAY;YAC1B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS;SACzD,CAAC;IACJ,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { Shard } from \"./Shard\";\nimport type { SegmentCursor, ShardCursor } from \"./models/ChangeFeedCursor\";\nimport type { CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link Segment.getChange} operation.\n */\nexport interface SegmentGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Segment {\n private readonly shards: Shard[];\n\n // Track shards that we have finished reading from.\n private shardDone: boolean[];\n private shardDoneCount: number;\n\n private shardIndex: number;\n\n // Assuming the dateTime of segments is rounded to hour. If not, our logic for fetching\n // change events between a time range would be incorrect.\n private _dateTime: Date;\n public get dateTime(): Date {\n return this._dateTime;\n }\n\n constructor(\n shards: Shard[],\n shardIndex: number,\n dateTime: Date,\n private readonly manifestPath: string,\n ) {\n this.shards = shards;\n this.shardIndex = shardIndex;\n this._dateTime = dateTime;\n\n this.shardDone = Array(shards.length).fill(false);\n this.shardDoneCount = 0;\n }\n\n public hasNext(): boolean {\n return this.shards.length > this.shardDoneCount;\n }\n\n public async getChange(\n options: SegmentGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"Segment-getChange\", options, async (updatedOptions) => {\n if (this.shardIndex >= this.shards.length || this.shardIndex < 0) {\n throw new Error(\"shardIndex invalid.\");\n }\n\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n if (this.shardDone[this.shardIndex]) {\n this.shardIndex = (this.shardIndex + 1) % this.shards.length; // find next available shard\n continue;\n }\n\n const currentShard = this.shards[this.shardIndex];\n event = await currentShard.getChange({\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n\n if (!currentShard.hasNext()) {\n this.shardDone[this.shardIndex] = true;\n this.shardDoneCount++;\n }\n // Round robin with shards\n this.shardIndex = (this.shardIndex + 1) % this.shards.length;\n }\n return event;\n });\n }\n\n public getCursor(): SegmentCursor {\n const shardCursors: ShardCursor[] = [];\n for (const shard of this.shards) {\n const shardCursor = shard.getCursor();\n if (shardCursor) {\n shardCursors.push(shardCursor);\n }\n }\n\n return {\n SegmentPath: this.manifestPath,\n ShardCursors: shardCursors,\n CurrentShardPath: this.shards[this.shardIndex].shardPath,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentFactory.js","sourceRoot":"","sources":["../../../src/SegmentFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAsBhD,MAAM,OAAO,cAAc;IAGzB,YAAY,YAA0B;QACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,eAAgC,EAChC,YAAoB,EACpB,MAAsB,EACtB,UAAgC,EAAE;QAElC,OAAO,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YACvF,MAAM,MAAM,GAAY,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAS,wBAAwB,CAAC,YAAY,CAAC,CAAC;YAE9D,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE;gBACtE,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;aAC9C,CAAC,CAAC;YACH,MAAM,WAAW,GAAW,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;YAEhE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAoB,CAAC;YAEnE,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB;YAC1F,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC;gBACvD,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;gBACnE,MAAM,WAAW,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClD,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,CAC/C,CAAC;gBACF,MAAM,KAAK,GAAU,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CACjD,eAAe,EACf,eAAe,EACf,WAAW,EACX;oBACE,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;iBAC9C,CACF,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,EAAE,CAAC;gBAC7B,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,MAAK,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAA,CAAC,CAAC;gBAC/E,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;oBACtB,UAAU,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ShardFactory } from \"./ShardFactory\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport { CHANGE_FEED_CONTAINER_NAME } from \"./utils/constants\";\nimport type { Shard } from \"./Shard\";\nimport { Segment } from \"./Segment\";\nimport type { SegmentCursor } from \"./models/ChangeFeedCursor\";\nimport { bodyToString } from \"./utils/utils.node\";\nimport { parseDateFromSegmentPath } from \"./utils/utils.common\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\nexport interface SegmentManifest {\n version?: number;\n begin?: Date;\n intervalSecs?: number;\n status: string;\n config?: any;\n chunkFilePaths: string[];\n}\n\n/**\n * Options to configure {@link SegmentFactory.create} operation.\n */\nexport interface CreateSegmentOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class SegmentFactory {\n private readonly shardFactory: ShardFactory;\n\n constructor(shardFactory: ShardFactory) {\n this.shardFactory = shardFactory;\n }\n\n public async create(\n containerClient: ContainerClient,\n manifestPath: string,\n cursor?: SegmentCursor,\n options: CreateSegmentOptions = {},\n ): Promise<Segment> {\n return tracingClient.withSpan(\"SegmentFactory-create\", options, async (updatedOptions) => {\n const shards: Shard[] = [];\n const dateTime: Date = parseDateFromSegmentPath(manifestPath);\n\n const blobClient = containerClient.getBlobClient(manifestPath);\n const blobDownloadRes = await blobClient.download(undefined, undefined, {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n });\n const blobContent: string = await bodyToString(blobDownloadRes);\n\n const segmentManifest = JSON.parse(blobContent) as SegmentManifest;\n\n const containerPrefixLength = CHANGE_FEED_CONTAINER_NAME.length + 1; // \"$blobchangefeed/\"\n for (const shardPath of segmentManifest.chunkFilePaths) {\n const shardPathSubStr = shardPath.substring(containerPrefixLength);\n const shardCursor = cursor?.ShardCursors.find((x) =>\n x.CurrentChunkPath.startsWith(shardPathSubStr),\n );\n const shard: Shard = await this.shardFactory.create(\n containerClient,\n shardPathSubStr,\n shardCursor,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n if (shard.hasNext()) {\n shards.push(shard);\n }\n }\n\n let shardIndex = 0;\n if (cursor?.CurrentShardPath) {\n shardIndex = shards.findIndex((s) => s.shardPath === cursor?.CurrentShardPath);\n if (shardIndex === -1) {\n shardIndex = 0;\n }\n }\n return new Segment(shards, shardIndex, dateTime, manifestPath);\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Shard.js","sourceRoot":"","sources":["../../../src/Shard.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAahD,MAAM,OAAO,KAAK;IAShB,YACE,eAAgC,EAChC,YAA0B,EAC1B,MAAgB,EAChB,YAA+B,EACf,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QAEjC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEM,OAAO;QACZ,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAC3F,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,UAAiC,EAAE;QAEnC,OAAO,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;YACjF,IAAI,KAAK,GAAoC,SAAS,CAAC;YACvD,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7C,KAAK,GAAG,MAAM,IAAI,CAAC,YAAa,CAAC,SAAS,EAAE,CAAC;gBAE7C,sDAAsD;gBACtD,IAAI,CAAC,IAAI,CAAC,YAAa,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5D,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAChD,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,EACpB,SAAS,EACT,SAAS,EACT;wBACE,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;qBAC9C,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS;YACpC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;gBAC7C,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;gBAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU;aACzC,CAAC;IACR,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { ChunkFactory } from \"./ChunkFactory\";\nimport type { Chunk } from \"./Chunk\";\nimport type { BlobChangeFeedEvent } from \"./models/BlobChangeFeedEvent\";\nimport type { ShardCursor } from \"./models/ChangeFeedCursor\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link Shard.getChange} operation.\n */\nexport interface ShardGetChangeOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class Shard {\n private readonly containerClient: ContainerClient;\n\n private readonly chunkFactory: ChunkFactory;\n\n private readonly chunks: string[];\n\n private currentChunk: Chunk | undefined;\n\n constructor(\n containerClient: ContainerClient,\n chunkFactory: ChunkFactory,\n chunks: string[],\n currentChunk: Chunk | undefined,\n public readonly shardPath: string,\n ) {\n this.containerClient = containerClient;\n this.chunkFactory = chunkFactory;\n this.chunks = chunks;\n this.currentChunk = currentChunk;\n }\n\n public hasNext(): boolean {\n return (\n this.chunks.length > 0 || (this.currentChunk !== undefined && this.currentChunk.hasNext())\n );\n }\n\n public async getChange(\n options: ShardGetChangeOptions = {},\n ): Promise<BlobChangeFeedEvent | undefined> {\n return tracingClient.withSpan(\"Shard-getChange\", options, async (updatedOptions) => {\n let event: BlobChangeFeedEvent | undefined = undefined;\n while (event === undefined && this.hasNext()) {\n event = await this.currentChunk!.getChange();\n\n // Remove currentChunk if it doesn't have more events.\n if (!this.currentChunk!.hasNext() && this.chunks.length > 0) {\n this.currentChunk = await this.chunkFactory.create(\n this.containerClient,\n this.chunks.shift()!,\n undefined,\n undefined,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n }\n return event;\n });\n }\n\n public getCursor(): ShardCursor | undefined {\n return this.currentChunk === undefined\n ? undefined\n : {\n CurrentChunkPath: this.currentChunk.chunkPath,\n BlockOffset: this.currentChunk.blockOffset,\n EventIndex: this.currentChunk.eventIndex,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShardFactory.js","sourceRoot":"","sources":["../../../src/ShardFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;;AAIlC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIhC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAahD,MAAM,OAAO,YAAY;IAGvB,YAAY,YAA0B;QACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,eAAgC,EAChC,SAAiB,EACjB,WAAyB,EACzB,UAA8B,EAAE;QAEhC,OAAO,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;;YACrF,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAW,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,WAAW,KAAI,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAW,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,UAAU,KAAI,CAAC,CAAC;;gBAExD,KAA6B,eAAA,KAAA,cAAA,eAAe,CAAC,aAAa,CAAC;oBACzD,MAAM,EAAE,SAAS;oBACjB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;iBAC9C,CAAC,CAAA,IAAA,sDAAE,CAAC;oBAJwB,cAI3B;oBAJ2B,WAI3B;oBAJS,MAAM,QAAQ,KAAA,CAAA;oBAKvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;;;;;;;;;YAED,MAAM,gBAAgB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,CAAC;YACvD,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;YACpB,IAAI,YAAY,GAAsB,SAAS,CAAC;YAChD,8CAA8C;YAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,gCAAgC;gBAChC,IAAI,gBAAgB,EAAE,CAAC;oBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACvC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;4BACnC,UAAU,GAAG,CAAC,CAAC;4BACf,MAAM;wBACR,CAAC;oBACH,CAAC;oBACD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;wBACtB,MAAM,IAAI,KAAK,CAAC,SAAS,gBAAgB,aAAa,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,CAAC,CAAC;gBACjB,CAAC;gBAED,iCAAiC;gBACjC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC/B,CAAC;gBAED,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAC3C,eAAe,EACf,MAAM,CAAC,KAAK,EAAG,EACf,WAAW,EACX,UAAU,EACV;oBACE,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,cAAc,CAAC,cAAc;iBAC9C,CACF,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChunkFactory } from \"./ChunkFactory\";\nimport type { ShardCursor } from \"./models/ChangeFeedCursor\";\nimport { Shard } from \"./Shard\";\nimport type { ContainerClient, CommonOptions } from \"@azure/storage-blob\";\nimport type { Chunk } from \"./Chunk\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport { tracingClient } from \"./utils/tracing\";\n\n/**\n * Options to configure {@link ShardFactory.create} operation.\n */\nexport interface CreateShardOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n}\n\nexport class ShardFactory {\n private readonly chunkFactory: ChunkFactory;\n\n constructor(chunkFactory: ChunkFactory) {\n this.chunkFactory = chunkFactory;\n }\n\n public async create(\n containerClient: ContainerClient,\n shardPath: string,\n shardCursor?: ShardCursor,\n options: CreateShardOptions = {},\n ): Promise<Shard> {\n return tracingClient.withSpan(\"ShardFactory-create\", options, async (updatedOptions) => {\n const chunks: string[] = [];\n const blockOffset: number = shardCursor?.BlockOffset || 0;\n const eventIndex: number = shardCursor?.EventIndex || 0;\n\n for await (const blobItem of containerClient.listBlobsFlat({\n prefix: shardPath,\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n })) {\n chunks.push(blobItem.name);\n }\n\n const currentChunkPath = shardCursor?.CurrentChunkPath;\n let chunkIndex = -1;\n let currentChunk: Chunk | undefined = undefined;\n // Chunks can be empty right after hour flips.\n if (chunks.length !== 0) {\n // Fast forward to current Chunk\n if (currentChunkPath) {\n for (let i = 0; i < chunks.length; i++) {\n if (chunks[i] === currentChunkPath) {\n chunkIndex = i;\n break;\n }\n }\n if (chunkIndex === -1) {\n throw new Error(`Chunk ${currentChunkPath} not found.`);\n }\n } else {\n chunkIndex = 0;\n }\n\n // Fast forward to current Chunk.\n if (chunkIndex > 0) {\n chunks.splice(0, chunkIndex);\n }\n\n currentChunk = await this.chunkFactory.create(\n containerClient,\n chunks.shift()!,\n blockOffset,\n eventIndex,\n {\n abortSignal: options.abortSignal,\n tracingOptions: updatedOptions.tracingOptions,\n },\n );\n }\n\n return new Shard(containerClient, this.chunkFactory, chunks, currentChunk, shardPath);\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport * from \"./BlobChangeFeedClient\";\nexport * from \"./models/BlobChangeFeedEvent\";\nexport * from \"./models/models\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/log.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { createClientLogger } from \"@azure/logger\";\n\n/**\n * The `@azure/logger` configuration for this package.\n */\nexport const logger = createClientLogger(\"storage-blob-changefeed\");\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlobChangeFeedEvent.js","sourceRoot":"","sources":["../../../../src/models/BlobChangeFeedEvent.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// https://msazure.visualstudio.com/One/_git/Storage-XStore?path=%2Fsrc%2FXTable%2FNotifications%2Flib%2FBlobChangeEventv4.json&version=GBmaster\n\n/**\n * Change feed event record types.\n */\nexport type BlobChangeFeedEventType =\n | \"UnspecifiedEventType\"\n | \"BlobCreated\"\n | \"BlobDeleted\"\n | \"BlobPropertiesUpdated\"\n | \"BlobSnapshotCreated\"\n | \"Control\"\n | \"BlobTierChanged\"\n | \"BlobAsyncOperationInitiated\"\n | \"BlobMetadataUpdated\"\n | \"RestorePointMarkerCreated\";\n\n/**\n * Change feed event record. Contains response data for the {@link BlobChangeFeedClient.listChanges} operation.\n * @see https://learn.microsoft.com/en-us/azure/event-grid/event-schema-blob-storage?toc=/azure/storage/blobs/toc.json#event-properties\n */\nexport interface BlobChangeFeedEvent {\n /**\n * Full resource path to the event source. This field is not writeable. Event Grid provides this value.\n */\n topic: string;\n\n /**\n * Publisher-defined path to the event subject.\n */\n subject: string;\n\n /**\n * One of the registered event types for this event source.\n */\n eventType: BlobChangeFeedEventType;\n\n /**\n * The time the event is generated based on the provider's UTC time.\n */\n eventTime: Date;\n\n /**\n * Unique identifier for the event.\n */\n id: string; // GUID\n\n /**\n * Blob storage event data.\n */\n data: BlobChangeFeedEventData;\n\n /**\n * The schema version of the data object. The publisher defines the schema version.\n */\n dataVersion?: string;\n\n /**\n * The schema version of the data object. The publisher defines the schema version.\n */\n schemaVersion?: number;\n\n /**\n * The schema version of the event metadata. Event Grid defines the schema of the top-level properties. Event Grid provides this value.\n */\n metadataVersion: string;\n}\n\n/**\n * The type of blob.\n */\nexport type BlobType = \"BlockBlob\" | \"AppendBlob\" | \"PageBlob\";\n\n/**\n * The AccessTier.\n */\nexport type AccessTier =\n | \"P4\"\n | \"P6\"\n | \"P10\"\n | \"P15\"\n | \"P20\"\n | \"P30\"\n | \"P40\"\n | \"P50\"\n | \"P60\"\n | \"P70\"\n | \"P80\"\n | \"Hot\"\n | \"Cool\"\n | \"Archive\";\n\n/**\n * A blob property that was updated.\n */\nexport interface BlobPropertyChange {\n /**\n * The name of the property that was updated.\n */\n propertyName: string;\n /**\n * The previous value of the property.\n */\n oldValue: string;\n /**\n * The new value of the property.\n */\n newValue: string;\n}\n/**\n * Blob properties that were updated during an event.\n */\nexport type UpdatedBlobProperties = Record<string, BlobPropertyChange>;\n/**\n * Previous info for Change Feed Event.\n */\nexport interface ChangeFeedEventPreviousInfo {\n /**\n * Soft delete snapshot.\n */\n softDeleteSnapshot?: string;\n /**\n * If the blob was soft deleted.\n */\n isBlobSoftDeleted: boolean;\n /**\n * Blob version.\n */\n newBlobVersion?: string;\n /**\n * Last version.\n */\n oldBlobVersion?: string;\n /**\n * Previous Access Tier\n */\n previousTier?: AccessTier;\n}\n\n/**\n * ChangeFeedEvent AsyncOperationInfo\n */\nexport interface BlobOperationResult {\n /**\n * Destination access tier.\n */\n destinationAccessTier?: AccessTier;\n /**\n * If the operation was async.\n */\n isAsync: boolean;\n /**\n * Copy Id.\n */\n copyId?: string;\n}\n\n/**\n * Blob tags that were updated as part of the change feed event.\n */\nexport interface BlobTagsChange {\n /**\n * Previous Tags.\n */\n oldTags: Record<string, string>;\n /**\n * New Tags.\n */\n newTags: Record<string, string>;\n}\n\n/**\n * Change feed Blob storage event data.\n */\nexport interface BlobChangeFeedEventData {\n /**\n * The operation that triggered the event.\n */\n api: string;\n\n /**\n * A client-provided request id for the storage API operation. This id can be used to\n * correlate to Azure Storage diagnostic logs using the \"client-request-id\" field in the logs,\n * and can be provided in client requests using the \"x-ms-client-request-id\" header.\n */\n clientRequestId: string; // GUID\n\n /**\n * Service-generated request id for the storage API operation. Can be used to correlate to Azure Storage\n * diagnostic logs using the \"request-id-header\" field in the logs and is returned from initiating API call\n * in the 'x-ms-request-id' header.\n */\n requestId: string; // GUID\n\n /**\n * The value that you can use to perform operations conditionally.\n */\n etag: string;\n\n /**\n * The content type specified for the blob.\n */\n contentType: string;\n\n /**\n * The size of the blob in bytes.\n */\n contentLength: number;\n\n /**\n * The offset in bytes of a write operation taken at the point where the event-triggering application completed\n * writing to the file.\n * Appears only for events triggered on blob storage accounts that have a hierarchical namespace.\n */\n contentOffset?: number;\n\n /**\n * The type of blob.\n */\n blobType: BlobType;\n\n /**\n * The path to the blob. If the client uses a Blob REST API, then the url has this structure:\n * <storage-account-name>.blob.core.windows.net/<container-name>/<file-name>.\n */\n url: string;\n\n /**\n * The url of the file that will exist after the operation completes. For example, if a file is renamed,\n * the destinationUrl property contains the url of the new file name.\n * Appears only for events triggered on blob storage accounts that have a hierarchical namespace.\n */\n destinationUrl?: string;\n\n /**\n * The url of the file that exists prior to the operation. For example, if a file is renamed, the sourceUrl\n * contains the url of the original file name prior to the rename operation.\n * Appears only for events triggered on blob storage accounts that have a hierarchical namespace.\n */\n sourceUrl?: string;\n\n /**\n * True to perform the operation on all child directories; otherwise False.\n * Appears only for events triggered on blob storage accounts that have a hierarchical namespace.\n */\n isRecursive?: boolean;\n\n /**\n * An opaque string value representing the logical sequence of events for any particular blob name.\n * Users can use standard string comparison to understand the relative sequence of two events on the same blob name.\n */\n sequencer: string;\n\n /**\n * Previous info for the blob.\n */\n previousInfo?: ChangeFeedEventPreviousInfo;\n\n /**\n * Blob properties that were updated during this event.\n */\n updatedBlobProperties?: UpdatedBlobProperties;\n\n /**\n * Blob tags that were updated during this event.\n */\n updatedBlobTags?: BlobTagsChange;\n\n /**\n * The Snapshot associated with the event.\n */\n snapshot?: string;\n\n /**\n * Version of the blob.\n */\n blobVersion?: string;\n\n /**\n * Version of the container the blob is in.\n */\n containerVersion?: string;\n\n /**\n * Access Tier of the blob.\n */\n blobAccessTier?: AccessTier;\n /**\n * AsyncOperationInfo\n */\n longRunningOperationInfo?: BlobOperationResult;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeFeedCursor.js","sourceRoot":"","sources":["../../../../src/models/ChangeFeedCursor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport interface ChangeFeedCursor {\n CursorVersion: number;\n // The host component of the container URL.\n UrlHost: string;\n EndTime?: string;\n CurrentSegmentCursor: SegmentCursor;\n}\n\nexport interface SegmentCursor {\n ShardCursors: ShardCursor[];\n CurrentShardPath: string;\n SegmentPath: string;\n}\n\nexport interface ShardCursor {\n CurrentChunkPath: string;\n BlockOffset: number;\n EventIndex: number;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/models/models.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { CommonOptions } from \"@azure/storage-blob\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\n\n/**\n * Options to configure {@link BlobChangeFeedClient.listChanges} operation.\n */\nexport interface BlobChangeFeedListChangesOptions extends CommonOptions {\n /**\n * An implementation of the `AbortSignalLike` interface to signal the request to cancel the operation.\n * For example, use the @azure/abort-controller to create an `AbortSignal`.\n */\n abortSignal?: AbortSignalLike;\n\n /**\n * Specify the start of the time range during which the change feed records will be fetched.\n * Note that for now the change feed client will round start time down to the nearest hour.\n */\n start?: Date;\n\n /**\n * Specify the end of the time range during which the change feed records will be fetched.\n * Note that for now the change feed client will round end time up to the nearest hour.\n */\n end?: Date;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAW,kBAAkB,CAAC;AAEtD,MAAM,CAAC,MAAM,0BAA0B,GAAW,iBAAiB,CAAC;AACpE,MAAM,CAAC,MAAM,6BAA6B,GAAW,oBAAoB,CAAC;AAC1E,MAAM,CAAC,MAAM,4BAA4B,GAAW,WAAW,CAAC;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAW,eAAe,CAAC;AAClE,MAAM,CAAC,MAAM,kCAAkC,GAAW,MAAM,CAAC;AAEjE,MAAM,CAAC,MAAM,yBAAyB,GAAW,IAAI,CAAC,CAAC,sCAAsC;AAC7F,MAAM,CAAC,MAAM,qCAAqC,GAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport const SDK_VERSION: string = \"12.0.0-preview.5\";\n\nexport const CHANGE_FEED_CONTAINER_NAME: string = \"$blobchangefeed\";\nexport const CHANGE_FEED_META_SEGMENT_PATH: string = \"meta/segments.json\";\nexport const CHANGE_FEED_STATUS_FINALIZED: string = \"Finalized\";\nexport const CHANGE_FEED_SEGMENT_PREFIX: string = \"idx/segments/\";\nexport const CHANGE_FEED_INITIALIZATION_SEGMENT: string = \"1601\";\n\nexport const CHANGE_FEED_MAX_PAGE_SIZE: number = 5000; // align with rest API list operations\nexport const CHANGE_FEED_CHUNK_BLOCK_DOWNLOAD_SIZE: number = 16 * 1024 * 1024;\n"]}
|