minio
Version:
S3 Compatible Cloud Storage client
168 lines (158 loc) • 5.39 kB
JavaScript
/*
* MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2015 MinIO, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as errors from './errors.ts'
import { parseXml, sanitizeETag, sanitizeObjectKey, toArray } from './internal/helper.ts'
// parse XML response for bucket notification
export function parseBucketNotification(xml) {
var result = {
TopicConfiguration: [],
QueueConfiguration: [],
CloudFunctionConfiguration: [],
}
// Parse the events list
var genEvents = function (events) {
var result = []
if (events) {
toArray(events).forEach((s3event) => {
result.push(s3event)
})
}
return result
}
// Parse all filter rules
var genFilterRules = function (filters) {
var result = []
if (filters) {
filters = toArray(filters)
if (filters[0].S3Key) {
filters[0].S3Key = toArray(filters[0].S3Key)
if (filters[0].S3Key[0].FilterRule) {
toArray(filters[0].S3Key[0].FilterRule).forEach((rule) => {
var Name = toArray(rule.Name)[0]
var Value = toArray(rule.Value)[0]
result.push({ Name, Value })
})
}
}
}
return result
}
var xmlobj = parseXml(xml)
xmlobj = xmlobj.NotificationConfiguration
// Parse all topic configurations in the xml
if (xmlobj.TopicConfiguration) {
toArray(xmlobj.TopicConfiguration).forEach((config) => {
var Id = toArray(config.Id)[0]
var Topic = toArray(config.Topic)[0]
var Event = genEvents(config.Event)
var Filter = genFilterRules(config.Filter)
result.TopicConfiguration.push({ Id, Topic, Event, Filter })
})
}
// Parse all topic configurations in the xml
if (xmlobj.QueueConfiguration) {
toArray(xmlobj.QueueConfiguration).forEach((config) => {
var Id = toArray(config.Id)[0]
var Queue = toArray(config.Queue)[0]
var Event = genEvents(config.Event)
var Filter = genFilterRules(config.Filter)
result.QueueConfiguration.push({ Id, Queue, Event, Filter })
})
}
// Parse all QueueConfiguration arrays
if (xmlobj.CloudFunctionConfiguration) {
toArray(xmlobj.CloudFunctionConfiguration).forEach((config) => {
var Id = toArray(config.Id)[0]
var CloudFunction = toArray(config.CloudFunction)[0]
var Event = genEvents(config.Event)
var Filter = genFilterRules(config.Filter)
result.CloudFunctionConfiguration.push({ Id, CloudFunction, Event, Filter })
})
}
return result
}
// parse XML response for list objects v2 in a bucket
export function parseListObjectsV2(xml) {
var result = {
objects: [],
isTruncated: false,
}
var xmlobj = parseXml(xml)
if (!xmlobj.ListBucketResult) {
throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"')
}
xmlobj = xmlobj.ListBucketResult
if (xmlobj.IsTruncated) {
result.isTruncated = xmlobj.IsTruncated
}
if (xmlobj.NextContinuationToken) {
result.nextContinuationToken = xmlobj.NextContinuationToken
}
if (xmlobj.Contents) {
toArray(xmlobj.Contents).forEach((content) => {
var name = sanitizeObjectKey(toArray(content.Key)[0])
var lastModified = new Date(content.LastModified)
var etag = sanitizeETag(content.ETag)
var size = content.Size
result.objects.push({ name, lastModified, etag, size })
})
}
if (xmlobj.CommonPrefixes) {
toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => {
result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 })
})
}
return result
}
// parse XML response for list objects v2 with metadata in a bucket
export function parseListObjectsV2WithMetadata(xml) {
var result = {
objects: [],
isTruncated: false,
}
var xmlobj = parseXml(xml)
if (!xmlobj.ListBucketResult) {
throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"')
}
xmlobj = xmlobj.ListBucketResult
if (xmlobj.IsTruncated) {
result.isTruncated = xmlobj.IsTruncated
}
if (xmlobj.NextContinuationToken) {
result.nextContinuationToken = xmlobj.NextContinuationToken
}
if (xmlobj.Contents) {
toArray(xmlobj.Contents).forEach((content) => {
var name = sanitizeObjectKey(content.Key)
var lastModified = new Date(content.LastModified)
var etag = sanitizeETag(content.ETag)
var size = content.Size
var metadata
if (content.UserMetadata != null) {
metadata = toArray(content.UserMetadata)[0]
} else {
metadata = null
}
result.objects.push({ name, lastModified, etag, size, metadata })
})
}
if (xmlobj.CommonPrefixes) {
toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => {
result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 })
})
}
return result
}