* Updated microsoft openjdk setup-java action * Update generated distribution * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Applied new fixes from npm run check * Update generated distribution --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
54324 lines
2.0 MiB
Plaintext
54324 lines
2.0 MiB
Plaintext
export const id = 295;
|
|
export const ids = [295];
|
|
export const modules = {
|
|
|
|
/***/ 8638:
|
|
/***/ ((module) => {
|
|
|
|
|
|
module.exports = balanced;
|
|
function balanced(a, b, str) {
|
|
if (a instanceof RegExp) a = maybeMatch(a, str);
|
|
if (b instanceof RegExp) b = maybeMatch(b, str);
|
|
|
|
var r = range(a, b, str);
|
|
|
|
return r && {
|
|
start: r[0],
|
|
end: r[1],
|
|
pre: str.slice(0, r[0]),
|
|
body: str.slice(r[0] + a.length, r[1]),
|
|
post: str.slice(r[1] + b.length)
|
|
};
|
|
}
|
|
|
|
function maybeMatch(reg, str) {
|
|
var m = str.match(reg);
|
|
return m ? m[0] : null;
|
|
}
|
|
|
|
balanced.range = range;
|
|
function range(a, b, str) {
|
|
var begs, beg, left, right, result;
|
|
var ai = str.indexOf(a);
|
|
var bi = str.indexOf(b, ai + 1);
|
|
var i = ai;
|
|
|
|
if (ai >= 0 && bi > 0) {
|
|
if(a===b) {
|
|
return [ai, bi];
|
|
}
|
|
begs = [];
|
|
left = str.length;
|
|
|
|
while (i >= 0 && !result) {
|
|
if (i == ai) {
|
|
begs.push(i);
|
|
ai = str.indexOf(a, i + 1);
|
|
} else if (begs.length == 1) {
|
|
result = [ begs.pop(), bi ];
|
|
} else {
|
|
beg = begs.pop();
|
|
if (beg < left) {
|
|
left = beg;
|
|
right = bi;
|
|
}
|
|
|
|
bi = str.indexOf(b, i + 1);
|
|
}
|
|
|
|
i = ai < bi && ai >= 0 ? ai : bi;
|
|
}
|
|
|
|
if (begs.length) {
|
|
result = [ left, right ];
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6533:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
var concatMap = __webpack_require__(7087);
|
|
var balanced = __webpack_require__(8638);
|
|
|
|
module.exports = expandTop;
|
|
|
|
var escSlash = '\0SLASH'+Math.random()+'\0';
|
|
var escOpen = '\0OPEN'+Math.random()+'\0';
|
|
var escClose = '\0CLOSE'+Math.random()+'\0';
|
|
var escComma = '\0COMMA'+Math.random()+'\0';
|
|
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
|
|
|
function numeric(str) {
|
|
return parseInt(str, 10) == str
|
|
? parseInt(str, 10)
|
|
: str.charCodeAt(0);
|
|
}
|
|
|
|
function escapeBraces(str) {
|
|
return str.split('\\\\').join(escSlash)
|
|
.split('\\{').join(escOpen)
|
|
.split('\\}').join(escClose)
|
|
.split('\\,').join(escComma)
|
|
.split('\\.').join(escPeriod);
|
|
}
|
|
|
|
function unescapeBraces(str) {
|
|
return str.split(escSlash).join('\\')
|
|
.split(escOpen).join('{')
|
|
.split(escClose).join('}')
|
|
.split(escComma).join(',')
|
|
.split(escPeriod).join('.');
|
|
}
|
|
|
|
|
|
// Basically just str.split(","), but handling cases
|
|
// where we have nested braced sections, which should be
|
|
// treated as individual members, like {a,{b,c},d}
|
|
function parseCommaParts(str) {
|
|
if (!str)
|
|
return [''];
|
|
|
|
var parts = [];
|
|
var m = balanced('{', '}', str);
|
|
|
|
if (!m)
|
|
return str.split(',');
|
|
|
|
var pre = m.pre;
|
|
var body = m.body;
|
|
var post = m.post;
|
|
var p = pre.split(',');
|
|
|
|
p[p.length-1] += '{' + body + '}';
|
|
var postParts = parseCommaParts(post);
|
|
if (post.length) {
|
|
p[p.length-1] += postParts.shift();
|
|
p.push.apply(p, postParts);
|
|
}
|
|
|
|
parts.push.apply(parts, p);
|
|
|
|
return parts;
|
|
}
|
|
|
|
function expandTop(str, options) {
|
|
if (!str)
|
|
return [];
|
|
|
|
options = options || {};
|
|
var max = options.max == null ? Infinity : options.max;
|
|
|
|
// I don't know why Bash 4.3 does this, but it does.
|
|
// Anything starting with {} will have the first two bytes preserved
|
|
// but *only* at the top level, so {},a}b will not expand to anything,
|
|
// but a{},b}c will be expanded to [a}c,abc].
|
|
// One could argue that this is a bug in Bash, but since the goal of
|
|
// this module is to match Bash's rules, we escape a leading {}
|
|
if (str.substr(0, 2) === '{}') {
|
|
str = '\\{\\}' + str.substr(2);
|
|
}
|
|
|
|
return expand(escapeBraces(str), max, true).map(unescapeBraces);
|
|
}
|
|
|
|
function identity(e) {
|
|
return e;
|
|
}
|
|
|
|
function embrace(str) {
|
|
return '{' + str + '}';
|
|
}
|
|
function isPadded(el) {
|
|
return /^-?0\d/.test(el);
|
|
}
|
|
|
|
function lte(i, y) {
|
|
return i <= y;
|
|
}
|
|
function gte(i, y) {
|
|
return i >= y;
|
|
}
|
|
|
|
function expand(str, max, isTop) {
|
|
var expansions = [];
|
|
|
|
// The `{a},b}` rewrite below restarts expansion on a rewritten string with
|
|
// the same `max` and `isTop = true`. Loop instead of recursing so a long run
|
|
// of non-expanding `{}` groups can't exhaust the call stack.
|
|
for (;;) {
|
|
var m = balanced('{', '}', str);
|
|
if (!m || /\$$/.test(m.pre)) return [str];
|
|
|
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
var isSequence = isNumericSequence || isAlphaSequence;
|
|
var isOptions = m.body.indexOf(',') >= 0;
|
|
if (!isSequence && !isOptions) {
|
|
// {a},b}
|
|
if (m.post.match(/,(?!,).*\}/)) {
|
|
str = m.pre + '{' + m.body + escClose + m.post;
|
|
isTop = true
|
|
continue
|
|
}
|
|
return [str];
|
|
}
|
|
|
|
var n;
|
|
if (isSequence) {
|
|
n = m.body.split(/\.\./);
|
|
} else {
|
|
n = parseCommaParts(m.body);
|
|
if (n.length === 1) {
|
|
// x{{a,b}}y ==> x{a}y x{b}y
|
|
n = expand(n[0], max, false).map(embrace);
|
|
if (n.length === 1) {
|
|
var post = m.post.length
|
|
? expand(m.post, max, false)
|
|
: [''];
|
|
return post.map(function(p) {
|
|
return m.pre + n[0] + p;
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// at this point, n is the parts, and we know it's not a comma set
|
|
// with a single entry.
|
|
|
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
|
var pre = m.pre;
|
|
var post = m.post.length
|
|
? expand(m.post, max, false)
|
|
: [''];
|
|
|
|
var N;
|
|
|
|
if (isSequence) {
|
|
var x = numeric(n[0]);
|
|
var y = numeric(n[1]);
|
|
var width = Math.max(n[0].length, n[1].length)
|
|
var incr = n.length == 3
|
|
? Math.max(Math.abs(numeric(n[2])), 1)
|
|
: 1;
|
|
var test = lte;
|
|
var reverse = y < x;
|
|
if (reverse) {
|
|
incr *= -1;
|
|
test = gte;
|
|
}
|
|
var pad = n.some(isPadded);
|
|
|
|
N = [];
|
|
|
|
for (var i = x; test(i, y) && N.length < max; i += incr) {
|
|
var c;
|
|
if (isAlphaSequence) {
|
|
c = String.fromCharCode(i);
|
|
if (c === '\\')
|
|
c = '';
|
|
} else {
|
|
c = String(i);
|
|
if (pad) {
|
|
var need = width - c.length;
|
|
if (need > 0) {
|
|
var z = new Array(need + 1).join('0');
|
|
if (i < 0)
|
|
c = '-' + z + c.slice(1);
|
|
else
|
|
c = z + c;
|
|
}
|
|
}
|
|
}
|
|
N.push(c);
|
|
}
|
|
} else {
|
|
N = concatMap(n, function(el) { return expand(el, max, false) });
|
|
}
|
|
|
|
for (var j = 0; j < N.length; j++) {
|
|
for (var k = 0; k < post.length && expansions.length < max; k++) {
|
|
var expansion = pre + N[j] + post[k];
|
|
if (!isTop || isSequence || expansion)
|
|
expansions.push(expansion);
|
|
}
|
|
}
|
|
|
|
return expansions;
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2593:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
module.exports = minimatch
|
|
minimatch.Minimatch = Minimatch
|
|
|
|
var path = (function () { try { return __webpack_require__(6928) } catch (e) {}}()) || {
|
|
sep: '/'
|
|
}
|
|
minimatch.sep = path.sep
|
|
|
|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
|
var expand = __webpack_require__(6533)
|
|
|
|
var plTypes = {
|
|
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
|
'?': { open: '(?:', close: ')?' },
|
|
'+': { open: '(?:', close: ')+' },
|
|
'*': { open: '(?:', close: ')*' },
|
|
'@': { open: '(?:', close: ')' }
|
|
}
|
|
|
|
// any single thing other than /
|
|
// don't need to escape / when using new RegExp()
|
|
var qmark = '[^/]'
|
|
|
|
// * => any number of characters
|
|
var star = qmark + '*?'
|
|
|
|
// ** when dots are allowed. Anything goes, except .. and .
|
|
// not (^ or / followed by one or two dots followed by $ or /),
|
|
// followed by anything, any number of times.
|
|
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
|
|
|
// not a ^ or / followed by a dot,
|
|
// followed by anything, any number of times.
|
|
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
|
|
|
// characters that need to be escaped in RegExp.
|
|
var reSpecials = charSet('().*{}+?[]^$\\!')
|
|
|
|
// "abc" -> { a:true, b:true, c:true }
|
|
function charSet (s) {
|
|
return s.split('').reduce(function (set, c) {
|
|
set[c] = true
|
|
return set
|
|
}, {})
|
|
}
|
|
|
|
// normalizes slashes.
|
|
var slashSplit = /\/+/
|
|
|
|
minimatch.filter = filter
|
|
function filter (pattern, options) {
|
|
options = options || {}
|
|
return function (p, i, list) {
|
|
return minimatch(p, pattern, options)
|
|
}
|
|
}
|
|
|
|
function ext (a, b) {
|
|
b = b || {}
|
|
var t = {}
|
|
Object.keys(a).forEach(function (k) {
|
|
t[k] = a[k]
|
|
})
|
|
Object.keys(b).forEach(function (k) {
|
|
t[k] = b[k]
|
|
})
|
|
return t
|
|
}
|
|
|
|
minimatch.defaults = function (def) {
|
|
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
|
return minimatch
|
|
}
|
|
|
|
var orig = minimatch
|
|
|
|
var m = function minimatch (p, pattern, options) {
|
|
return orig(p, pattern, ext(def, options))
|
|
}
|
|
|
|
m.Minimatch = function Minimatch (pattern, options) {
|
|
return new orig.Minimatch(pattern, ext(def, options))
|
|
}
|
|
m.Minimatch.defaults = function defaults (options) {
|
|
return orig.defaults(ext(def, options)).Minimatch
|
|
}
|
|
|
|
m.filter = function filter (pattern, options) {
|
|
return orig.filter(pattern, ext(def, options))
|
|
}
|
|
|
|
m.defaults = function defaults (options) {
|
|
return orig.defaults(ext(def, options))
|
|
}
|
|
|
|
m.makeRe = function makeRe (pattern, options) {
|
|
return orig.makeRe(pattern, ext(def, options))
|
|
}
|
|
|
|
m.braceExpand = function braceExpand (pattern, options) {
|
|
return orig.braceExpand(pattern, ext(def, options))
|
|
}
|
|
|
|
m.match = function (list, pattern, options) {
|
|
return orig.match(list, pattern, ext(def, options))
|
|
}
|
|
|
|
return m
|
|
}
|
|
|
|
Minimatch.defaults = function (def) {
|
|
return minimatch.defaults(def).Minimatch
|
|
}
|
|
|
|
function minimatch (p, pattern, options) {
|
|
assertValidPattern(pattern)
|
|
|
|
if (!options) options = {}
|
|
|
|
// shortcut: comments match nothing.
|
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
|
return false
|
|
}
|
|
|
|
return new Minimatch(pattern, options).match(p)
|
|
}
|
|
|
|
function Minimatch (pattern, options) {
|
|
if (!(this instanceof Minimatch)) {
|
|
return new Minimatch(pattern, options)
|
|
}
|
|
|
|
assertValidPattern(pattern)
|
|
|
|
if (!options) options = {}
|
|
|
|
pattern = pattern.trim()
|
|
|
|
// windows support: need to use /, not \
|
|
if (!options.allowWindowsEscape && path.sep !== '/') {
|
|
pattern = pattern.split(path.sep).join('/')
|
|
}
|
|
|
|
this.options = options
|
|
this.maxGlobstarRecursion = options.maxGlobstarRecursion !== undefined
|
|
? options.maxGlobstarRecursion : 200
|
|
this.set = []
|
|
this.pattern = pattern
|
|
this.regexp = null
|
|
this.negate = false
|
|
this.comment = false
|
|
this.empty = false
|
|
this.partial = !!options.partial
|
|
|
|
// make the set of regexps etc.
|
|
this.make()
|
|
}
|
|
|
|
Minimatch.prototype.debug = function () {}
|
|
|
|
Minimatch.prototype.make = make
|
|
function make () {
|
|
var pattern = this.pattern
|
|
var options = this.options
|
|
|
|
// empty patterns and comments match nothing.
|
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
|
this.comment = true
|
|
return
|
|
}
|
|
if (!pattern) {
|
|
this.empty = true
|
|
return
|
|
}
|
|
|
|
// step 1: figure out negation, etc.
|
|
this.parseNegate()
|
|
|
|
// step 2: expand braces
|
|
var set = this.globSet = this.braceExpand()
|
|
|
|
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
|
|
|
this.debug(this.pattern, set)
|
|
|
|
// step 3: now we have a set, so turn each one into a series of path-portion
|
|
// matching patterns.
|
|
// These will be regexps, except in the case of "**", which is
|
|
// set to the GLOBSTAR object for globstar behavior,
|
|
// and will not contain any / characters
|
|
set = this.globParts = set.map(function (s) {
|
|
return s.split(slashSplit)
|
|
})
|
|
|
|
this.debug(this.pattern, set)
|
|
|
|
// glob --> regexps
|
|
set = set.map(function (s, si, set) {
|
|
return s.map(this.parse, this)
|
|
}, this)
|
|
|
|
this.debug(this.pattern, set)
|
|
|
|
// filter out everything that didn't compile properly.
|
|
set = set.filter(function (s) {
|
|
return s.indexOf(false) === -1
|
|
})
|
|
|
|
this.debug(this.pattern, set)
|
|
|
|
this.set = set
|
|
}
|
|
|
|
Minimatch.prototype.parseNegate = parseNegate
|
|
function parseNegate () {
|
|
var pattern = this.pattern
|
|
var negate = false
|
|
var options = this.options
|
|
var negateOffset = 0
|
|
|
|
if (options.nonegate) return
|
|
|
|
for (var i = 0, l = pattern.length
|
|
; i < l && pattern.charAt(i) === '!'
|
|
; i++) {
|
|
negate = !negate
|
|
negateOffset++
|
|
}
|
|
|
|
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
|
this.negate = negate
|
|
}
|
|
|
|
// Brace expansion:
|
|
// a{b,c}d -> abd acd
|
|
// a{b,}c -> abc ac
|
|
// a{0..3}d -> a0d a1d a2d a3d
|
|
// a{b,c{d,e}f}g -> abg acdfg acefg
|
|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
|
//
|
|
// Invalid sets are not expanded.
|
|
// a{2..}b -> a{2..}b
|
|
// a{b}c -> a{b}c
|
|
minimatch.braceExpand = function (pattern, options) {
|
|
return braceExpand(pattern, options)
|
|
}
|
|
|
|
Minimatch.prototype.braceExpand = braceExpand
|
|
|
|
function braceExpand (pattern, options) {
|
|
if (!options) {
|
|
if (this instanceof Minimatch) {
|
|
options = this.options
|
|
} else {
|
|
options = {}
|
|
}
|
|
}
|
|
|
|
pattern = typeof pattern === 'undefined'
|
|
? this.pattern : pattern
|
|
|
|
assertValidPattern(pattern)
|
|
|
|
// Thanks to Yeting Li <https://github.com/yetingli> for
|
|
// improving this regexp to avoid a ReDOS vulnerability.
|
|
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
|
// shortcut. no need to expand.
|
|
return [pattern]
|
|
}
|
|
|
|
return expand(pattern)
|
|
}
|
|
|
|
var MAX_PATTERN_LENGTH = 1024 * 64
|
|
var assertValidPattern = function (pattern) {
|
|
if (typeof pattern !== 'string') {
|
|
throw new TypeError('invalid pattern')
|
|
}
|
|
|
|
if (pattern.length > MAX_PATTERN_LENGTH) {
|
|
throw new TypeError('pattern is too long')
|
|
}
|
|
}
|
|
|
|
// parse a component of the expanded set.
|
|
// At this point, no pattern may contain "/" in it
|
|
// so we're going to return a 2d array, where each entry is the full
|
|
// pattern, split on '/', and then turned into a regular expression.
|
|
// A regexp is made at the end which joins each array with an
|
|
// escaped /, and another full one which joins each regexp with |.
|
|
//
|
|
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
|
// when it is the *only* thing in a path portion. Otherwise, any series
|
|
// of * is equivalent to a single *. Globstar behavior is enabled by
|
|
// default, and can be disabled by setting options.noglobstar.
|
|
Minimatch.prototype.parse = parse
|
|
var SUBPARSE = {}
|
|
function parse (pattern, isSub) {
|
|
assertValidPattern(pattern)
|
|
|
|
var options = this.options
|
|
|
|
// shortcuts
|
|
if (pattern === '**') {
|
|
if (!options.noglobstar)
|
|
return GLOBSTAR
|
|
else
|
|
pattern = '*'
|
|
}
|
|
if (pattern === '') return ''
|
|
|
|
var re = ''
|
|
var hasMagic = !!options.nocase
|
|
var escaping = false
|
|
// ? => one single character
|
|
var patternListStack = []
|
|
var negativeLists = []
|
|
var stateChar
|
|
var inClass = false
|
|
var reClassStart = -1
|
|
var classStart = -1
|
|
// . and .. never match anything that doesn't start with .,
|
|
// even when options.dot is set.
|
|
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
|
// not (start or / followed by . or .. followed by / or end)
|
|
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
|
: '(?!\\.)'
|
|
var self = this
|
|
|
|
function clearStateChar () {
|
|
if (stateChar) {
|
|
// we had some state-tracking character
|
|
// that wasn't consumed by this pass.
|
|
switch (stateChar) {
|
|
case '*':
|
|
re += star
|
|
hasMagic = true
|
|
break
|
|
case '?':
|
|
re += qmark
|
|
hasMagic = true
|
|
break
|
|
default:
|
|
re += '\\' + stateChar
|
|
break
|
|
}
|
|
self.debug('clearStateChar %j %j', stateChar, re)
|
|
stateChar = false
|
|
}
|
|
}
|
|
|
|
for (var i = 0, len = pattern.length, c
|
|
; (i < len) && (c = pattern.charAt(i))
|
|
; i++) {
|
|
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
|
|
|
// skip over any that are escaped.
|
|
if (escaping && reSpecials[c]) {
|
|
re += '\\' + c
|
|
escaping = false
|
|
continue
|
|
}
|
|
|
|
switch (c) {
|
|
/* istanbul ignore next */
|
|
case '/': {
|
|
// completely not allowed, even escaped.
|
|
// Should already be path-split by now.
|
|
return false
|
|
}
|
|
|
|
case '\\':
|
|
clearStateChar()
|
|
escaping = true
|
|
continue
|
|
|
|
// the various stateChar values
|
|
// for the "extglob" stuff.
|
|
case '?':
|
|
case '*':
|
|
case '+':
|
|
case '@':
|
|
case '!':
|
|
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
|
|
|
// all of those are literals inside a class, except that
|
|
// the glob [!a] means [^a] in regexp
|
|
if (inClass) {
|
|
this.debug(' in class')
|
|
if (c === '!' && i === classStart + 1) c = '^'
|
|
re += c
|
|
continue
|
|
}
|
|
|
|
// coalesce consecutive non-globstar * characters
|
|
if (c === '*' && stateChar === '*') continue
|
|
|
|
// if we already have a stateChar, then it means
|
|
// that there was something like ** or +? in there.
|
|
// Handle the stateChar, then proceed with this one.
|
|
self.debug('call clearStateChar %j', stateChar)
|
|
clearStateChar()
|
|
stateChar = c
|
|
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
|
// just clear the statechar *now*, rather than even diving into
|
|
// the patternList stuff.
|
|
if (options.noext) clearStateChar()
|
|
continue
|
|
|
|
case '(':
|
|
if (inClass) {
|
|
re += '('
|
|
continue
|
|
}
|
|
|
|
if (!stateChar) {
|
|
re += '\\('
|
|
continue
|
|
}
|
|
|
|
patternListStack.push({
|
|
type: stateChar,
|
|
start: i - 1,
|
|
reStart: re.length,
|
|
open: plTypes[stateChar].open,
|
|
close: plTypes[stateChar].close
|
|
})
|
|
// negation is (?:(?!js)[^/]*)
|
|
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
|
this.debug('plType %j %j', stateChar, re)
|
|
stateChar = false
|
|
continue
|
|
|
|
case ')':
|
|
if (inClass || !patternListStack.length) {
|
|
re += '\\)'
|
|
continue
|
|
}
|
|
|
|
clearStateChar()
|
|
hasMagic = true
|
|
var pl = patternListStack.pop()
|
|
// negation is (?:(?!js)[^/]*)
|
|
// The others are (?:<pattern>)<type>
|
|
re += pl.close
|
|
if (pl.type === '!') {
|
|
negativeLists.push(pl)
|
|
}
|
|
pl.reEnd = re.length
|
|
continue
|
|
|
|
case '|':
|
|
if (inClass || !patternListStack.length || escaping) {
|
|
re += '\\|'
|
|
escaping = false
|
|
continue
|
|
}
|
|
|
|
clearStateChar()
|
|
re += '|'
|
|
continue
|
|
|
|
// these are mostly the same in regexp and glob
|
|
case '[':
|
|
// swallow any state-tracking char before the [
|
|
clearStateChar()
|
|
|
|
if (inClass) {
|
|
re += '\\' + c
|
|
continue
|
|
}
|
|
|
|
inClass = true
|
|
classStart = i
|
|
reClassStart = re.length
|
|
re += c
|
|
continue
|
|
|
|
case ']':
|
|
// a right bracket shall lose its special
|
|
// meaning and represent itself in
|
|
// a bracket expression if it occurs
|
|
// first in the list. -- POSIX.2 2.8.3.2
|
|
if (i === classStart + 1 || !inClass) {
|
|
re += '\\' + c
|
|
escaping = false
|
|
continue
|
|
}
|
|
|
|
// handle the case where we left a class open.
|
|
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
|
// split where the last [ was, make sure we don't have
|
|
// an invalid re. if so, re-walk the contents of the
|
|
// would-be class to re-translate any characters that
|
|
// were passed through as-is
|
|
// TODO: It would probably be faster to determine this
|
|
// without a try/catch and a new RegExp, but it's tricky
|
|
// to do safely. For now, this is safe and works.
|
|
var cs = pattern.substring(classStart + 1, i)
|
|
try {
|
|
RegExp('[' + cs + ']')
|
|
} catch (er) {
|
|
// not a valid class!
|
|
var sp = this.parse(cs, SUBPARSE)
|
|
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
|
hasMagic = hasMagic || sp[1]
|
|
inClass = false
|
|
continue
|
|
}
|
|
|
|
// finish up the class.
|
|
hasMagic = true
|
|
inClass = false
|
|
re += c
|
|
continue
|
|
|
|
default:
|
|
// swallow any state char that wasn't consumed
|
|
clearStateChar()
|
|
|
|
if (escaping) {
|
|
// no need
|
|
escaping = false
|
|
} else if (reSpecials[c]
|
|
&& !(c === '^' && inClass)) {
|
|
re += '\\'
|
|
}
|
|
|
|
re += c
|
|
|
|
} // switch
|
|
} // for
|
|
|
|
// handle the case where we left a class open.
|
|
// "[abc" is valid, equivalent to "\[abc"
|
|
if (inClass) {
|
|
// split where the last [ was, and escape it
|
|
// this is a huge pita. We now have to re-walk
|
|
// the contents of the would-be class to re-translate
|
|
// any characters that were passed through as-is
|
|
cs = pattern.substr(classStart + 1)
|
|
sp = this.parse(cs, SUBPARSE)
|
|
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
|
hasMagic = hasMagic || sp[1]
|
|
}
|
|
|
|
// handle the case where we had a +( thing at the *end*
|
|
// of the pattern.
|
|
// each pattern list stack adds 3 chars, and we need to go through
|
|
// and escape any | chars that were passed through as-is for the regexp.
|
|
// Go through and escape them, taking care not to double-escape any
|
|
// | chars that were already escaped.
|
|
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
|
var tail = re.slice(pl.reStart + pl.open.length)
|
|
this.debug('setting tail', re, pl)
|
|
// maybe some even number of \, then maybe 1 \, followed by a |
|
|
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
|
if (!$2) {
|
|
// the | isn't already escaped, so escape it.
|
|
$2 = '\\'
|
|
}
|
|
|
|
// need to escape all those slashes *again*, without escaping the
|
|
// one that we need for escaping the | character. As it works out,
|
|
// escaping an even number of slashes can be done by simply repeating
|
|
// it exactly after itself. That's why this trick works.
|
|
//
|
|
// I am sorry that you have to see this.
|
|
return $1 + $1 + $2 + '|'
|
|
})
|
|
|
|
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
|
var t = pl.type === '*' ? star
|
|
: pl.type === '?' ? qmark
|
|
: '\\' + pl.type
|
|
|
|
hasMagic = true
|
|
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
|
}
|
|
|
|
// handle trailing things that only matter at the very end.
|
|
clearStateChar()
|
|
if (escaping) {
|
|
// trailing \\
|
|
re += '\\\\'
|
|
}
|
|
|
|
// only need to apply the nodot start if the re starts with
|
|
// something that could conceivably capture a dot
|
|
var addPatternStart = false
|
|
switch (re.charAt(0)) {
|
|
case '[': case '.': case '(': addPatternStart = true
|
|
}
|
|
|
|
// Hack to work around lack of negative lookbehind in JS
|
|
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
|
// like 'a.xyz.yz' doesn't match. So, the first negative
|
|
// lookahead, has to look ALL the way ahead, to the end of
|
|
// the pattern.
|
|
for (var n = negativeLists.length - 1; n > -1; n--) {
|
|
var nl = negativeLists[n]
|
|
|
|
var nlBefore = re.slice(0, nl.reStart)
|
|
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
|
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
|
var nlAfter = re.slice(nl.reEnd)
|
|
|
|
nlLast += nlAfter
|
|
|
|
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
|
// mean that we should *not* include the ) in the bit that is considered
|
|
// "after" the negated section.
|
|
var openParensBefore = nlBefore.split('(').length - 1
|
|
var cleanAfter = nlAfter
|
|
for (i = 0; i < openParensBefore; i++) {
|
|
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
|
}
|
|
nlAfter = cleanAfter
|
|
|
|
var dollar = ''
|
|
if (nlAfter === '' && isSub !== SUBPARSE) {
|
|
dollar = '$'
|
|
}
|
|
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
|
re = newRe
|
|
}
|
|
|
|
// if the re is not "" at this point, then we need to make sure
|
|
// it doesn't match against an empty path part.
|
|
// Otherwise a/* will match a/, which it should not.
|
|
if (re !== '' && hasMagic) {
|
|
re = '(?=.)' + re
|
|
}
|
|
|
|
if (addPatternStart) {
|
|
re = patternStart + re
|
|
}
|
|
|
|
// parsing just a piece of a larger pattern.
|
|
if (isSub === SUBPARSE) {
|
|
return [re, hasMagic]
|
|
}
|
|
|
|
// skip the regexp for non-magical patterns
|
|
// unescape anything in it, though, so that it'll be
|
|
// an exact match against a file etc.
|
|
if (!hasMagic) {
|
|
return globUnescape(pattern)
|
|
}
|
|
|
|
var flags = options.nocase ? 'i' : ''
|
|
try {
|
|
var regExp = new RegExp('^' + re + '$', flags)
|
|
} catch (er) /* istanbul ignore next - should be impossible */ {
|
|
// If it was an invalid regular expression, then it can't match
|
|
// anything. This trick looks for a character after the end of
|
|
// the string, which is of course impossible, except in multi-line
|
|
// mode, but it's not a /m regex.
|
|
return new RegExp('$.')
|
|
}
|
|
|
|
regExp._glob = pattern
|
|
regExp._src = re
|
|
|
|
return regExp
|
|
}
|
|
|
|
minimatch.makeRe = function (pattern, options) {
|
|
return new Minimatch(pattern, options || {}).makeRe()
|
|
}
|
|
|
|
Minimatch.prototype.makeRe = makeRe
|
|
function makeRe () {
|
|
if (this.regexp || this.regexp === false) return this.regexp
|
|
|
|
// at this point, this.set is a 2d array of partial
|
|
// pattern strings, or "**".
|
|
//
|
|
// It's better to use .match(). This function shouldn't
|
|
// be used, really, but it's pretty convenient sometimes,
|
|
// when you just want to work with a regex.
|
|
var set = this.set
|
|
|
|
if (!set.length) {
|
|
this.regexp = false
|
|
return this.regexp
|
|
}
|
|
var options = this.options
|
|
|
|
var twoStar = options.noglobstar ? star
|
|
: options.dot ? twoStarDot
|
|
: twoStarNoDot
|
|
var flags = options.nocase ? 'i' : ''
|
|
|
|
var re = set.map(function (pattern) {
|
|
return pattern.map(function (p) {
|
|
return (p === GLOBSTAR) ? twoStar
|
|
: (typeof p === 'string') ? regExpEscape(p)
|
|
: p._src
|
|
}).join('\\\/')
|
|
}).join('|')
|
|
|
|
// must match entire pattern
|
|
// ending in a * or ** will make it less strict.
|
|
re = '^(?:' + re + ')$'
|
|
|
|
// can match anything, as long as it's not this.
|
|
if (this.negate) re = '^(?!' + re + ').*$'
|
|
|
|
try {
|
|
this.regexp = new RegExp(re, flags)
|
|
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
|
this.regexp = false
|
|
}
|
|
return this.regexp
|
|
}
|
|
|
|
minimatch.match = function (list, pattern, options) {
|
|
options = options || {}
|
|
var mm = new Minimatch(pattern, options)
|
|
list = list.filter(function (f) {
|
|
return mm.match(f)
|
|
})
|
|
if (mm.options.nonull && !list.length) {
|
|
list.push(pattern)
|
|
}
|
|
return list
|
|
}
|
|
|
|
Minimatch.prototype.match = function match (f, partial) {
|
|
if (typeof partial === 'undefined') partial = this.partial
|
|
this.debug('match', f, this.pattern)
|
|
// short-circuit in the case of busted things.
|
|
// comments, etc.
|
|
if (this.comment) return false
|
|
if (this.empty) return f === ''
|
|
|
|
if (f === '/' && partial) return true
|
|
|
|
var options = this.options
|
|
|
|
// windows: need to use /, not \
|
|
if (path.sep !== '/') {
|
|
f = f.split(path.sep).join('/')
|
|
}
|
|
|
|
// treat the test path as a set of pathparts.
|
|
f = f.split(slashSplit)
|
|
this.debug(this.pattern, 'split', f)
|
|
|
|
// just ONE of the pattern sets in this.set needs to match
|
|
// in order for it to be valid. If negating, then just one
|
|
// match means that we have failed.
|
|
// Either way, return on the first hit.
|
|
|
|
var set = this.set
|
|
this.debug(this.pattern, 'set', set)
|
|
|
|
// Find the basename of the path by looking for the last non-empty segment
|
|
var filename
|
|
var i
|
|
for (i = f.length - 1; i >= 0; i--) {
|
|
filename = f[i]
|
|
if (filename) break
|
|
}
|
|
|
|
for (i = 0; i < set.length; i++) {
|
|
var pattern = set[i]
|
|
var file = f
|
|
if (options.matchBase && pattern.length === 1) {
|
|
file = [filename]
|
|
}
|
|
var hit = this.matchOne(file, pattern, partial)
|
|
if (hit) {
|
|
if (options.flipNegate) return true
|
|
return !this.negate
|
|
}
|
|
}
|
|
|
|
// didn't get any hits. this is success if it's a negative
|
|
// pattern, failure otherwise.
|
|
if (options.flipNegate) return false
|
|
return this.negate
|
|
}
|
|
|
|
// set partial to true to test if, for example,
|
|
// "/a/b" matches the start of "/*/b/*/d"
|
|
// Partial means, if you run out of file before you run
|
|
// out of pattern, then that's fine, as long as all
|
|
// the parts match.
|
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
|
if (pattern.indexOf(GLOBSTAR) !== -1) {
|
|
return this._matchGlobstar(file, pattern, partial, 0, 0)
|
|
}
|
|
return this._matchOne(file, pattern, partial, 0, 0)
|
|
}
|
|
|
|
Minimatch.prototype._matchGlobstar = function (file, pattern, partial, fileIndex, patternIndex) {
|
|
var i
|
|
|
|
// find first globstar from patternIndex
|
|
var firstgs = -1
|
|
for (i = patternIndex; i < pattern.length; i++) {
|
|
if (pattern[i] === GLOBSTAR) { firstgs = i; break }
|
|
}
|
|
|
|
// find last globstar
|
|
var lastgs = -1
|
|
for (i = pattern.length - 1; i >= 0; i--) {
|
|
if (pattern[i] === GLOBSTAR) { lastgs = i; break }
|
|
}
|
|
|
|
var head = pattern.slice(patternIndex, firstgs)
|
|
var body = partial ? pattern.slice(firstgs + 1) : pattern.slice(firstgs + 1, lastgs)
|
|
var tail = partial ? [] : pattern.slice(lastgs + 1)
|
|
|
|
// check the head
|
|
if (head.length) {
|
|
var fileHead = file.slice(fileIndex, fileIndex + head.length)
|
|
if (!this._matchOne(fileHead, head, partial, 0, 0)) {
|
|
return false
|
|
}
|
|
fileIndex += head.length
|
|
}
|
|
|
|
// check the tail
|
|
var fileTailMatch = 0
|
|
if (tail.length) {
|
|
if (tail.length + fileIndex > file.length) return false
|
|
|
|
var tailStart = file.length - tail.length
|
|
if (this._matchOne(file, tail, partial, tailStart, 0)) {
|
|
fileTailMatch = tail.length
|
|
} else {
|
|
// affordance for stuff like a/**/* matching a/b/
|
|
if (file[file.length - 1] !== '' ||
|
|
fileIndex + tail.length === file.length) {
|
|
return false
|
|
}
|
|
tailStart--
|
|
if (!this._matchOne(file, tail, partial, tailStart, 0)) {
|
|
return false
|
|
}
|
|
fileTailMatch = tail.length + 1
|
|
}
|
|
}
|
|
|
|
// if body is empty (single ** between head and tail)
|
|
if (!body.length) {
|
|
var sawSome = !!fileTailMatch
|
|
for (i = fileIndex; i < file.length - fileTailMatch; i++) {
|
|
var f = String(file[i])
|
|
sawSome = true
|
|
if (f === '.' || f === '..' ||
|
|
(!this.options.dot && f.charAt(0) === '.')) {
|
|
return false
|
|
}
|
|
}
|
|
return partial || sawSome
|
|
}
|
|
|
|
// split body into segments at each GLOBSTAR
|
|
var bodySegments = [[[], 0]]
|
|
var currentBody = bodySegments[0]
|
|
var nonGsParts = 0
|
|
var nonGsPartsSums = [0]
|
|
for (var bi = 0; bi < body.length; bi++) {
|
|
var b = body[bi]
|
|
if (b === GLOBSTAR) {
|
|
nonGsPartsSums.push(nonGsParts)
|
|
currentBody = [[], 0]
|
|
bodySegments.push(currentBody)
|
|
} else {
|
|
currentBody[0].push(b)
|
|
nonGsParts++
|
|
}
|
|
}
|
|
|
|
var idx = bodySegments.length - 1
|
|
var fileLength = file.length - fileTailMatch
|
|
for (var si = 0; si < bodySegments.length; si++) {
|
|
bodySegments[si][1] = fileLength -
|
|
(nonGsPartsSums[idx--] + bodySegments[si][0].length)
|
|
}
|
|
|
|
return !!this._matchGlobStarBodySections(
|
|
file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch
|
|
)
|
|
}
|
|
|
|
// return false for "nope, not matching"
|
|
// return null for "not matching, cannot keep trying"
|
|
Minimatch.prototype._matchGlobStarBodySections = function (
|
|
file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail
|
|
) {
|
|
var bs = bodySegments[bodyIndex]
|
|
if (!bs) {
|
|
// just make sure there are no bad dots
|
|
for (var i = fileIndex; i < file.length; i++) {
|
|
sawTail = true
|
|
var f = file[i]
|
|
if (f === '.' || f === '..' ||
|
|
(!this.options.dot && f.charAt(0) === '.')) {
|
|
return false
|
|
}
|
|
}
|
|
return sawTail
|
|
}
|
|
|
|
var body = bs[0]
|
|
var after = bs[1]
|
|
while (fileIndex <= after) {
|
|
var m = this._matchOne(
|
|
file.slice(0, fileIndex + body.length),
|
|
body,
|
|
partial,
|
|
fileIndex,
|
|
0
|
|
)
|
|
// if limit exceeded, no match. intentional false negative,
|
|
// acceptable break in correctness for security.
|
|
if (m && globStarDepth < this.maxGlobstarRecursion) {
|
|
var sub = this._matchGlobStarBodySections(
|
|
file, bodySegments,
|
|
fileIndex + body.length, bodyIndex + 1,
|
|
partial, globStarDepth + 1, sawTail
|
|
)
|
|
if (sub !== false) {
|
|
return sub
|
|
}
|
|
}
|
|
var f = file[fileIndex]
|
|
if (f === '.' || f === '..' ||
|
|
(!this.options.dot && f.charAt(0) === '.')) {
|
|
return false
|
|
}
|
|
fileIndex++
|
|
}
|
|
return partial || null
|
|
}
|
|
|
|
Minimatch.prototype._matchOne = function (file, pattern, partial, fileIndex, patternIndex) {
|
|
var fi, pi, fl, pl
|
|
for (
|
|
fi = fileIndex, pi = patternIndex, fl = file.length, pl = pattern.length
|
|
; (fi < fl) && (pi < pl)
|
|
; fi++, pi++
|
|
) {
|
|
this.debug('matchOne loop')
|
|
var p = pattern[pi]
|
|
var f = file[fi]
|
|
|
|
this.debug(pattern, p, f)
|
|
|
|
// should be impossible.
|
|
// some invalid regexp stuff in the set.
|
|
/* istanbul ignore if */
|
|
if (p === false || p === GLOBSTAR) return false
|
|
|
|
// something other than **
|
|
// non-magic patterns just have to match exactly
|
|
// patterns with magic have been turned into regexps.
|
|
var hit
|
|
if (typeof p === 'string') {
|
|
hit = f === p
|
|
this.debug('string match', p, f, hit)
|
|
} else {
|
|
hit = f.match(p)
|
|
this.debug('pattern match', p, f, hit)
|
|
}
|
|
|
|
if (!hit) return false
|
|
}
|
|
|
|
// now either we fell off the end of the pattern, or we're done.
|
|
if (fi === fl && pi === pl) {
|
|
// ran out of pattern and filename at the same time.
|
|
// an exact hit!
|
|
return true
|
|
} else if (fi === fl) {
|
|
// ran out of file, but still had pattern left.
|
|
// this is ok if we're doing the match as part of
|
|
// a glob fs traversal.
|
|
return partial
|
|
} else /* istanbul ignore else */ if (pi === pl) {
|
|
// ran out of pattern, still have file left.
|
|
// this is only acceptable if we're on the very last
|
|
// empty segment of a file with a trailing slash.
|
|
// a/* should match a/b/
|
|
return (fi === fl - 1) && (file[fi] === '')
|
|
}
|
|
|
|
// should be unreachable.
|
|
/* istanbul ignore next */
|
|
throw new Error('wtf?')
|
|
}
|
|
|
|
// replace stuff like \* with *
|
|
function globUnescape (s) {
|
|
return s.replace(/\\(.)/g, '$1')
|
|
}
|
|
|
|
function regExpEscape (s) {
|
|
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7889:
|
|
/***/ (function(__unused_webpack_module, exports) {
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ClientStreamingCall = void 0;
|
|
/**
|
|
* A client streaming RPC call. This means that the clients sends 0, 1, or
|
|
* more messages to the server, and the server replies with exactly one
|
|
* message.
|
|
*/
|
|
class ClientStreamingCall {
|
|
constructor(method, requestHeaders, request, headers, response, status, trailers) {
|
|
this.method = method;
|
|
this.requestHeaders = requestHeaders;
|
|
this.requests = request;
|
|
this.headers = headers;
|
|
this.response = response;
|
|
this.status = status;
|
|
this.trailers = trailers;
|
|
}
|
|
/**
|
|
* Instead of awaiting the response status and trailers, you can
|
|
* just as well await this call itself to receive the server outcome.
|
|
* Note that it may still be valid to send more request messages.
|
|
*/
|
|
then(onfulfilled, onrejected) {
|
|
return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
|
|
}
|
|
promiseFinished() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
|
|
return {
|
|
method: this.method,
|
|
requestHeaders: this.requestHeaders,
|
|
headers,
|
|
response,
|
|
status,
|
|
trailers
|
|
};
|
|
});
|
|
}
|
|
}
|
|
exports.ClientStreamingCall = ClientStreamingCall;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 1409:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.Deferred = exports.DeferredState = void 0;
|
|
var DeferredState;
|
|
(function (DeferredState) {
|
|
DeferredState[DeferredState["PENDING"] = 0] = "PENDING";
|
|
DeferredState[DeferredState["REJECTED"] = 1] = "REJECTED";
|
|
DeferredState[DeferredState["RESOLVED"] = 2] = "RESOLVED";
|
|
})(DeferredState = exports.DeferredState || (exports.DeferredState = {}));
|
|
/**
|
|
* A deferred promise. This is a "controller" for a promise, which lets you
|
|
* pass a promise around and reject or resolve it from the outside.
|
|
*
|
|
* Warning: This class is to be used with care. Using it can make code very
|
|
* difficult to read. It is intended for use in library code that exposes
|
|
* promises, not for regular business logic.
|
|
*/
|
|
class Deferred {
|
|
/**
|
|
* @param preventUnhandledRejectionWarning - prevents the warning
|
|
* "Unhandled Promise rejection" by adding a noop rejection handler.
|
|
* Working with calls returned from the runtime-rpc package in an
|
|
* async function usually means awaiting one call property after
|
|
* the other. This means that the "status" is not being awaited when
|
|
* an earlier await for the "headers" is rejected. This causes the
|
|
* "unhandled promise reject" warning. A more correct behaviour for
|
|
* calls might be to become aware whether at least one of the
|
|
* promises is handled and swallow the rejection warning for the
|
|
* others.
|
|
*/
|
|
constructor(preventUnhandledRejectionWarning = true) {
|
|
this._state = DeferredState.PENDING;
|
|
this._promise = new Promise((resolve, reject) => {
|
|
this._resolve = resolve;
|
|
this._reject = reject;
|
|
});
|
|
if (preventUnhandledRejectionWarning) {
|
|
this._promise.catch(_ => { });
|
|
}
|
|
}
|
|
/**
|
|
* Get the current state of the promise.
|
|
*/
|
|
get state() {
|
|
return this._state;
|
|
}
|
|
/**
|
|
* Get the deferred promise.
|
|
*/
|
|
get promise() {
|
|
return this._promise;
|
|
}
|
|
/**
|
|
* Resolve the promise. Throws if the promise is already resolved or rejected.
|
|
*/
|
|
resolve(value) {
|
|
if (this.state !== DeferredState.PENDING)
|
|
throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`);
|
|
this._resolve(value);
|
|
this._state = DeferredState.RESOLVED;
|
|
}
|
|
/**
|
|
* Reject the promise. Throws if the promise is already resolved or rejected.
|
|
*/
|
|
reject(reason) {
|
|
if (this.state !== DeferredState.PENDING)
|
|
throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`);
|
|
this._reject(reason);
|
|
this._state = DeferredState.REJECTED;
|
|
}
|
|
/**
|
|
* Resolve the promise. Ignore if not pending.
|
|
*/
|
|
resolvePending(val) {
|
|
if (this._state === DeferredState.PENDING)
|
|
this.resolve(val);
|
|
}
|
|
/**
|
|
* Reject the promise. Ignore if not pending.
|
|
*/
|
|
rejectPending(reason) {
|
|
if (this._state === DeferredState.PENDING)
|
|
this.reject(reason);
|
|
}
|
|
}
|
|
exports.Deferred = Deferred;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6826:
|
|
/***/ (function(__unused_webpack_module, exports) {
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.DuplexStreamingCall = void 0;
|
|
/**
|
|
* A duplex streaming RPC call. This means that the clients sends an
|
|
* arbitrary amount of messages to the server, while at the same time,
|
|
* the server sends an arbitrary amount of messages to the client.
|
|
*/
|
|
class DuplexStreamingCall {
|
|
constructor(method, requestHeaders, request, headers, response, status, trailers) {
|
|
this.method = method;
|
|
this.requestHeaders = requestHeaders;
|
|
this.requests = request;
|
|
this.headers = headers;
|
|
this.responses = response;
|
|
this.status = status;
|
|
this.trailers = trailers;
|
|
}
|
|
/**
|
|
* Instead of awaiting the response status and trailers, you can
|
|
* just as well await this call itself to receive the server outcome.
|
|
* Note that it may still be valid to send more request messages.
|
|
*/
|
|
then(onfulfilled, onrejected) {
|
|
return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
|
|
}
|
|
promiseFinished() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
|
|
return {
|
|
method: this.method,
|
|
requestHeaders: this.requestHeaders,
|
|
headers,
|
|
status,
|
|
trailers,
|
|
};
|
|
});
|
|
}
|
|
}
|
|
exports.DuplexStreamingCall = DuplexStreamingCall;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4420:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
var __webpack_unused_export__;
|
|
|
|
// Public API of the rpc runtime.
|
|
// Note: we do not use `export * from ...` to help tree shakers,
|
|
// webpack verbose output hints that this should be useful
|
|
__webpack_unused_export__ = ({ value: true });
|
|
var service_type_1 = __webpack_require__(6892);
|
|
Object.defineProperty(exports, "C0", ({ enumerable: true, get: function () { return service_type_1.ServiceType; } }));
|
|
var reflection_info_1 = __webpack_require__(2496);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return reflection_info_1.readMethodOptions; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return reflection_info_1.readMethodOption; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return reflection_info_1.readServiceOption; } });
|
|
var rpc_error_1 = __webpack_require__(8636);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_error_1.RpcError; } });
|
|
var rpc_options_1 = __webpack_require__(8576);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_options_1.mergeRpcOptions; } });
|
|
var rpc_output_stream_1 = __webpack_require__(2726);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_output_stream_1.RpcOutputStreamController; } });
|
|
var test_transport_1 = __webpack_require__(9122);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return test_transport_1.TestTransport; } });
|
|
var deferred_1 = __webpack_require__(1409);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return deferred_1.Deferred; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return deferred_1.DeferredState; } });
|
|
var duplex_streaming_call_1 = __webpack_require__(6826);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return duplex_streaming_call_1.DuplexStreamingCall; } });
|
|
var client_streaming_call_1 = __webpack_require__(7889);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return client_streaming_call_1.ClientStreamingCall; } });
|
|
var server_streaming_call_1 = __webpack_require__(6173);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return server_streaming_call_1.ServerStreamingCall; } });
|
|
var unary_call_1 = __webpack_require__(9288);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return unary_call_1.UnaryCall; } });
|
|
var rpc_interceptor_1 = __webpack_require__(2849);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_interceptor_1.stackIntercept; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_interceptor_1.stackDuplexStreamingInterceptors; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_interceptor_1.stackClientStreamingInterceptors; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_interceptor_1.stackServerStreamingInterceptors; } });
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return rpc_interceptor_1.stackUnaryInterceptors; } });
|
|
var server_call_context_1 = __webpack_require__(3352);
|
|
__webpack_unused_export__ = ({ enumerable: true, get: function () { return server_call_context_1.ServerCallContextController; } });
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2496:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.readServiceOption = exports.readMethodOption = exports.readMethodOptions = exports.normalizeMethodInfo = void 0;
|
|
const runtime_1 = __webpack_require__(8886);
|
|
/**
|
|
* Turns PartialMethodInfo into MethodInfo.
|
|
*/
|
|
function normalizeMethodInfo(method, service) {
|
|
var _a, _b, _c;
|
|
let m = method;
|
|
m.service = service;
|
|
m.localName = (_a = m.localName) !== null && _a !== void 0 ? _a : runtime_1.lowerCamelCase(m.name);
|
|
// noinspection PointlessBooleanExpressionJS
|
|
m.serverStreaming = !!m.serverStreaming;
|
|
// noinspection PointlessBooleanExpressionJS
|
|
m.clientStreaming = !!m.clientStreaming;
|
|
m.options = (_b = m.options) !== null && _b !== void 0 ? _b : {};
|
|
m.idempotency = (_c = m.idempotency) !== null && _c !== void 0 ? _c : undefined;
|
|
return m;
|
|
}
|
|
exports.normalizeMethodInfo = normalizeMethodInfo;
|
|
/**
|
|
* Read custom method options from a generated service client.
|
|
*
|
|
* @deprecated use readMethodOption()
|
|
*/
|
|
function readMethodOptions(service, methodName, extensionName, extensionType) {
|
|
var _a;
|
|
const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
|
|
return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
|
|
}
|
|
exports.readMethodOptions = readMethodOptions;
|
|
function readMethodOption(service, methodName, extensionName, extensionType) {
|
|
var _a;
|
|
const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === void 0 ? void 0 : _a.options;
|
|
if (!options) {
|
|
return undefined;
|
|
}
|
|
const optionVal = options[extensionName];
|
|
if (optionVal === undefined) {
|
|
return optionVal;
|
|
}
|
|
return extensionType ? extensionType.fromJson(optionVal) : optionVal;
|
|
}
|
|
exports.readMethodOption = readMethodOption;
|
|
function readServiceOption(service, extensionName, extensionType) {
|
|
const options = service.options;
|
|
if (!options) {
|
|
return undefined;
|
|
}
|
|
const optionVal = options[extensionName];
|
|
if (optionVal === undefined) {
|
|
return optionVal;
|
|
}
|
|
return extensionType ? extensionType.fromJson(optionVal) : optionVal;
|
|
}
|
|
exports.readServiceOption = readServiceOption;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8636:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.RpcError = void 0;
|
|
/**
|
|
* An error that occurred while calling a RPC method.
|
|
*/
|
|
class RpcError extends Error {
|
|
constructor(message, code = 'UNKNOWN', meta) {
|
|
super(message);
|
|
this.name = 'RpcError';
|
|
// see https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example
|
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
this.code = code;
|
|
this.meta = meta !== null && meta !== void 0 ? meta : {};
|
|
}
|
|
toString() {
|
|
const l = [this.name + ': ' + this.message];
|
|
if (this.code) {
|
|
l.push('');
|
|
l.push('Code: ' + this.code);
|
|
}
|
|
if (this.serviceName && this.methodName) {
|
|
l.push('Method: ' + this.serviceName + '/' + this.methodName);
|
|
}
|
|
let m = Object.entries(this.meta);
|
|
if (m.length) {
|
|
l.push('');
|
|
l.push('Meta:');
|
|
for (let [k, v] of m) {
|
|
l.push(` ${k}: ${v}`);
|
|
}
|
|
}
|
|
return l.join('\n');
|
|
}
|
|
}
|
|
exports.RpcError = RpcError;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2849:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.stackDuplexStreamingInterceptors = exports.stackClientStreamingInterceptors = exports.stackServerStreamingInterceptors = exports.stackUnaryInterceptors = exports.stackIntercept = void 0;
|
|
const runtime_1 = __webpack_require__(8886);
|
|
/**
|
|
* Creates a "stack" of of all interceptors specified in the given `RpcOptions`.
|
|
* Used by generated client implementations.
|
|
* @internal
|
|
*/
|
|
function stackIntercept(kind, transport, method, options, input) {
|
|
var _a, _b, _c, _d;
|
|
if (kind == "unary") {
|
|
let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt);
|
|
for (const curr of ((_a = options.interceptors) !== null && _a !== void 0 ? _a : []).filter(i => i.interceptUnary).reverse()) {
|
|
const next = tail;
|
|
tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt);
|
|
}
|
|
return tail(method, input, options);
|
|
}
|
|
if (kind == "serverStreaming") {
|
|
let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt);
|
|
for (const curr of ((_b = options.interceptors) !== null && _b !== void 0 ? _b : []).filter(i => i.interceptServerStreaming).reverse()) {
|
|
const next = tail;
|
|
tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt);
|
|
}
|
|
return tail(method, input, options);
|
|
}
|
|
if (kind == "clientStreaming") {
|
|
let tail = (mtd, opt) => transport.clientStreaming(mtd, opt);
|
|
for (const curr of ((_c = options.interceptors) !== null && _c !== void 0 ? _c : []).filter(i => i.interceptClientStreaming).reverse()) {
|
|
const next = tail;
|
|
tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt);
|
|
}
|
|
return tail(method, options);
|
|
}
|
|
if (kind == "duplex") {
|
|
let tail = (mtd, opt) => transport.duplex(mtd, opt);
|
|
for (const curr of ((_d = options.interceptors) !== null && _d !== void 0 ? _d : []).filter(i => i.interceptDuplex).reverse()) {
|
|
const next = tail;
|
|
tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt);
|
|
}
|
|
return tail(method, options);
|
|
}
|
|
runtime_1.assertNever(kind);
|
|
}
|
|
exports.stackIntercept = stackIntercept;
|
|
/**
|
|
* @deprecated replaced by `stackIntercept()`, still here to support older generated code
|
|
*/
|
|
function stackUnaryInterceptors(transport, method, input, options) {
|
|
return stackIntercept("unary", transport, method, options, input);
|
|
}
|
|
exports.stackUnaryInterceptors = stackUnaryInterceptors;
|
|
/**
|
|
* @deprecated replaced by `stackIntercept()`, still here to support older generated code
|
|
*/
|
|
function stackServerStreamingInterceptors(transport, method, input, options) {
|
|
return stackIntercept("serverStreaming", transport, method, options, input);
|
|
}
|
|
exports.stackServerStreamingInterceptors = stackServerStreamingInterceptors;
|
|
/**
|
|
* @deprecated replaced by `stackIntercept()`, still here to support older generated code
|
|
*/
|
|
function stackClientStreamingInterceptors(transport, method, options) {
|
|
return stackIntercept("clientStreaming", transport, method, options);
|
|
}
|
|
exports.stackClientStreamingInterceptors = stackClientStreamingInterceptors;
|
|
/**
|
|
* @deprecated replaced by `stackIntercept()`, still here to support older generated code
|
|
*/
|
|
function stackDuplexStreamingInterceptors(transport, method, options) {
|
|
return stackIntercept("duplex", transport, method, options);
|
|
}
|
|
exports.stackDuplexStreamingInterceptors = stackDuplexStreamingInterceptors;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8576:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.mergeRpcOptions = void 0;
|
|
const runtime_1 = __webpack_require__(8886);
|
|
/**
|
|
* Merges custom RPC options with defaults. Returns a new instance and keeps
|
|
* the "defaults" and the "options" unmodified.
|
|
*
|
|
* Merges `RpcMetadata` "meta", overwriting values from "defaults" with
|
|
* values from "options". Does not append values to existing entries.
|
|
*
|
|
* Merges "jsonOptions", including "jsonOptions.typeRegistry", by creating
|
|
* a new array that contains types from "options.jsonOptions.typeRegistry"
|
|
* first, then types from "defaults.jsonOptions.typeRegistry".
|
|
*
|
|
* Merges "binaryOptions".
|
|
*
|
|
* Merges "interceptors" by creating a new array that contains interceptors
|
|
* from "defaults" first, then interceptors from "options".
|
|
*
|
|
* Works with objects that extend `RpcOptions`, but only if the added
|
|
* properties are of type Date, primitive like string, boolean, or Array
|
|
* of primitives. If you have other property types, you have to merge them
|
|
* yourself.
|
|
*/
|
|
function mergeRpcOptions(defaults, options) {
|
|
if (!options)
|
|
return defaults;
|
|
let o = {};
|
|
copy(defaults, o);
|
|
copy(options, o);
|
|
for (let key of Object.keys(options)) {
|
|
let val = options[key];
|
|
switch (key) {
|
|
case "jsonOptions":
|
|
o.jsonOptions = runtime_1.mergeJsonOptions(defaults.jsonOptions, o.jsonOptions);
|
|
break;
|
|
case "binaryOptions":
|
|
o.binaryOptions = runtime_1.mergeBinaryOptions(defaults.binaryOptions, o.binaryOptions);
|
|
break;
|
|
case "meta":
|
|
o.meta = {};
|
|
copy(defaults.meta, o.meta);
|
|
copy(options.meta, o.meta);
|
|
break;
|
|
case "interceptors":
|
|
o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val) : val.concat();
|
|
break;
|
|
}
|
|
}
|
|
return o;
|
|
}
|
|
exports.mergeRpcOptions = mergeRpcOptions;
|
|
function copy(a, into) {
|
|
if (!a)
|
|
return;
|
|
let c = into;
|
|
for (let [k, v] of Object.entries(a)) {
|
|
if (v instanceof Date)
|
|
c[k] = new Date(v.getTime());
|
|
else if (Array.isArray(v))
|
|
c[k] = v.concat();
|
|
else
|
|
c[k] = v;
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2726:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.RpcOutputStreamController = void 0;
|
|
const deferred_1 = __webpack_require__(1409);
|
|
const runtime_1 = __webpack_require__(8886);
|
|
/**
|
|
* A `RpcOutputStream` that you control.
|
|
*/
|
|
class RpcOutputStreamController {
|
|
constructor() {
|
|
this._lis = {
|
|
nxt: [],
|
|
msg: [],
|
|
err: [],
|
|
cmp: [],
|
|
};
|
|
this._closed = false;
|
|
// --- RpcOutputStream async iterator API
|
|
// iterator state.
|
|
// is undefined when no iterator has been acquired yet.
|
|
this._itState = { q: [] };
|
|
}
|
|
// --- RpcOutputStream callback API
|
|
onNext(callback) {
|
|
return this.addLis(callback, this._lis.nxt);
|
|
}
|
|
onMessage(callback) {
|
|
return this.addLis(callback, this._lis.msg);
|
|
}
|
|
onError(callback) {
|
|
return this.addLis(callback, this._lis.err);
|
|
}
|
|
onComplete(callback) {
|
|
return this.addLis(callback, this._lis.cmp);
|
|
}
|
|
addLis(callback, list) {
|
|
list.push(callback);
|
|
return () => {
|
|
let i = list.indexOf(callback);
|
|
if (i >= 0)
|
|
list.splice(i, 1);
|
|
};
|
|
}
|
|
// remove all listeners
|
|
clearLis() {
|
|
for (let l of Object.values(this._lis))
|
|
l.splice(0, l.length);
|
|
}
|
|
// --- Controller API
|
|
/**
|
|
* Is this stream already closed by a completion or error?
|
|
*/
|
|
get closed() {
|
|
return this._closed !== false;
|
|
}
|
|
/**
|
|
* Emit message, close with error, or close successfully, but only one
|
|
* at a time.
|
|
* Can be used to wrap a stream by using the other stream's `onNext`.
|
|
*/
|
|
notifyNext(message, error, complete) {
|
|
runtime_1.assert((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, 'only one emission at a time');
|
|
if (message)
|
|
this.notifyMessage(message);
|
|
if (error)
|
|
this.notifyError(error);
|
|
if (complete)
|
|
this.notifyComplete();
|
|
}
|
|
/**
|
|
* Emits a new message. Throws if stream is closed.
|
|
*
|
|
* Triggers onNext and onMessage callbacks.
|
|
*/
|
|
notifyMessage(message) {
|
|
runtime_1.assert(!this.closed, 'stream is closed');
|
|
this.pushIt({ value: message, done: false });
|
|
this._lis.msg.forEach(l => l(message));
|
|
this._lis.nxt.forEach(l => l(message, undefined, false));
|
|
}
|
|
/**
|
|
* Closes the stream with an error. Throws if stream is closed.
|
|
*
|
|
* Triggers onNext and onError callbacks.
|
|
*/
|
|
notifyError(error) {
|
|
runtime_1.assert(!this.closed, 'stream is closed');
|
|
this._closed = error;
|
|
this.pushIt(error);
|
|
this._lis.err.forEach(l => l(error));
|
|
this._lis.nxt.forEach(l => l(undefined, error, false));
|
|
this.clearLis();
|
|
}
|
|
/**
|
|
* Closes the stream successfully. Throws if stream is closed.
|
|
*
|
|
* Triggers onNext and onComplete callbacks.
|
|
*/
|
|
notifyComplete() {
|
|
runtime_1.assert(!this.closed, 'stream is closed');
|
|
this._closed = true;
|
|
this.pushIt({ value: null, done: true });
|
|
this._lis.cmp.forEach(l => l());
|
|
this._lis.nxt.forEach(l => l(undefined, undefined, true));
|
|
this.clearLis();
|
|
}
|
|
/**
|
|
* Creates an async iterator (that can be used with `for await {...}`)
|
|
* to consume the stream.
|
|
*
|
|
* Some things to note:
|
|
* - If an error occurs, the `for await` will throw it.
|
|
* - If an error occurred before the `for await` was started, `for await`
|
|
* will re-throw it.
|
|
* - If the stream is already complete, the `for await` will be empty.
|
|
* - If your `for await` consumes slower than the stream produces,
|
|
* for example because you are relaying messages in a slow operation,
|
|
* messages are queued.
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
// if we are closed, we are definitely not receiving any more messages.
|
|
// but we can't let the iterator get stuck. we want to either:
|
|
// a) finish the new iterator immediately, because we are completed
|
|
// b) reject the new iterator, because we errored
|
|
if (this._closed === true)
|
|
this.pushIt({ value: null, done: true });
|
|
else if (this._closed !== false)
|
|
this.pushIt(this._closed);
|
|
// the async iterator
|
|
return {
|
|
next: () => {
|
|
let state = this._itState;
|
|
runtime_1.assert(state, "bad state"); // if we don't have a state here, code is broken
|
|
// there should be no pending result.
|
|
// did the consumer call next() before we resolved our previous result promise?
|
|
runtime_1.assert(!state.p, "iterator contract broken");
|
|
// did we produce faster than the iterator consumed?
|
|
// return the oldest result from the queue.
|
|
let first = state.q.shift();
|
|
if (first)
|
|
return ("value" in first) ? Promise.resolve(first) : Promise.reject(first);
|
|
// we have no result ATM, but we promise one.
|
|
// as soon as we have a result, we must resolve promise.
|
|
state.p = new deferred_1.Deferred();
|
|
return state.p.promise;
|
|
},
|
|
};
|
|
}
|
|
// "push" a new iterator result.
|
|
// this either resolves a pending promise, or enqueues the result.
|
|
pushIt(result) {
|
|
let state = this._itState;
|
|
// is the consumer waiting for us?
|
|
if (state.p) {
|
|
// yes, consumer is waiting for this promise.
|
|
const p = state.p;
|
|
runtime_1.assert(p.state == deferred_1.DeferredState.PENDING, "iterator contract broken");
|
|
// resolve the promise
|
|
("value" in result) ? p.resolve(result) : p.reject(result);
|
|
// must cleanup, otherwise iterator.next() would pick it up again.
|
|
delete state.p;
|
|
}
|
|
else {
|
|
// we are producing faster than the iterator consumes.
|
|
// push result onto queue.
|
|
state.q.push(result);
|
|
}
|
|
}
|
|
}
|
|
exports.RpcOutputStreamController = RpcOutputStreamController;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3352:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ServerCallContextController = void 0;
|
|
class ServerCallContextController {
|
|
constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: 'OK', detail: '' }) {
|
|
this._cancelled = false;
|
|
this._listeners = [];
|
|
this.method = method;
|
|
this.headers = headers;
|
|
this.deadline = deadline;
|
|
this.trailers = {};
|
|
this._sendRH = sendResponseHeadersFn;
|
|
this.status = defaultStatus;
|
|
}
|
|
/**
|
|
* Set the call cancelled.
|
|
*
|
|
* Invokes all callbacks registered with onCancel() and
|
|
* sets `cancelled = true`.
|
|
*/
|
|
notifyCancelled() {
|
|
if (!this._cancelled) {
|
|
this._cancelled = true;
|
|
for (let l of this._listeners) {
|
|
l();
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Send response headers.
|
|
*/
|
|
sendResponseHeaders(data) {
|
|
this._sendRH(data);
|
|
}
|
|
/**
|
|
* Is the call cancelled?
|
|
*
|
|
* When the client closes the connection before the server
|
|
* is done, the call is cancelled.
|
|
*
|
|
* If you want to cancel a request on the server, throw a
|
|
* RpcError with the CANCELLED status code.
|
|
*/
|
|
get cancelled() {
|
|
return this._cancelled;
|
|
}
|
|
/**
|
|
* Add a callback for cancellation.
|
|
*/
|
|
onCancel(callback) {
|
|
const l = this._listeners;
|
|
l.push(callback);
|
|
return () => {
|
|
let i = l.indexOf(callback);
|
|
if (i >= 0)
|
|
l.splice(i, 1);
|
|
};
|
|
}
|
|
}
|
|
exports.ServerCallContextController = ServerCallContextController;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6173:
|
|
/***/ (function(__unused_webpack_module, exports) {
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ServerStreamingCall = void 0;
|
|
/**
|
|
* A server streaming RPC call. The client provides exactly one input message
|
|
* but the server may respond with 0, 1, or more messages.
|
|
*/
|
|
class ServerStreamingCall {
|
|
constructor(method, requestHeaders, request, headers, response, status, trailers) {
|
|
this.method = method;
|
|
this.requestHeaders = requestHeaders;
|
|
this.request = request;
|
|
this.headers = headers;
|
|
this.responses = response;
|
|
this.status = status;
|
|
this.trailers = trailers;
|
|
}
|
|
/**
|
|
* Instead of awaiting the response status and trailers, you can
|
|
* just as well await this call itself to receive the server outcome.
|
|
* You should first setup some listeners to the `request` to
|
|
* see the actual messages the server replied with.
|
|
*/
|
|
then(onfulfilled, onrejected) {
|
|
return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
|
|
}
|
|
promiseFinished() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]);
|
|
return {
|
|
method: this.method,
|
|
requestHeaders: this.requestHeaders,
|
|
request: this.request,
|
|
headers,
|
|
status,
|
|
trailers,
|
|
};
|
|
});
|
|
}
|
|
}
|
|
exports.ServerStreamingCall = ServerStreamingCall;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6892:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ServiceType = void 0;
|
|
const reflection_info_1 = __webpack_require__(2496);
|
|
class ServiceType {
|
|
constructor(typeName, methods, options) {
|
|
this.typeName = typeName;
|
|
this.methods = methods.map(i => reflection_info_1.normalizeMethodInfo(i, this));
|
|
this.options = options !== null && options !== void 0 ? options : {};
|
|
}
|
|
}
|
|
exports.ServiceType = ServiceType;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9122:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.TestTransport = void 0;
|
|
const rpc_error_1 = __webpack_require__(8636);
|
|
const runtime_1 = __webpack_require__(8886);
|
|
const rpc_output_stream_1 = __webpack_require__(2726);
|
|
const rpc_options_1 = __webpack_require__(8576);
|
|
const unary_call_1 = __webpack_require__(9288);
|
|
const server_streaming_call_1 = __webpack_require__(6173);
|
|
const client_streaming_call_1 = __webpack_require__(7889);
|
|
const duplex_streaming_call_1 = __webpack_require__(6826);
|
|
/**
|
|
* Transport for testing.
|
|
*/
|
|
class TestTransport {
|
|
/**
|
|
* Initialize with mock data. Omitted fields have default value.
|
|
*/
|
|
constructor(data) {
|
|
/**
|
|
* Suppress warning / error about uncaught rejections of
|
|
* "status" and "trailers".
|
|
*/
|
|
this.suppressUncaughtRejections = true;
|
|
this.headerDelay = 10;
|
|
this.responseDelay = 50;
|
|
this.betweenResponseDelay = 10;
|
|
this.afterResponseDelay = 10;
|
|
this.data = data !== null && data !== void 0 ? data : {};
|
|
}
|
|
/**
|
|
* Sent message(s) during the last operation.
|
|
*/
|
|
get sentMessages() {
|
|
if (this.lastInput instanceof TestInputStream) {
|
|
return this.lastInput.sent;
|
|
}
|
|
else if (typeof this.lastInput == "object") {
|
|
return [this.lastInput.single];
|
|
}
|
|
return [];
|
|
}
|
|
/**
|
|
* Sending message(s) completed?
|
|
*/
|
|
get sendComplete() {
|
|
if (this.lastInput instanceof TestInputStream) {
|
|
return this.lastInput.completed;
|
|
}
|
|
else if (typeof this.lastInput == "object") {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
// Creates a promise for response headers from the mock data.
|
|
promiseHeaders() {
|
|
var _a;
|
|
const headers = (_a = this.data.headers) !== null && _a !== void 0 ? _a : TestTransport.defaultHeaders;
|
|
return headers instanceof rpc_error_1.RpcError
|
|
? Promise.reject(headers)
|
|
: Promise.resolve(headers);
|
|
}
|
|
// Creates a promise for a single, valid, message from the mock data.
|
|
promiseSingleResponse(method) {
|
|
if (this.data.response instanceof rpc_error_1.RpcError) {
|
|
return Promise.reject(this.data.response);
|
|
}
|
|
let r;
|
|
if (Array.isArray(this.data.response)) {
|
|
runtime_1.assert(this.data.response.length > 0);
|
|
r = this.data.response[0];
|
|
}
|
|
else if (this.data.response !== undefined) {
|
|
r = this.data.response;
|
|
}
|
|
else {
|
|
r = method.O.create();
|
|
}
|
|
runtime_1.assert(method.O.is(r));
|
|
return Promise.resolve(r);
|
|
}
|
|
/**
|
|
* Pushes response messages from the mock data to the output stream.
|
|
* If an error response, status or trailers are mocked, the stream is
|
|
* closed with the respective error.
|
|
* Otherwise, stream is completed successfully.
|
|
*
|
|
* The returned promise resolves when the stream is closed. It should
|
|
* not reject. If it does, code is broken.
|
|
*/
|
|
streamResponses(method, stream, abort) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
// normalize "data.response" into an array of valid output messages
|
|
const messages = [];
|
|
if (this.data.response === undefined) {
|
|
messages.push(method.O.create());
|
|
}
|
|
else if (Array.isArray(this.data.response)) {
|
|
for (let msg of this.data.response) {
|
|
runtime_1.assert(method.O.is(msg));
|
|
messages.push(msg);
|
|
}
|
|
}
|
|
else if (!(this.data.response instanceof rpc_error_1.RpcError)) {
|
|
runtime_1.assert(method.O.is(this.data.response));
|
|
messages.push(this.data.response);
|
|
}
|
|
// start the stream with an initial delay.
|
|
// if the request is cancelled, notify() error and exit.
|
|
try {
|
|
yield delay(this.responseDelay, abort)(undefined);
|
|
}
|
|
catch (error) {
|
|
stream.notifyError(error);
|
|
return;
|
|
}
|
|
// if error response was mocked, notify() error (stream is now closed with error) and exit.
|
|
if (this.data.response instanceof rpc_error_1.RpcError) {
|
|
stream.notifyError(this.data.response);
|
|
return;
|
|
}
|
|
// regular response messages were mocked. notify() them.
|
|
for (let msg of messages) {
|
|
stream.notifyMessage(msg);
|
|
// add a short delay between responses
|
|
// if the request is cancelled, notify() error and exit.
|
|
try {
|
|
yield delay(this.betweenResponseDelay, abort)(undefined);
|
|
}
|
|
catch (error) {
|
|
stream.notifyError(error);
|
|
return;
|
|
}
|
|
}
|
|
// error status was mocked, notify() error (stream is now closed with error) and exit.
|
|
if (this.data.status instanceof rpc_error_1.RpcError) {
|
|
stream.notifyError(this.data.status);
|
|
return;
|
|
}
|
|
// error trailers were mocked, notify() error (stream is now closed with error) and exit.
|
|
if (this.data.trailers instanceof rpc_error_1.RpcError) {
|
|
stream.notifyError(this.data.trailers);
|
|
return;
|
|
}
|
|
// stream completed successfully
|
|
stream.notifyComplete();
|
|
});
|
|
}
|
|
// Creates a promise for response status from the mock data.
|
|
promiseStatus() {
|
|
var _a;
|
|
const status = (_a = this.data.status) !== null && _a !== void 0 ? _a : TestTransport.defaultStatus;
|
|
return status instanceof rpc_error_1.RpcError
|
|
? Promise.reject(status)
|
|
: Promise.resolve(status);
|
|
}
|
|
// Creates a promise for response trailers from the mock data.
|
|
promiseTrailers() {
|
|
var _a;
|
|
const trailers = (_a = this.data.trailers) !== null && _a !== void 0 ? _a : TestTransport.defaultTrailers;
|
|
return trailers instanceof rpc_error_1.RpcError
|
|
? Promise.reject(trailers)
|
|
: Promise.resolve(trailers);
|
|
}
|
|
maybeSuppressUncaught(...promise) {
|
|
if (this.suppressUncaughtRejections) {
|
|
for (let p of promise) {
|
|
p.catch(() => {
|
|
});
|
|
}
|
|
}
|
|
}
|
|
mergeOptions(options) {
|
|
return rpc_options_1.mergeRpcOptions({}, options);
|
|
}
|
|
unary(method, input, options) {
|
|
var _a;
|
|
const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
|
|
.then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.responseDelay, options.abort))
|
|
.then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.afterResponseDelay, options.abort))
|
|
.then(_ => this.promiseStatus()), trailersPromise = responsePromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.afterResponseDelay, options.abort))
|
|
.then(_ => this.promiseTrailers());
|
|
this.maybeSuppressUncaught(statusPromise, trailersPromise);
|
|
this.lastInput = { single: input };
|
|
return new unary_call_1.UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise);
|
|
}
|
|
serverStreaming(method, input, options) {
|
|
var _a;
|
|
const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
|
|
.then(delay(this.headerDelay, options.abort)), outputStream = new rpc_output_stream_1.RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
|
|
.then(delay(this.responseDelay, options.abort))
|
|
.catch(() => {
|
|
})
|
|
.then(() => this.streamResponses(method, outputStream, options.abort))
|
|
.then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
|
|
.then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
|
|
.then(() => this.promiseTrailers());
|
|
this.maybeSuppressUncaught(statusPromise, trailersPromise);
|
|
this.lastInput = { single: input };
|
|
return new server_streaming_call_1.ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise);
|
|
}
|
|
clientStreaming(method, options) {
|
|
var _a;
|
|
const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
|
|
.then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.responseDelay, options.abort))
|
|
.then(_ => this.promiseSingleResponse(method)), statusPromise = responsePromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.afterResponseDelay, options.abort))
|
|
.then(_ => this.promiseStatus()), trailersPromise = responsePromise
|
|
.catch(_ => {
|
|
})
|
|
.then(delay(this.afterResponseDelay, options.abort))
|
|
.then(_ => this.promiseTrailers());
|
|
this.maybeSuppressUncaught(statusPromise, trailersPromise);
|
|
this.lastInput = new TestInputStream(this.data, options.abort);
|
|
return new client_streaming_call_1.ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise);
|
|
}
|
|
duplex(method, options) {
|
|
var _a;
|
|
const requestHeaders = (_a = options.meta) !== null && _a !== void 0 ? _a : {}, headersPromise = this.promiseHeaders()
|
|
.then(delay(this.headerDelay, options.abort)), outputStream = new rpc_output_stream_1.RpcOutputStreamController(), responseStreamClosedPromise = headersPromise
|
|
.then(delay(this.responseDelay, options.abort))
|
|
.catch(() => {
|
|
})
|
|
.then(() => this.streamResponses(method, outputStream, options.abort))
|
|
.then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise
|
|
.then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise
|
|
.then(() => this.promiseTrailers());
|
|
this.maybeSuppressUncaught(statusPromise, trailersPromise);
|
|
this.lastInput = new TestInputStream(this.data, options.abort);
|
|
return new duplex_streaming_call_1.DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise);
|
|
}
|
|
}
|
|
exports.TestTransport = TestTransport;
|
|
TestTransport.defaultHeaders = {
|
|
responseHeader: "test"
|
|
};
|
|
TestTransport.defaultStatus = {
|
|
code: "OK", detail: "all good"
|
|
};
|
|
TestTransport.defaultTrailers = {
|
|
responseTrailer: "test"
|
|
};
|
|
function delay(ms, abort) {
|
|
return (v) => new Promise((resolve, reject) => {
|
|
if (abort === null || abort === void 0 ? void 0 : abort.aborted) {
|
|
reject(new rpc_error_1.RpcError("user cancel", "CANCELLED"));
|
|
}
|
|
else {
|
|
const id = setTimeout(() => resolve(v), ms);
|
|
if (abort) {
|
|
abort.addEventListener("abort", ev => {
|
|
clearTimeout(id);
|
|
reject(new rpc_error_1.RpcError("user cancel", "CANCELLED"));
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
class TestInputStream {
|
|
constructor(data, abort) {
|
|
this._completed = false;
|
|
this._sent = [];
|
|
this.data = data;
|
|
this.abort = abort;
|
|
}
|
|
get sent() {
|
|
return this._sent;
|
|
}
|
|
get completed() {
|
|
return this._completed;
|
|
}
|
|
send(message) {
|
|
if (this.data.inputMessage instanceof rpc_error_1.RpcError) {
|
|
return Promise.reject(this.data.inputMessage);
|
|
}
|
|
const delayMs = this.data.inputMessage === undefined
|
|
? 10
|
|
: this.data.inputMessage;
|
|
return Promise.resolve(undefined)
|
|
.then(() => {
|
|
this._sent.push(message);
|
|
})
|
|
.then(delay(delayMs, this.abort));
|
|
}
|
|
complete() {
|
|
if (this.data.inputComplete instanceof rpc_error_1.RpcError) {
|
|
return Promise.reject(this.data.inputComplete);
|
|
}
|
|
const delayMs = this.data.inputComplete === undefined
|
|
? 10
|
|
: this.data.inputComplete;
|
|
return Promise.resolve(undefined)
|
|
.then(() => {
|
|
this._completed = true;
|
|
})
|
|
.then(delay(delayMs, this.abort));
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9288:
|
|
/***/ (function(__unused_webpack_module, exports) {
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.UnaryCall = void 0;
|
|
/**
|
|
* A unary RPC call. Unary means there is exactly one input message and
|
|
* exactly one output message unless an error occurred.
|
|
*/
|
|
class UnaryCall {
|
|
constructor(method, requestHeaders, request, headers, response, status, trailers) {
|
|
this.method = method;
|
|
this.requestHeaders = requestHeaders;
|
|
this.request = request;
|
|
this.headers = headers;
|
|
this.response = response;
|
|
this.status = status;
|
|
this.trailers = trailers;
|
|
}
|
|
/**
|
|
* If you are only interested in the final outcome of this call,
|
|
* you can await it to receive a `FinishedUnaryCall`.
|
|
*/
|
|
then(onfulfilled, onrejected) {
|
|
return this.promiseFinished().then(value => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, reason => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason));
|
|
}
|
|
promiseFinished() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]);
|
|
return {
|
|
method: this.method,
|
|
requestHeaders: this.requestHeaders,
|
|
request: this.request,
|
|
headers,
|
|
response,
|
|
status,
|
|
trailers
|
|
};
|
|
});
|
|
}
|
|
}
|
|
exports.UnaryCall = UnaryCall;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8602:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.assertFloat32 = exports.assertUInt32 = exports.assertInt32 = exports.assertNever = exports.assert = void 0;
|
|
/**
|
|
* assert that condition is true or throw error (with message)
|
|
*/
|
|
function assert(condition, msg) {
|
|
if (!condition) {
|
|
throw new Error(msg);
|
|
}
|
|
}
|
|
exports.assert = assert;
|
|
/**
|
|
* assert that value cannot exist = type `never`. throw runtime error if it does.
|
|
*/
|
|
function assertNever(value, msg) {
|
|
throw new Error(msg !== null && msg !== void 0 ? msg : 'Unexpected object: ' + value);
|
|
}
|
|
exports.assertNever = assertNever;
|
|
const FLOAT32_MAX = 3.4028234663852886e+38, FLOAT32_MIN = -3.4028234663852886e+38, UINT32_MAX = 0xFFFFFFFF, INT32_MAX = 0X7FFFFFFF, INT32_MIN = -0X80000000;
|
|
function assertInt32(arg) {
|
|
if (typeof arg !== "number")
|
|
throw new Error('invalid int 32: ' + typeof arg);
|
|
if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
|
|
throw new Error('invalid int 32: ' + arg);
|
|
}
|
|
exports.assertInt32 = assertInt32;
|
|
function assertUInt32(arg) {
|
|
if (typeof arg !== "number")
|
|
throw new Error('invalid uint 32: ' + typeof arg);
|
|
if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
|
|
throw new Error('invalid uint 32: ' + arg);
|
|
}
|
|
exports.assertUInt32 = assertUInt32;
|
|
function assertFloat32(arg) {
|
|
if (typeof arg !== "number")
|
|
throw new Error('invalid float 32: ' + typeof arg);
|
|
if (!Number.isFinite(arg))
|
|
return;
|
|
if (arg > FLOAT32_MAX || arg < FLOAT32_MIN)
|
|
throw new Error('invalid float 32: ' + arg);
|
|
}
|
|
exports.assertFloat32 = assertFloat32;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6335:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.base64encode = exports.base64decode = void 0;
|
|
// lookup table from base64 character to byte
|
|
let encTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
|
// lookup table from base64 character *code* to byte because lookup by number is fast
|
|
let decTable = [];
|
|
for (let i = 0; i < encTable.length; i++)
|
|
decTable[encTable[i].charCodeAt(0)] = i;
|
|
// support base64url variants
|
|
decTable["-".charCodeAt(0)] = encTable.indexOf("+");
|
|
decTable["_".charCodeAt(0)] = encTable.indexOf("/");
|
|
/**
|
|
* Decodes a base64 string to a byte array.
|
|
*
|
|
* - ignores white-space, including line breaks and tabs
|
|
* - allows inner padding (can decode concatenated base64 strings)
|
|
* - does not require padding
|
|
* - understands base64url encoding:
|
|
* "-" instead of "+",
|
|
* "_" instead of "/",
|
|
* no padding
|
|
*/
|
|
function base64decode(base64Str) {
|
|
// estimate byte size, not accounting for inner padding and whitespace
|
|
let es = base64Str.length * 3 / 4;
|
|
// if (es % 3 !== 0)
|
|
// throw new Error('invalid base64 string');
|
|
if (base64Str[base64Str.length - 2] == '=')
|
|
es -= 2;
|
|
else if (base64Str[base64Str.length - 1] == '=')
|
|
es -= 1;
|
|
let bytes = new Uint8Array(es), bytePos = 0, // position in byte array
|
|
groupPos = 0, // position in base64 group
|
|
b, // current byte
|
|
p = 0 // previous byte
|
|
;
|
|
for (let i = 0; i < base64Str.length; i++) {
|
|
b = decTable[base64Str.charCodeAt(i)];
|
|
if (b === undefined) {
|
|
// noinspection FallThroughInSwitchStatementJS
|
|
switch (base64Str[i]) {
|
|
case '=':
|
|
groupPos = 0; // reset state when padding found
|
|
case '\n':
|
|
case '\r':
|
|
case '\t':
|
|
case ' ':
|
|
continue; // skip white-space, and padding
|
|
default:
|
|
throw Error(`invalid base64 string.`);
|
|
}
|
|
}
|
|
switch (groupPos) {
|
|
case 0:
|
|
p = b;
|
|
groupPos = 1;
|
|
break;
|
|
case 1:
|
|
bytes[bytePos++] = p << 2 | (b & 48) >> 4;
|
|
p = b;
|
|
groupPos = 2;
|
|
break;
|
|
case 2:
|
|
bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;
|
|
p = b;
|
|
groupPos = 3;
|
|
break;
|
|
case 3:
|
|
bytes[bytePos++] = (p & 3) << 6 | b;
|
|
groupPos = 0;
|
|
break;
|
|
}
|
|
}
|
|
if (groupPos == 1)
|
|
throw Error(`invalid base64 string.`);
|
|
return bytes.subarray(0, bytePos);
|
|
}
|
|
exports.base64decode = base64decode;
|
|
/**
|
|
* Encodes a byte array to a base64 string.
|
|
* Adds padding at the end.
|
|
* Does not insert newlines.
|
|
*/
|
|
function base64encode(bytes) {
|
|
let base64 = '', groupPos = 0, // position in base64 group
|
|
b, // current byte
|
|
p = 0; // carry over from previous byte
|
|
for (let i = 0; i < bytes.length; i++) {
|
|
b = bytes[i];
|
|
switch (groupPos) {
|
|
case 0:
|
|
base64 += encTable[b >> 2];
|
|
p = (b & 3) << 4;
|
|
groupPos = 1;
|
|
break;
|
|
case 1:
|
|
base64 += encTable[p | b >> 4];
|
|
p = (b & 15) << 2;
|
|
groupPos = 2;
|
|
break;
|
|
case 2:
|
|
base64 += encTable[p | b >> 6];
|
|
base64 += encTable[b & 63];
|
|
groupPos = 0;
|
|
break;
|
|
}
|
|
}
|
|
// padding required?
|
|
if (groupPos) {
|
|
base64 += encTable[p];
|
|
base64 += '=';
|
|
if (groupPos == 1)
|
|
base64 += '=';
|
|
}
|
|
return base64;
|
|
}
|
|
exports.base64encode = base64encode;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4816:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.WireType = exports.mergeBinaryOptions = exports.UnknownFieldHandler = void 0;
|
|
/**
|
|
* This handler implements the default behaviour for unknown fields.
|
|
* When reading data, unknown fields are stored on the message, in a
|
|
* symbol property.
|
|
* When writing data, the symbol property is queried and unknown fields
|
|
* are serialized into the output again.
|
|
*/
|
|
var UnknownFieldHandler;
|
|
(function (UnknownFieldHandler) {
|
|
/**
|
|
* The symbol used to store unknown fields for a message.
|
|
* The property must conform to `UnknownFieldContainer`.
|
|
*/
|
|
UnknownFieldHandler.symbol = Symbol.for("protobuf-ts/unknown");
|
|
/**
|
|
* Store an unknown field during binary read directly on the message.
|
|
* This method is compatible with `BinaryReadOptions.readUnknownField`.
|
|
*/
|
|
UnknownFieldHandler.onRead = (typeName, message, fieldNo, wireType, data) => {
|
|
let container = is(message) ? message[UnknownFieldHandler.symbol] : message[UnknownFieldHandler.symbol] = [];
|
|
container.push({ no: fieldNo, wireType, data });
|
|
};
|
|
/**
|
|
* Write unknown fields stored for the message to the writer.
|
|
* This method is compatible with `BinaryWriteOptions.writeUnknownFields`.
|
|
*/
|
|
UnknownFieldHandler.onWrite = (typeName, message, writer) => {
|
|
for (let { no, wireType, data } of UnknownFieldHandler.list(message))
|
|
writer.tag(no, wireType).raw(data);
|
|
};
|
|
/**
|
|
* List unknown fields stored for the message.
|
|
* Note that there may be multiples fields with the same number.
|
|
*/
|
|
UnknownFieldHandler.list = (message, fieldNo) => {
|
|
if (is(message)) {
|
|
let all = message[UnknownFieldHandler.symbol];
|
|
return fieldNo ? all.filter(uf => uf.no == fieldNo) : all;
|
|
}
|
|
return [];
|
|
};
|
|
/**
|
|
* Returns the last unknown field by field number.
|
|
*/
|
|
UnknownFieldHandler.last = (message, fieldNo) => UnknownFieldHandler.list(message, fieldNo).slice(-1)[0];
|
|
const is = (message) => message && Array.isArray(message[UnknownFieldHandler.symbol]);
|
|
})(UnknownFieldHandler = exports.UnknownFieldHandler || (exports.UnknownFieldHandler = {}));
|
|
/**
|
|
* Merges binary write or read options. Later values override earlier values.
|
|
*/
|
|
function mergeBinaryOptions(a, b) {
|
|
return Object.assign(Object.assign({}, a), b);
|
|
}
|
|
exports.mergeBinaryOptions = mergeBinaryOptions;
|
|
/**
|
|
* Protobuf binary format wire types.
|
|
*
|
|
* A wire type provides just enough information to find the length of the
|
|
* following value.
|
|
*
|
|
* See https://developers.google.com/protocol-buffers/docs/encoding#structure
|
|
*/
|
|
var WireType;
|
|
(function (WireType) {
|
|
/**
|
|
* Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum
|
|
*/
|
|
WireType[WireType["Varint"] = 0] = "Varint";
|
|
/**
|
|
* Used for fixed64, sfixed64, double.
|
|
* Always 8 bytes with little-endian byte order.
|
|
*/
|
|
WireType[WireType["Bit64"] = 1] = "Bit64";
|
|
/**
|
|
* Used for string, bytes, embedded messages, packed repeated fields
|
|
*
|
|
* Only repeated numeric types (types which use the varint, 32-bit,
|
|
* or 64-bit wire types) can be packed. In proto3, such fields are
|
|
* packed by default.
|
|
*/
|
|
WireType[WireType["LengthDelimited"] = 2] = "LengthDelimited";
|
|
/**
|
|
* Used for groups
|
|
* @deprecated
|
|
*/
|
|
WireType[WireType["StartGroup"] = 3] = "StartGroup";
|
|
/**
|
|
* Used for groups
|
|
* @deprecated
|
|
*/
|
|
WireType[WireType["EndGroup"] = 4] = "EndGroup";
|
|
/**
|
|
* Used for fixed32, sfixed32, float.
|
|
* Always 4 bytes with little-endian byte order.
|
|
*/
|
|
WireType[WireType["Bit32"] = 5] = "Bit32";
|
|
})(WireType = exports.WireType || (exports.WireType = {}));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2889:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.BinaryReader = exports.binaryReadOptions = void 0;
|
|
const binary_format_contract_1 = __webpack_require__(4816);
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
const goog_varint_1 = __webpack_require__(3223);
|
|
const defaultsRead = {
|
|
readUnknownField: true,
|
|
readerFactory: bytes => new BinaryReader(bytes),
|
|
};
|
|
/**
|
|
* Make options for reading binary data form partial options.
|
|
*/
|
|
function binaryReadOptions(options) {
|
|
return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;
|
|
}
|
|
exports.binaryReadOptions = binaryReadOptions;
|
|
class BinaryReader {
|
|
constructor(buf, textDecoder) {
|
|
this.varint64 = goog_varint_1.varint64read; // dirty cast for `this`
|
|
/**
|
|
* Read a `uint32` field, an unsigned 32 bit varint.
|
|
*/
|
|
this.uint32 = goog_varint_1.varint32read; // dirty cast for `this` and access to protected `buf`
|
|
this.buf = buf;
|
|
this.len = buf.length;
|
|
this.pos = 0;
|
|
this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder("utf-8", {
|
|
fatal: true,
|
|
ignoreBOM: true,
|
|
});
|
|
}
|
|
/**
|
|
* Reads a tag - field number and wire type.
|
|
*/
|
|
tag() {
|
|
let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;
|
|
if (fieldNo <= 0 || wireType < 0 || wireType > 5)
|
|
throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
|
|
return [fieldNo, wireType];
|
|
}
|
|
/**
|
|
* Skip one element on the wire and return the skipped data.
|
|
* Supports WireType.StartGroup since v2.0.0-alpha.23.
|
|
*/
|
|
skip(wireType) {
|
|
let start = this.pos;
|
|
// noinspection FallThroughInSwitchStatementJS
|
|
switch (wireType) {
|
|
case binary_format_contract_1.WireType.Varint:
|
|
while (this.buf[this.pos++] & 0x80) {
|
|
// ignore
|
|
}
|
|
break;
|
|
case binary_format_contract_1.WireType.Bit64:
|
|
this.pos += 4;
|
|
case binary_format_contract_1.WireType.Bit32:
|
|
this.pos += 4;
|
|
break;
|
|
case binary_format_contract_1.WireType.LengthDelimited:
|
|
let len = this.uint32();
|
|
this.pos += len;
|
|
break;
|
|
case binary_format_contract_1.WireType.StartGroup:
|
|
// From descriptor.proto: Group type is deprecated, not supported in proto3.
|
|
// But we must still be able to parse and treat as unknown.
|
|
let t;
|
|
while ((t = this.tag()[1]) !== binary_format_contract_1.WireType.EndGroup) {
|
|
this.skip(t);
|
|
}
|
|
break;
|
|
default:
|
|
throw new Error("cant skip wire type " + wireType);
|
|
}
|
|
this.assertBounds();
|
|
return this.buf.subarray(start, this.pos);
|
|
}
|
|
/**
|
|
* Throws error if position in byte array is out of range.
|
|
*/
|
|
assertBounds() {
|
|
if (this.pos > this.len)
|
|
throw new RangeError("premature EOF");
|
|
}
|
|
/**
|
|
* Read a `int32` field, a signed 32 bit varint.
|
|
*/
|
|
int32() {
|
|
return this.uint32() | 0;
|
|
}
|
|
/**
|
|
* Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
|
|
*/
|
|
sint32() {
|
|
let zze = this.uint32();
|
|
// decode zigzag
|
|
return (zze >>> 1) ^ -(zze & 1);
|
|
}
|
|
/**
|
|
* Read a `int64` field, a signed 64-bit varint.
|
|
*/
|
|
int64() {
|
|
return new pb_long_1.PbLong(...this.varint64());
|
|
}
|
|
/**
|
|
* Read a `uint64` field, an unsigned 64-bit varint.
|
|
*/
|
|
uint64() {
|
|
return new pb_long_1.PbULong(...this.varint64());
|
|
}
|
|
/**
|
|
* Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
|
|
*/
|
|
sint64() {
|
|
let [lo, hi] = this.varint64();
|
|
// decode zig zag
|
|
let s = -(lo & 1);
|
|
lo = ((lo >>> 1 | (hi & 1) << 31) ^ s);
|
|
hi = (hi >>> 1 ^ s);
|
|
return new pb_long_1.PbLong(lo, hi);
|
|
}
|
|
/**
|
|
* Read a `bool` field, a variant.
|
|
*/
|
|
bool() {
|
|
let [lo, hi] = this.varint64();
|
|
return lo !== 0 || hi !== 0;
|
|
}
|
|
/**
|
|
* Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
|
|
*/
|
|
fixed32() {
|
|
return this.view.getUint32((this.pos += 4) - 4, true);
|
|
}
|
|
/**
|
|
* Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
|
|
*/
|
|
sfixed32() {
|
|
return this.view.getInt32((this.pos += 4) - 4, true);
|
|
}
|
|
/**
|
|
* Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
|
|
*/
|
|
fixed64() {
|
|
return new pb_long_1.PbULong(this.sfixed32(), this.sfixed32());
|
|
}
|
|
/**
|
|
* Read a `fixed64` field, a signed, fixed-length 64-bit integer.
|
|
*/
|
|
sfixed64() {
|
|
return new pb_long_1.PbLong(this.sfixed32(), this.sfixed32());
|
|
}
|
|
/**
|
|
* Read a `float` field, 32-bit floating point number.
|
|
*/
|
|
float() {
|
|
return this.view.getFloat32((this.pos += 4) - 4, true);
|
|
}
|
|
/**
|
|
* Read a `double` field, a 64-bit floating point number.
|
|
*/
|
|
double() {
|
|
return this.view.getFloat64((this.pos += 8) - 8, true);
|
|
}
|
|
/**
|
|
* Read a `bytes` field, length-delimited arbitrary data.
|
|
*/
|
|
bytes() {
|
|
let len = this.uint32();
|
|
let start = this.pos;
|
|
this.pos += len;
|
|
this.assertBounds();
|
|
return this.buf.subarray(start, start + len);
|
|
}
|
|
/**
|
|
* Read a `string` field, length-delimited data converted to UTF-8 text.
|
|
*/
|
|
string() {
|
|
return this.textDecoder.decode(this.bytes());
|
|
}
|
|
}
|
|
exports.BinaryReader = BinaryReader;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3957:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.BinaryWriter = exports.binaryWriteOptions = void 0;
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
const goog_varint_1 = __webpack_require__(3223);
|
|
const assert_1 = __webpack_require__(8602);
|
|
const defaultsWrite = {
|
|
writeUnknownFields: true,
|
|
writerFactory: () => new BinaryWriter(),
|
|
};
|
|
/**
|
|
* Make options for writing binary data form partial options.
|
|
*/
|
|
function binaryWriteOptions(options) {
|
|
return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;
|
|
}
|
|
exports.binaryWriteOptions = binaryWriteOptions;
|
|
class BinaryWriter {
|
|
constructor(textEncoder) {
|
|
/**
|
|
* Previous fork states.
|
|
*/
|
|
this.stack = [];
|
|
this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();
|
|
this.chunks = [];
|
|
this.buf = [];
|
|
}
|
|
/**
|
|
* Return all bytes written and reset this writer.
|
|
*/
|
|
finish() {
|
|
this.chunks.push(new Uint8Array(this.buf)); // flush the buffer
|
|
let len = 0;
|
|
for (let i = 0; i < this.chunks.length; i++)
|
|
len += this.chunks[i].length;
|
|
let bytes = new Uint8Array(len);
|
|
let offset = 0;
|
|
for (let i = 0; i < this.chunks.length; i++) {
|
|
bytes.set(this.chunks[i], offset);
|
|
offset += this.chunks[i].length;
|
|
}
|
|
this.chunks = [];
|
|
return bytes;
|
|
}
|
|
/**
|
|
* Start a new fork for length-delimited data like a message
|
|
* or a packed repeated field.
|
|
*
|
|
* Must be joined later with `join()`.
|
|
*/
|
|
fork() {
|
|
this.stack.push({ chunks: this.chunks, buf: this.buf });
|
|
this.chunks = [];
|
|
this.buf = [];
|
|
return this;
|
|
}
|
|
/**
|
|
* Join the last fork. Write its length and bytes, then
|
|
* return to the previous state.
|
|
*/
|
|
join() {
|
|
// get chunk of fork
|
|
let chunk = this.finish();
|
|
// restore previous state
|
|
let prev = this.stack.pop();
|
|
if (!prev)
|
|
throw new Error('invalid state, fork stack empty');
|
|
this.chunks = prev.chunks;
|
|
this.buf = prev.buf;
|
|
// write length of chunk as varint
|
|
this.uint32(chunk.byteLength);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Writes a tag (field number and wire type).
|
|
*
|
|
* Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.
|
|
*
|
|
* Generated code should compute the tag ahead of time and call `uint32()`.
|
|
*/
|
|
tag(fieldNo, type) {
|
|
return this.uint32((fieldNo << 3 | type) >>> 0);
|
|
}
|
|
/**
|
|
* Write a chunk of raw bytes.
|
|
*/
|
|
raw(chunk) {
|
|
if (this.buf.length) {
|
|
this.chunks.push(new Uint8Array(this.buf));
|
|
this.buf = [];
|
|
}
|
|
this.chunks.push(chunk);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `uint32` value, an unsigned 32 bit varint.
|
|
*/
|
|
uint32(value) {
|
|
assert_1.assertUInt32(value);
|
|
// write value as varint 32, inlined for speed
|
|
while (value > 0x7f) {
|
|
this.buf.push((value & 0x7f) | 0x80);
|
|
value = value >>> 7;
|
|
}
|
|
this.buf.push(value);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `int32` value, a signed 32 bit varint.
|
|
*/
|
|
int32(value) {
|
|
assert_1.assertInt32(value);
|
|
goog_varint_1.varint32write(value, this.buf);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `bool` value, a variant.
|
|
*/
|
|
bool(value) {
|
|
this.buf.push(value ? 1 : 0);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `bytes` value, length-delimited arbitrary data.
|
|
*/
|
|
bytes(value) {
|
|
this.uint32(value.byteLength); // write length of chunk as varint
|
|
return this.raw(value);
|
|
}
|
|
/**
|
|
* Write a `string` value, length-delimited data converted to UTF-8 text.
|
|
*/
|
|
string(value) {
|
|
let chunk = this.textEncoder.encode(value);
|
|
this.uint32(chunk.byteLength); // write length of chunk as varint
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `float` value, 32-bit floating point number.
|
|
*/
|
|
float(value) {
|
|
assert_1.assertFloat32(value);
|
|
let chunk = new Uint8Array(4);
|
|
new DataView(chunk.buffer).setFloat32(0, value, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `double` value, a 64-bit floating point number.
|
|
*/
|
|
double(value) {
|
|
let chunk = new Uint8Array(8);
|
|
new DataView(chunk.buffer).setFloat64(0, value, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.
|
|
*/
|
|
fixed32(value) {
|
|
assert_1.assertUInt32(value);
|
|
let chunk = new Uint8Array(4);
|
|
new DataView(chunk.buffer).setUint32(0, value, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `sfixed32` value, a signed, fixed-length 32-bit integer.
|
|
*/
|
|
sfixed32(value) {
|
|
assert_1.assertInt32(value);
|
|
let chunk = new Uint8Array(4);
|
|
new DataView(chunk.buffer).setInt32(0, value, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.
|
|
*/
|
|
sint32(value) {
|
|
assert_1.assertInt32(value);
|
|
// zigzag encode
|
|
value = ((value << 1) ^ (value >> 31)) >>> 0;
|
|
goog_varint_1.varint32write(value, this.buf);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `fixed64` value, a signed, fixed-length 64-bit integer.
|
|
*/
|
|
sfixed64(value) {
|
|
let chunk = new Uint8Array(8);
|
|
let view = new DataView(chunk.buffer);
|
|
let long = pb_long_1.PbLong.from(value);
|
|
view.setInt32(0, long.lo, true);
|
|
view.setInt32(4, long.hi, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.
|
|
*/
|
|
fixed64(value) {
|
|
let chunk = new Uint8Array(8);
|
|
let view = new DataView(chunk.buffer);
|
|
let long = pb_long_1.PbULong.from(value);
|
|
view.setInt32(0, long.lo, true);
|
|
view.setInt32(4, long.hi, true);
|
|
return this.raw(chunk);
|
|
}
|
|
/**
|
|
* Write a `int64` value, a signed 64-bit varint.
|
|
*/
|
|
int64(value) {
|
|
let long = pb_long_1.PbLong.from(value);
|
|
goog_varint_1.varint64write(long.lo, long.hi, this.buf);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.
|
|
*/
|
|
sint64(value) {
|
|
let long = pb_long_1.PbLong.from(value),
|
|
// zigzag encode
|
|
sign = long.hi >> 31, lo = (long.lo << 1) ^ sign, hi = ((long.hi << 1) | (long.lo >>> 31)) ^ sign;
|
|
goog_varint_1.varint64write(lo, hi, this.buf);
|
|
return this;
|
|
}
|
|
/**
|
|
* Write a `uint64` value, an unsigned 64-bit varint.
|
|
*/
|
|
uint64(value) {
|
|
let long = pb_long_1.PbULong.from(value);
|
|
goog_varint_1.varint64write(long.lo, long.hi, this.buf);
|
|
return this;
|
|
}
|
|
}
|
|
exports.BinaryWriter = BinaryWriter;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 257:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.listEnumNumbers = exports.listEnumNames = exports.listEnumValues = exports.isEnumObject = void 0;
|
|
/**
|
|
* Is this a lookup object generated by Typescript, for a Typescript enum
|
|
* generated by protobuf-ts?
|
|
*
|
|
* - No `const enum` (enum must not be inlined, we need reverse mapping).
|
|
* - No string enum (we need int32 for protobuf).
|
|
* - Must have a value for 0 (otherwise, we would need to support custom default values).
|
|
*/
|
|
function isEnumObject(arg) {
|
|
if (typeof arg != 'object' || arg === null) {
|
|
return false;
|
|
}
|
|
if (!arg.hasOwnProperty(0)) {
|
|
return false;
|
|
}
|
|
for (let k of Object.keys(arg)) {
|
|
let num = parseInt(k);
|
|
if (!Number.isNaN(num)) {
|
|
// is there a name for the number?
|
|
let nam = arg[num];
|
|
if (nam === undefined)
|
|
return false;
|
|
// does the name resolve back to the number?
|
|
if (arg[nam] !== num)
|
|
return false;
|
|
}
|
|
else {
|
|
// is there a number for the name?
|
|
let num = arg[k];
|
|
if (num === undefined)
|
|
return false;
|
|
// is it a string enum?
|
|
if (typeof num !== 'number')
|
|
return false;
|
|
// do we know the number?
|
|
if (arg[num] === undefined)
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
exports.isEnumObject = isEnumObject;
|
|
/**
|
|
* Lists all values of a Typescript enum, as an array of objects with a "name"
|
|
* property and a "number" property.
|
|
*
|
|
* Note that it is possible that a number appears more than once, because it is
|
|
* possible to have aliases in an enum.
|
|
*
|
|
* Throws if the enum does not adhere to the rules of enums generated by
|
|
* protobuf-ts. See `isEnumObject()`.
|
|
*/
|
|
function listEnumValues(enumObject) {
|
|
if (!isEnumObject(enumObject))
|
|
throw new Error("not a typescript enum object");
|
|
let values = [];
|
|
for (let [name, number] of Object.entries(enumObject))
|
|
if (typeof number == "number")
|
|
values.push({ name, number });
|
|
return values;
|
|
}
|
|
exports.listEnumValues = listEnumValues;
|
|
/**
|
|
* Lists the names of a Typescript enum.
|
|
*
|
|
* Throws if the enum does not adhere to the rules of enums generated by
|
|
* protobuf-ts. See `isEnumObject()`.
|
|
*/
|
|
function listEnumNames(enumObject) {
|
|
return listEnumValues(enumObject).map(val => val.name);
|
|
}
|
|
exports.listEnumNames = listEnumNames;
|
|
/**
|
|
* Lists the numbers of a Typescript enum.
|
|
*
|
|
* Throws if the enum does not adhere to the rules of enums generated by
|
|
* protobuf-ts. See `isEnumObject()`.
|
|
*/
|
|
function listEnumNumbers(enumObject) {
|
|
return listEnumValues(enumObject)
|
|
.map(val => val.number)
|
|
.filter((num, index, arr) => arr.indexOf(num) == index);
|
|
}
|
|
exports.listEnumNumbers = listEnumNumbers;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3223:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
// Code generated by the Protocol Buffer compiler is owned by the owner
|
|
// of the input file used when generating it. This code is not
|
|
// standalone and requires a support library to be linked with it. This
|
|
// support library is itself covered by the above license.
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.varint32read = exports.varint32write = exports.int64toString = exports.int64fromString = exports.varint64write = exports.varint64read = void 0;
|
|
/**
|
|
* Read a 64 bit varint as two JS numbers.
|
|
*
|
|
* Returns tuple:
|
|
* [0]: low bits
|
|
* [0]: high bits
|
|
*
|
|
* Copyright 2008 Google Inc. All rights reserved.
|
|
*
|
|
* See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175
|
|
*/
|
|
function varint64read() {
|
|
let lowBits = 0;
|
|
let highBits = 0;
|
|
for (let shift = 0; shift < 28; shift += 7) {
|
|
let b = this.buf[this.pos++];
|
|
lowBits |= (b & 0x7F) << shift;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return [lowBits, highBits];
|
|
}
|
|
}
|
|
let middleByte = this.buf[this.pos++];
|
|
// last four bits of the first 32 bit number
|
|
lowBits |= (middleByte & 0x0F) << 28;
|
|
// 3 upper bits are part of the next 32 bit number
|
|
highBits = (middleByte & 0x70) >> 4;
|
|
if ((middleByte & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return [lowBits, highBits];
|
|
}
|
|
for (let shift = 3; shift <= 31; shift += 7) {
|
|
let b = this.buf[this.pos++];
|
|
highBits |= (b & 0x7F) << shift;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return [lowBits, highBits];
|
|
}
|
|
}
|
|
throw new Error('invalid varint');
|
|
}
|
|
exports.varint64read = varint64read;
|
|
/**
|
|
* Write a 64 bit varint, given as two JS numbers, to the given bytes array.
|
|
*
|
|
* Copyright 2008 Google Inc. All rights reserved.
|
|
*
|
|
* See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344
|
|
*/
|
|
function varint64write(lo, hi, bytes) {
|
|
for (let i = 0; i < 28; i = i + 7) {
|
|
const shift = lo >>> i;
|
|
const hasNext = !((shift >>> 7) == 0 && hi == 0);
|
|
const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
|
|
bytes.push(byte);
|
|
if (!hasNext) {
|
|
return;
|
|
}
|
|
}
|
|
const splitBits = ((lo >>> 28) & 0x0F) | ((hi & 0x07) << 4);
|
|
const hasMoreBits = !((hi >> 3) == 0);
|
|
bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xFF);
|
|
if (!hasMoreBits) {
|
|
return;
|
|
}
|
|
for (let i = 3; i < 31; i = i + 7) {
|
|
const shift = hi >>> i;
|
|
const hasNext = !((shift >>> 7) == 0);
|
|
const byte = (hasNext ? shift | 0x80 : shift) & 0xFF;
|
|
bytes.push(byte);
|
|
if (!hasNext) {
|
|
return;
|
|
}
|
|
}
|
|
bytes.push((hi >>> 31) & 0x01);
|
|
}
|
|
exports.varint64write = varint64write;
|
|
// constants for binary math
|
|
const TWO_PWR_32_DBL = (1 << 16) * (1 << 16);
|
|
/**
|
|
* Parse decimal string of 64 bit integer value as two JS numbers.
|
|
*
|
|
* Returns tuple:
|
|
* [0]: minus sign?
|
|
* [1]: low bits
|
|
* [2]: high bits
|
|
*
|
|
* Copyright 2008 Google Inc.
|
|
*/
|
|
function int64fromString(dec) {
|
|
// Check for minus sign.
|
|
let minus = dec[0] == '-';
|
|
if (minus)
|
|
dec = dec.slice(1);
|
|
// Work 6 decimal digits at a time, acting like we're converting base 1e6
|
|
// digits to binary. This is safe to do with floating point math because
|
|
// Number.isSafeInteger(ALL_32_BITS * 1e6) == true.
|
|
const base = 1e6;
|
|
let lowBits = 0;
|
|
let highBits = 0;
|
|
function add1e6digit(begin, end) {
|
|
// Note: Number('') is 0.
|
|
const digit1e6 = Number(dec.slice(begin, end));
|
|
highBits *= base;
|
|
lowBits = lowBits * base + digit1e6;
|
|
// Carry bits from lowBits to highBits
|
|
if (lowBits >= TWO_PWR_32_DBL) {
|
|
highBits = highBits + ((lowBits / TWO_PWR_32_DBL) | 0);
|
|
lowBits = lowBits % TWO_PWR_32_DBL;
|
|
}
|
|
}
|
|
add1e6digit(-24, -18);
|
|
add1e6digit(-18, -12);
|
|
add1e6digit(-12, -6);
|
|
add1e6digit(-6);
|
|
return [minus, lowBits, highBits];
|
|
}
|
|
exports.int64fromString = int64fromString;
|
|
/**
|
|
* Format 64 bit integer value (as two JS numbers) to decimal string.
|
|
*
|
|
* Copyright 2008 Google Inc.
|
|
*/
|
|
function int64toString(bitsLow, bitsHigh) {
|
|
// Skip the expensive conversion if the number is small enough to use the
|
|
// built-in conversions.
|
|
if ((bitsHigh >>> 0) <= 0x1FFFFF) {
|
|
return '' + (TWO_PWR_32_DBL * bitsHigh + (bitsLow >>> 0));
|
|
}
|
|
// What this code is doing is essentially converting the input number from
|
|
// base-2 to base-1e7, which allows us to represent the 64-bit range with
|
|
// only 3 (very large) digits. Those digits are then trivial to convert to
|
|
// a base-10 string.
|
|
// The magic numbers used here are -
|
|
// 2^24 = 16777216 = (1,6777216) in base-1e7.
|
|
// 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.
|
|
// Split 32:32 representation into 16:24:24 representation so our
|
|
// intermediate digits don't overflow.
|
|
let low = bitsLow & 0xFFFFFF;
|
|
let mid = (((bitsLow >>> 24) | (bitsHigh << 8)) >>> 0) & 0xFFFFFF;
|
|
let high = (bitsHigh >> 16) & 0xFFFF;
|
|
// Assemble our three base-1e7 digits, ignoring carries. The maximum
|
|
// value in a digit at this step is representable as a 48-bit integer, which
|
|
// can be stored in a 64-bit floating point number.
|
|
let digitA = low + (mid * 6777216) + (high * 6710656);
|
|
let digitB = mid + (high * 8147497);
|
|
let digitC = (high * 2);
|
|
// Apply carries from A to B and from B to C.
|
|
let base = 10000000;
|
|
if (digitA >= base) {
|
|
digitB += Math.floor(digitA / base);
|
|
digitA %= base;
|
|
}
|
|
if (digitB >= base) {
|
|
digitC += Math.floor(digitB / base);
|
|
digitB %= base;
|
|
}
|
|
// Convert base-1e7 digits to base-10, with optional leading zeroes.
|
|
function decimalFrom1e7(digit1e7, needLeadingZeros) {
|
|
let partial = digit1e7 ? String(digit1e7) : '';
|
|
if (needLeadingZeros) {
|
|
return '0000000'.slice(partial.length) + partial;
|
|
}
|
|
return partial;
|
|
}
|
|
return decimalFrom1e7(digitC, /*needLeadingZeros=*/ 0) +
|
|
decimalFrom1e7(digitB, /*needLeadingZeros=*/ digitC) +
|
|
// If the final 1e7 digit didn't need leading zeros, we would have
|
|
// returned via the trivial code path at the top.
|
|
decimalFrom1e7(digitA, /*needLeadingZeros=*/ 1);
|
|
}
|
|
exports.int64toString = int64toString;
|
|
/**
|
|
* Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`
|
|
*
|
|
* Copyright 2008 Google Inc. All rights reserved.
|
|
*
|
|
* See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144
|
|
*/
|
|
function varint32write(value, bytes) {
|
|
if (value >= 0) {
|
|
// write value as varint 32
|
|
while (value > 0x7f) {
|
|
bytes.push((value & 0x7f) | 0x80);
|
|
value = value >>> 7;
|
|
}
|
|
bytes.push(value);
|
|
}
|
|
else {
|
|
for (let i = 0; i < 9; i++) {
|
|
bytes.push(value & 127 | 128);
|
|
value = value >> 7;
|
|
}
|
|
bytes.push(1);
|
|
}
|
|
}
|
|
exports.varint32write = varint32write;
|
|
/**
|
|
* Read an unsigned 32 bit varint.
|
|
*
|
|
* See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220
|
|
*/
|
|
function varint32read() {
|
|
let b = this.buf[this.pos++];
|
|
let result = b & 0x7F;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return result;
|
|
}
|
|
b = this.buf[this.pos++];
|
|
result |= (b & 0x7F) << 7;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return result;
|
|
}
|
|
b = this.buf[this.pos++];
|
|
result |= (b & 0x7F) << 14;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return result;
|
|
}
|
|
b = this.buf[this.pos++];
|
|
result |= (b & 0x7F) << 21;
|
|
if ((b & 0x80) == 0) {
|
|
this.assertBounds();
|
|
return result;
|
|
}
|
|
// Extract only last 4 bits
|
|
b = this.buf[this.pos++];
|
|
result |= (b & 0x0F) << 28;
|
|
for (let readBytes = 5; ((b & 0x80) !== 0) && readBytes < 10; readBytes++)
|
|
b = this.buf[this.pos++];
|
|
if ((b & 0x80) != 0)
|
|
throw new Error('invalid varint');
|
|
this.assertBounds();
|
|
// Result can have 32 bits, convert it to unsigned
|
|
return result >>> 0;
|
|
}
|
|
exports.varint32read = varint32read;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8886:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
// Public API of the protobuf-ts runtime.
|
|
// Note: we do not use `export * from ...` to help tree shakers,
|
|
// webpack verbose output hints that this should be useful
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
// Convenience JSON typings and corresponding type guards
|
|
var json_typings_1 = __webpack_require__(9999);
|
|
Object.defineProperty(exports, "typeofJsonValue", ({ enumerable: true, get: function () { return json_typings_1.typeofJsonValue; } }));
|
|
Object.defineProperty(exports, "isJsonObject", ({ enumerable: true, get: function () { return json_typings_1.isJsonObject; } }));
|
|
// Base 64 encoding
|
|
var base64_1 = __webpack_require__(6335);
|
|
Object.defineProperty(exports, "base64decode", ({ enumerable: true, get: function () { return base64_1.base64decode; } }));
|
|
Object.defineProperty(exports, "base64encode", ({ enumerable: true, get: function () { return base64_1.base64encode; } }));
|
|
// UTF8 encoding
|
|
var protobufjs_utf8_1 = __webpack_require__(8950);
|
|
Object.defineProperty(exports, "utf8read", ({ enumerable: true, get: function () { return protobufjs_utf8_1.utf8read; } }));
|
|
// Binary format contracts, options for reading and writing, for example
|
|
var binary_format_contract_1 = __webpack_require__(4816);
|
|
Object.defineProperty(exports, "WireType", ({ enumerable: true, get: function () { return binary_format_contract_1.WireType; } }));
|
|
Object.defineProperty(exports, "mergeBinaryOptions", ({ enumerable: true, get: function () { return binary_format_contract_1.mergeBinaryOptions; } }));
|
|
Object.defineProperty(exports, "UnknownFieldHandler", ({ enumerable: true, get: function () { return binary_format_contract_1.UnknownFieldHandler; } }));
|
|
// Standard IBinaryReader implementation
|
|
var binary_reader_1 = __webpack_require__(2889);
|
|
Object.defineProperty(exports, "BinaryReader", ({ enumerable: true, get: function () { return binary_reader_1.BinaryReader; } }));
|
|
Object.defineProperty(exports, "binaryReadOptions", ({ enumerable: true, get: function () { return binary_reader_1.binaryReadOptions; } }));
|
|
// Standard IBinaryWriter implementation
|
|
var binary_writer_1 = __webpack_require__(3957);
|
|
Object.defineProperty(exports, "BinaryWriter", ({ enumerable: true, get: function () { return binary_writer_1.BinaryWriter; } }));
|
|
Object.defineProperty(exports, "binaryWriteOptions", ({ enumerable: true, get: function () { return binary_writer_1.binaryWriteOptions; } }));
|
|
// Int64 and UInt64 implementations required for the binary format
|
|
var pb_long_1 = __webpack_require__(1753);
|
|
Object.defineProperty(exports, "PbLong", ({ enumerable: true, get: function () { return pb_long_1.PbLong; } }));
|
|
Object.defineProperty(exports, "PbULong", ({ enumerable: true, get: function () { return pb_long_1.PbULong; } }));
|
|
// JSON format contracts, options for reading and writing, for example
|
|
var json_format_contract_1 = __webpack_require__(9367);
|
|
Object.defineProperty(exports, "jsonReadOptions", ({ enumerable: true, get: function () { return json_format_contract_1.jsonReadOptions; } }));
|
|
Object.defineProperty(exports, "jsonWriteOptions", ({ enumerable: true, get: function () { return json_format_contract_1.jsonWriteOptions; } }));
|
|
Object.defineProperty(exports, "mergeJsonOptions", ({ enumerable: true, get: function () { return json_format_contract_1.mergeJsonOptions; } }));
|
|
// Message type contract
|
|
var message_type_contract_1 = __webpack_require__(3785);
|
|
Object.defineProperty(exports, "MESSAGE_TYPE", ({ enumerable: true, get: function () { return message_type_contract_1.MESSAGE_TYPE; } }));
|
|
// Message type implementation via reflection
|
|
var message_type_1 = __webpack_require__(5106);
|
|
Object.defineProperty(exports, "MessageType", ({ enumerable: true, get: function () { return message_type_1.MessageType; } }));
|
|
// Reflection info, generated by the plugin, exposed to the user, used by reflection ops
|
|
var reflection_info_1 = __webpack_require__(7910);
|
|
Object.defineProperty(exports, "ScalarType", ({ enumerable: true, get: function () { return reflection_info_1.ScalarType; } }));
|
|
Object.defineProperty(exports, "LongType", ({ enumerable: true, get: function () { return reflection_info_1.LongType; } }));
|
|
Object.defineProperty(exports, "RepeatType", ({ enumerable: true, get: function () { return reflection_info_1.RepeatType; } }));
|
|
Object.defineProperty(exports, "normalizeFieldInfo", ({ enumerable: true, get: function () { return reflection_info_1.normalizeFieldInfo; } }));
|
|
Object.defineProperty(exports, "readFieldOptions", ({ enumerable: true, get: function () { return reflection_info_1.readFieldOptions; } }));
|
|
Object.defineProperty(exports, "readFieldOption", ({ enumerable: true, get: function () { return reflection_info_1.readFieldOption; } }));
|
|
Object.defineProperty(exports, "readMessageOption", ({ enumerable: true, get: function () { return reflection_info_1.readMessageOption; } }));
|
|
// Message operations via reflection
|
|
var reflection_type_check_1 = __webpack_require__(5167);
|
|
Object.defineProperty(exports, "ReflectionTypeCheck", ({ enumerable: true, get: function () { return reflection_type_check_1.ReflectionTypeCheck; } }));
|
|
var reflection_create_1 = __webpack_require__(5726);
|
|
Object.defineProperty(exports, "reflectionCreate", ({ enumerable: true, get: function () { return reflection_create_1.reflectionCreate; } }));
|
|
var reflection_scalar_default_1 = __webpack_require__(9526);
|
|
Object.defineProperty(exports, "reflectionScalarDefault", ({ enumerable: true, get: function () { return reflection_scalar_default_1.reflectionScalarDefault; } }));
|
|
var reflection_merge_partial_1 = __webpack_require__(8044);
|
|
Object.defineProperty(exports, "reflectionMergePartial", ({ enumerable: true, get: function () { return reflection_merge_partial_1.reflectionMergePartial; } }));
|
|
var reflection_equals_1 = __webpack_require__(4827);
|
|
Object.defineProperty(exports, "reflectionEquals", ({ enumerable: true, get: function () { return reflection_equals_1.reflectionEquals; } }));
|
|
var reflection_binary_reader_1 = __webpack_require__(9611);
|
|
Object.defineProperty(exports, "ReflectionBinaryReader", ({ enumerable: true, get: function () { return reflection_binary_reader_1.ReflectionBinaryReader; } }));
|
|
var reflection_binary_writer_1 = __webpack_require__(6907);
|
|
Object.defineProperty(exports, "ReflectionBinaryWriter", ({ enumerable: true, get: function () { return reflection_binary_writer_1.ReflectionBinaryWriter; } }));
|
|
var reflection_json_reader_1 = __webpack_require__(6790);
|
|
Object.defineProperty(exports, "ReflectionJsonReader", ({ enumerable: true, get: function () { return reflection_json_reader_1.ReflectionJsonReader; } }));
|
|
var reflection_json_writer_1 = __webpack_require__(1094);
|
|
Object.defineProperty(exports, "ReflectionJsonWriter", ({ enumerable: true, get: function () { return reflection_json_writer_1.ReflectionJsonWriter; } }));
|
|
var reflection_contains_message_type_1 = __webpack_require__(9946);
|
|
Object.defineProperty(exports, "containsMessageType", ({ enumerable: true, get: function () { return reflection_contains_message_type_1.containsMessageType; } }));
|
|
// Oneof helpers
|
|
var oneof_1 = __webpack_require__(8063);
|
|
Object.defineProperty(exports, "isOneofGroup", ({ enumerable: true, get: function () { return oneof_1.isOneofGroup; } }));
|
|
Object.defineProperty(exports, "setOneofValue", ({ enumerable: true, get: function () { return oneof_1.setOneofValue; } }));
|
|
Object.defineProperty(exports, "getOneofValue", ({ enumerable: true, get: function () { return oneof_1.getOneofValue; } }));
|
|
Object.defineProperty(exports, "clearOneofValue", ({ enumerable: true, get: function () { return oneof_1.clearOneofValue; } }));
|
|
Object.defineProperty(exports, "getSelectedOneofValue", ({ enumerable: true, get: function () { return oneof_1.getSelectedOneofValue; } }));
|
|
// Enum object type guard and reflection util, may be interesting to the user.
|
|
var enum_object_1 = __webpack_require__(257);
|
|
Object.defineProperty(exports, "listEnumValues", ({ enumerable: true, get: function () { return enum_object_1.listEnumValues; } }));
|
|
Object.defineProperty(exports, "listEnumNames", ({ enumerable: true, get: function () { return enum_object_1.listEnumNames; } }));
|
|
Object.defineProperty(exports, "listEnumNumbers", ({ enumerable: true, get: function () { return enum_object_1.listEnumNumbers; } }));
|
|
Object.defineProperty(exports, "isEnumObject", ({ enumerable: true, get: function () { return enum_object_1.isEnumObject; } }));
|
|
// lowerCamelCase() is exported for plugin, rpc-runtime and other rpc packages
|
|
var lower_camel_case_1 = __webpack_require__(4073);
|
|
Object.defineProperty(exports, "lowerCamelCase", ({ enumerable: true, get: function () { return lower_camel_case_1.lowerCamelCase; } }));
|
|
// assertion functions are exported for plugin, may also be useful to user
|
|
var assert_1 = __webpack_require__(8602);
|
|
Object.defineProperty(exports, "assert", ({ enumerable: true, get: function () { return assert_1.assert; } }));
|
|
Object.defineProperty(exports, "assertNever", ({ enumerable: true, get: function () { return assert_1.assertNever; } }));
|
|
Object.defineProperty(exports, "assertInt32", ({ enumerable: true, get: function () { return assert_1.assertInt32; } }));
|
|
Object.defineProperty(exports, "assertUInt32", ({ enumerable: true, get: function () { return assert_1.assertUInt32; } }));
|
|
Object.defineProperty(exports, "assertFloat32", ({ enumerable: true, get: function () { return assert_1.assertFloat32; } }));
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9367:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.mergeJsonOptions = exports.jsonWriteOptions = exports.jsonReadOptions = void 0;
|
|
const defaultsWrite = {
|
|
emitDefaultValues: false,
|
|
enumAsInteger: false,
|
|
useProtoFieldName: false,
|
|
prettySpaces: 0,
|
|
}, defaultsRead = {
|
|
ignoreUnknownFields: false,
|
|
};
|
|
/**
|
|
* Make options for reading JSON data from partial options.
|
|
*/
|
|
function jsonReadOptions(options) {
|
|
return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead;
|
|
}
|
|
exports.jsonReadOptions = jsonReadOptions;
|
|
/**
|
|
* Make options for writing JSON data from partial options.
|
|
*/
|
|
function jsonWriteOptions(options) {
|
|
return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite;
|
|
}
|
|
exports.jsonWriteOptions = jsonWriteOptions;
|
|
/**
|
|
* Merges JSON write or read options. Later values override earlier values. Type registries are merged.
|
|
*/
|
|
function mergeJsonOptions(a, b) {
|
|
var _a, _b;
|
|
let c = Object.assign(Object.assign({}, a), b);
|
|
c.typeRegistry = [...((_a = a === null || a === void 0 ? void 0 : a.typeRegistry) !== null && _a !== void 0 ? _a : []), ...((_b = b === null || b === void 0 ? void 0 : b.typeRegistry) !== null && _b !== void 0 ? _b : [])];
|
|
return c;
|
|
}
|
|
exports.mergeJsonOptions = mergeJsonOptions;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9999:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.isJsonObject = exports.typeofJsonValue = void 0;
|
|
/**
|
|
* Get the type of a JSON value.
|
|
* Distinguishes between array, null and object.
|
|
*/
|
|
function typeofJsonValue(value) {
|
|
let t = typeof value;
|
|
if (t == "object") {
|
|
if (Array.isArray(value))
|
|
return "array";
|
|
if (value === null)
|
|
return "null";
|
|
}
|
|
return t;
|
|
}
|
|
exports.typeofJsonValue = typeofJsonValue;
|
|
/**
|
|
* Is this a JSON object (instead of an array or null)?
|
|
*/
|
|
function isJsonObject(value) {
|
|
return value !== null && typeof value == "object" && !Array.isArray(value);
|
|
}
|
|
exports.isJsonObject = isJsonObject;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4073:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.lowerCamelCase = void 0;
|
|
/**
|
|
* Converts snake_case to lowerCamelCase.
|
|
*
|
|
* Should behave like protoc:
|
|
* https://github.com/protocolbuffers/protobuf/blob/e8ae137c96444ea313485ed1118c5e43b2099cf1/src/google/protobuf/compiler/java/java_helpers.cc#L118
|
|
*/
|
|
function lowerCamelCase(snakeCase) {
|
|
let capNext = false;
|
|
const sb = [];
|
|
for (let i = 0; i < snakeCase.length; i++) {
|
|
let next = snakeCase.charAt(i);
|
|
if (next == '_') {
|
|
capNext = true;
|
|
}
|
|
else if (/\d/.test(next)) {
|
|
sb.push(next);
|
|
capNext = true;
|
|
}
|
|
else if (capNext) {
|
|
sb.push(next.toUpperCase());
|
|
capNext = false;
|
|
}
|
|
else if (i == 0) {
|
|
sb.push(next.toLowerCase());
|
|
}
|
|
else {
|
|
sb.push(next);
|
|
}
|
|
}
|
|
return sb.join('');
|
|
}
|
|
exports.lowerCamelCase = lowerCamelCase;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3785:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.MESSAGE_TYPE = void 0;
|
|
/**
|
|
* The symbol used as a key on message objects to store the message type.
|
|
*
|
|
* Note that this is an experimental feature - it is here to stay, but
|
|
* implementation details may change without notice.
|
|
*/
|
|
exports.MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type");
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5106:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.MessageType = void 0;
|
|
const message_type_contract_1 = __webpack_require__(3785);
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const reflection_type_check_1 = __webpack_require__(5167);
|
|
const reflection_json_reader_1 = __webpack_require__(6790);
|
|
const reflection_json_writer_1 = __webpack_require__(1094);
|
|
const reflection_binary_reader_1 = __webpack_require__(9611);
|
|
const reflection_binary_writer_1 = __webpack_require__(6907);
|
|
const reflection_create_1 = __webpack_require__(5726);
|
|
const reflection_merge_partial_1 = __webpack_require__(8044);
|
|
const json_typings_1 = __webpack_require__(9999);
|
|
const json_format_contract_1 = __webpack_require__(9367);
|
|
const reflection_equals_1 = __webpack_require__(4827);
|
|
const binary_writer_1 = __webpack_require__(3957);
|
|
const binary_reader_1 = __webpack_require__(2889);
|
|
const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));
|
|
const messageTypeDescriptor = baseDescriptors[message_type_contract_1.MESSAGE_TYPE] = {};
|
|
/**
|
|
* This standard message type provides reflection-based
|
|
* operations to work with a message.
|
|
*/
|
|
class MessageType {
|
|
constructor(name, fields, options) {
|
|
this.defaultCheckDepth = 16;
|
|
this.typeName = name;
|
|
this.fields = fields.map(reflection_info_1.normalizeFieldInfo);
|
|
this.options = options !== null && options !== void 0 ? options : {};
|
|
messageTypeDescriptor.value = this;
|
|
this.messagePrototype = Object.create(null, baseDescriptors);
|
|
this.refTypeCheck = new reflection_type_check_1.ReflectionTypeCheck(this);
|
|
this.refJsonReader = new reflection_json_reader_1.ReflectionJsonReader(this);
|
|
this.refJsonWriter = new reflection_json_writer_1.ReflectionJsonWriter(this);
|
|
this.refBinReader = new reflection_binary_reader_1.ReflectionBinaryReader(this);
|
|
this.refBinWriter = new reflection_binary_writer_1.ReflectionBinaryWriter(this);
|
|
}
|
|
create(value) {
|
|
let message = reflection_create_1.reflectionCreate(this);
|
|
if (value !== undefined) {
|
|
reflection_merge_partial_1.reflectionMergePartial(this, message, value);
|
|
}
|
|
return message;
|
|
}
|
|
/**
|
|
* Clone the message.
|
|
*
|
|
* Unknown fields are discarded.
|
|
*/
|
|
clone(message) {
|
|
let copy = this.create();
|
|
reflection_merge_partial_1.reflectionMergePartial(this, copy, message);
|
|
return copy;
|
|
}
|
|
/**
|
|
* Determines whether two message of the same type have the same field values.
|
|
* Checks for deep equality, traversing repeated fields, oneof groups, maps
|
|
* and messages recursively.
|
|
* Will also return true if both messages are `undefined`.
|
|
*/
|
|
equals(a, b) {
|
|
return reflection_equals_1.reflectionEquals(this, a, b);
|
|
}
|
|
/**
|
|
* Is the given value assignable to our message type
|
|
* and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
|
|
*/
|
|
is(arg, depth = this.defaultCheckDepth) {
|
|
return this.refTypeCheck.is(arg, depth, false);
|
|
}
|
|
/**
|
|
* Is the given value assignable to our message type,
|
|
* regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
|
|
*/
|
|
isAssignable(arg, depth = this.defaultCheckDepth) {
|
|
return this.refTypeCheck.is(arg, depth, true);
|
|
}
|
|
/**
|
|
* Copy partial data into the target message.
|
|
*/
|
|
mergePartial(target, source) {
|
|
reflection_merge_partial_1.reflectionMergePartial(this, target, source);
|
|
}
|
|
/**
|
|
* Create a new message from binary format.
|
|
*/
|
|
fromBinary(data, options) {
|
|
let opt = binary_reader_1.binaryReadOptions(options);
|
|
return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);
|
|
}
|
|
/**
|
|
* Read a new message from a JSON value.
|
|
*/
|
|
fromJson(json, options) {
|
|
return this.internalJsonRead(json, json_format_contract_1.jsonReadOptions(options));
|
|
}
|
|
/**
|
|
* Read a new message from a JSON string.
|
|
* This is equivalent to `T.fromJson(JSON.parse(json))`.
|
|
*/
|
|
fromJsonString(json, options) {
|
|
let value = JSON.parse(json);
|
|
return this.fromJson(value, options);
|
|
}
|
|
/**
|
|
* Write the message to canonical JSON value.
|
|
*/
|
|
toJson(message, options) {
|
|
return this.internalJsonWrite(message, json_format_contract_1.jsonWriteOptions(options));
|
|
}
|
|
/**
|
|
* Convert the message to canonical JSON string.
|
|
* This is equivalent to `JSON.stringify(T.toJson(t))`
|
|
*/
|
|
toJsonString(message, options) {
|
|
var _a;
|
|
let value = this.toJson(message, options);
|
|
return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);
|
|
}
|
|
/**
|
|
* Write the message to binary format.
|
|
*/
|
|
toBinary(message, options) {
|
|
let opt = binary_writer_1.binaryWriteOptions(options);
|
|
return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to read a message from
|
|
* JSON, use `fromJson()` or `fromJsonString()`.
|
|
*
|
|
* Reads JSON value and merges the fields into the target
|
|
* according to protobuf rules. If the target is omitted,
|
|
* a new instance is created first.
|
|
*/
|
|
internalJsonRead(json, options, target) {
|
|
if (json !== null && typeof json == "object" && !Array.isArray(json)) {
|
|
let message = target !== null && target !== void 0 ? target : this.create();
|
|
this.refJsonReader.read(json, message, options);
|
|
return message;
|
|
}
|
|
throw new Error(`Unable to parse message ${this.typeName} from JSON ${json_typings_1.typeofJsonValue(json)}.`);
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to write a message
|
|
* to JSON, use `toJson()` or `toJsonString().
|
|
*
|
|
* Writes JSON value and returns it.
|
|
*/
|
|
internalJsonWrite(message, options) {
|
|
return this.refJsonWriter.write(message, options);
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to write a message
|
|
* in binary format, use `toBinary()`.
|
|
*
|
|
* Serializes the message in binary format and appends it to the given
|
|
* writer. Returns passed writer.
|
|
*/
|
|
internalBinaryWrite(message, writer, options) {
|
|
this.refBinWriter.write(message, writer, options);
|
|
return writer;
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to read a message from
|
|
* binary data, use `fromBinary()`.
|
|
*
|
|
* Reads data from binary format and merges the fields into
|
|
* the target according to protobuf rules. If the target is
|
|
* omitted, a new instance is created first.
|
|
*/
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create();
|
|
this.refBinReader.read(reader, message, options, length);
|
|
return message;
|
|
}
|
|
}
|
|
exports.MessageType = MessageType;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8063:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.getSelectedOneofValue = exports.clearOneofValue = exports.setUnknownOneofValue = exports.setOneofValue = exports.getOneofValue = exports.isOneofGroup = void 0;
|
|
/**
|
|
* Is the given value a valid oneof group?
|
|
*
|
|
* We represent protobuf `oneof` as algebraic data types (ADT) in generated
|
|
* code. But when working with messages of unknown type, the ADT does not
|
|
* help us.
|
|
*
|
|
* This type guard checks if the given object adheres to the ADT rules, which
|
|
* are as follows:
|
|
*
|
|
* 1) Must be an object.
|
|
*
|
|
* 2) Must have a "oneofKind" discriminator property.
|
|
*
|
|
* 3) If "oneofKind" is `undefined`, no member field is selected. The object
|
|
* must not have any other properties.
|
|
*
|
|
* 4) If "oneofKind" is a `string`, the member field with this name is
|
|
* selected.
|
|
*
|
|
* 5) If a member field is selected, the object must have a second property
|
|
* with this name. The property must not be `undefined`.
|
|
*
|
|
* 6) No extra properties are allowed. The object has either one property
|
|
* (no selection) or two properties (selection).
|
|
*
|
|
*/
|
|
function isOneofGroup(any) {
|
|
if (typeof any != 'object' || any === null || !any.hasOwnProperty('oneofKind')) {
|
|
return false;
|
|
}
|
|
switch (typeof any.oneofKind) {
|
|
case "string":
|
|
if (any[any.oneofKind] === undefined)
|
|
return false;
|
|
return Object.keys(any).length == 2;
|
|
case "undefined":
|
|
return Object.keys(any).length == 1;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
exports.isOneofGroup = isOneofGroup;
|
|
/**
|
|
* Returns the value of the given field in a oneof group.
|
|
*/
|
|
function getOneofValue(oneof, kind) {
|
|
return oneof[kind];
|
|
}
|
|
exports.getOneofValue = getOneofValue;
|
|
function setOneofValue(oneof, kind, value) {
|
|
if (oneof.oneofKind !== undefined) {
|
|
delete oneof[oneof.oneofKind];
|
|
}
|
|
oneof.oneofKind = kind;
|
|
if (value !== undefined) {
|
|
oneof[kind] = value;
|
|
}
|
|
}
|
|
exports.setOneofValue = setOneofValue;
|
|
function setUnknownOneofValue(oneof, kind, value) {
|
|
if (oneof.oneofKind !== undefined) {
|
|
delete oneof[oneof.oneofKind];
|
|
}
|
|
oneof.oneofKind = kind;
|
|
if (value !== undefined && kind !== undefined) {
|
|
oneof[kind] = value;
|
|
}
|
|
}
|
|
exports.setUnknownOneofValue = setUnknownOneofValue;
|
|
/**
|
|
* Removes the selected field in a oneof group.
|
|
*
|
|
* Note that the recommended way to modify a oneof group is to set
|
|
* a new object:
|
|
*
|
|
* ```ts
|
|
* message.result = { oneofKind: undefined };
|
|
* ```
|
|
*/
|
|
function clearOneofValue(oneof) {
|
|
if (oneof.oneofKind !== undefined) {
|
|
delete oneof[oneof.oneofKind];
|
|
}
|
|
oneof.oneofKind = undefined;
|
|
}
|
|
exports.clearOneofValue = clearOneofValue;
|
|
/**
|
|
* Returns the selected value of the given oneof group.
|
|
*
|
|
* Not that the recommended way to access a oneof group is to check
|
|
* the "oneofKind" property and let TypeScript narrow down the union
|
|
* type for you:
|
|
*
|
|
* ```ts
|
|
* if (message.result.oneofKind === "error") {
|
|
* message.result.error; // string
|
|
* }
|
|
* ```
|
|
*
|
|
* In the rare case you just need the value, and do not care about
|
|
* which protobuf field is selected, you can use this function
|
|
* for convenience.
|
|
*/
|
|
function getSelectedOneofValue(oneof) {
|
|
if (oneof.oneofKind === undefined) {
|
|
return undefined;
|
|
}
|
|
return oneof[oneof.oneofKind];
|
|
}
|
|
exports.getSelectedOneofValue = getSelectedOneofValue;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 1753:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.PbLong = exports.PbULong = exports.detectBi = void 0;
|
|
const goog_varint_1 = __webpack_require__(3223);
|
|
let BI;
|
|
function detectBi() {
|
|
const dv = new DataView(new ArrayBuffer(8));
|
|
const ok = globalThis.BigInt !== undefined
|
|
&& typeof dv.getBigInt64 === "function"
|
|
&& typeof dv.getBigUint64 === "function"
|
|
&& typeof dv.setBigInt64 === "function"
|
|
&& typeof dv.setBigUint64 === "function";
|
|
BI = ok ? {
|
|
MIN: BigInt("-9223372036854775808"),
|
|
MAX: BigInt("9223372036854775807"),
|
|
UMIN: BigInt("0"),
|
|
UMAX: BigInt("18446744073709551615"),
|
|
C: BigInt,
|
|
V: dv,
|
|
} : undefined;
|
|
}
|
|
exports.detectBi = detectBi;
|
|
detectBi();
|
|
function assertBi(bi) {
|
|
if (!bi)
|
|
throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support");
|
|
}
|
|
// used to validate from(string) input (when bigint is unavailable)
|
|
const RE_DECIMAL_STR = /^-?[0-9]+$/;
|
|
// constants for binary math
|
|
const TWO_PWR_32_DBL = 0x100000000;
|
|
const HALF_2_PWR_32 = 0x080000000;
|
|
// base class for PbLong and PbULong provides shared code
|
|
class SharedPbLong {
|
|
/**
|
|
* Create a new instance with the given bits.
|
|
*/
|
|
constructor(lo, hi) {
|
|
this.lo = lo | 0;
|
|
this.hi = hi | 0;
|
|
}
|
|
/**
|
|
* Is this instance equal to 0?
|
|
*/
|
|
isZero() {
|
|
return this.lo == 0 && this.hi == 0;
|
|
}
|
|
/**
|
|
* Convert to a native number.
|
|
*/
|
|
toNumber() {
|
|
let result = this.hi * TWO_PWR_32_DBL + (this.lo >>> 0);
|
|
if (!Number.isSafeInteger(result))
|
|
throw new Error("cannot convert to safe number");
|
|
return result;
|
|
}
|
|
}
|
|
/**
|
|
* 64-bit unsigned integer as two 32-bit values.
|
|
* Converts between `string`, `number` and `bigint` representations.
|
|
*/
|
|
class PbULong extends SharedPbLong {
|
|
/**
|
|
* Create instance from a `string`, `number` or `bigint`.
|
|
*/
|
|
static from(value) {
|
|
if (BI)
|
|
// noinspection FallThroughInSwitchStatementJS
|
|
switch (typeof value) {
|
|
case "string":
|
|
if (value == "0")
|
|
return this.ZERO;
|
|
if (value == "")
|
|
throw new Error('string is no integer');
|
|
value = BI.C(value);
|
|
case "number":
|
|
if (value === 0)
|
|
return this.ZERO;
|
|
value = BI.C(value);
|
|
case "bigint":
|
|
if (!value)
|
|
return this.ZERO;
|
|
if (value < BI.UMIN)
|
|
throw new Error('signed value for ulong');
|
|
if (value > BI.UMAX)
|
|
throw new Error('ulong too large');
|
|
BI.V.setBigUint64(0, value, true);
|
|
return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
|
|
}
|
|
else
|
|
switch (typeof value) {
|
|
case "string":
|
|
if (value == "0")
|
|
return this.ZERO;
|
|
value = value.trim();
|
|
if (!RE_DECIMAL_STR.test(value))
|
|
throw new Error('string is no integer');
|
|
let [minus, lo, hi] = goog_varint_1.int64fromString(value);
|
|
if (minus)
|
|
throw new Error('signed value for ulong');
|
|
return new PbULong(lo, hi);
|
|
case "number":
|
|
if (value == 0)
|
|
return this.ZERO;
|
|
if (!Number.isSafeInteger(value))
|
|
throw new Error('number is no integer');
|
|
if (value < 0)
|
|
throw new Error('signed value for ulong');
|
|
return new PbULong(value, value / TWO_PWR_32_DBL);
|
|
}
|
|
throw new Error('unknown value ' + typeof value);
|
|
}
|
|
/**
|
|
* Convert to decimal string.
|
|
*/
|
|
toString() {
|
|
return BI ? this.toBigInt().toString() : goog_varint_1.int64toString(this.lo, this.hi);
|
|
}
|
|
/**
|
|
* Convert to native bigint.
|
|
*/
|
|
toBigInt() {
|
|
assertBi(BI);
|
|
BI.V.setInt32(0, this.lo, true);
|
|
BI.V.setInt32(4, this.hi, true);
|
|
return BI.V.getBigUint64(0, true);
|
|
}
|
|
}
|
|
exports.PbULong = PbULong;
|
|
/**
|
|
* ulong 0 singleton.
|
|
*/
|
|
PbULong.ZERO = new PbULong(0, 0);
|
|
/**
|
|
* 64-bit signed integer as two 32-bit values.
|
|
* Converts between `string`, `number` and `bigint` representations.
|
|
*/
|
|
class PbLong extends SharedPbLong {
|
|
/**
|
|
* Create instance from a `string`, `number` or `bigint`.
|
|
*/
|
|
static from(value) {
|
|
if (BI)
|
|
// noinspection FallThroughInSwitchStatementJS
|
|
switch (typeof value) {
|
|
case "string":
|
|
if (value == "0")
|
|
return this.ZERO;
|
|
if (value == "")
|
|
throw new Error('string is no integer');
|
|
value = BI.C(value);
|
|
case "number":
|
|
if (value === 0)
|
|
return this.ZERO;
|
|
value = BI.C(value);
|
|
case "bigint":
|
|
if (!value)
|
|
return this.ZERO;
|
|
if (value < BI.MIN)
|
|
throw new Error('signed long too small');
|
|
if (value > BI.MAX)
|
|
throw new Error('signed long too large');
|
|
BI.V.setBigInt64(0, value, true);
|
|
return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true));
|
|
}
|
|
else
|
|
switch (typeof value) {
|
|
case "string":
|
|
if (value == "0")
|
|
return this.ZERO;
|
|
value = value.trim();
|
|
if (!RE_DECIMAL_STR.test(value))
|
|
throw new Error('string is no integer');
|
|
let [minus, lo, hi] = goog_varint_1.int64fromString(value);
|
|
if (minus) {
|
|
if (hi > HALF_2_PWR_32 || (hi == HALF_2_PWR_32 && lo != 0))
|
|
throw new Error('signed long too small');
|
|
}
|
|
else if (hi >= HALF_2_PWR_32)
|
|
throw new Error('signed long too large');
|
|
let pbl = new PbLong(lo, hi);
|
|
return minus ? pbl.negate() : pbl;
|
|
case "number":
|
|
if (value == 0)
|
|
return this.ZERO;
|
|
if (!Number.isSafeInteger(value))
|
|
throw new Error('number is no integer');
|
|
return value > 0
|
|
? new PbLong(value, value / TWO_PWR_32_DBL)
|
|
: new PbLong(-value, -value / TWO_PWR_32_DBL).negate();
|
|
}
|
|
throw new Error('unknown value ' + typeof value);
|
|
}
|
|
/**
|
|
* Do we have a minus sign?
|
|
*/
|
|
isNegative() {
|
|
return (this.hi & HALF_2_PWR_32) !== 0;
|
|
}
|
|
/**
|
|
* Negate two's complement.
|
|
* Invert all the bits and add one to the result.
|
|
*/
|
|
negate() {
|
|
let hi = ~this.hi, lo = this.lo;
|
|
if (lo)
|
|
lo = ~lo + 1;
|
|
else
|
|
hi += 1;
|
|
return new PbLong(lo, hi);
|
|
}
|
|
/**
|
|
* Convert to decimal string.
|
|
*/
|
|
toString() {
|
|
if (BI)
|
|
return this.toBigInt().toString();
|
|
if (this.isNegative()) {
|
|
let n = this.negate();
|
|
return '-' + goog_varint_1.int64toString(n.lo, n.hi);
|
|
}
|
|
return goog_varint_1.int64toString(this.lo, this.hi);
|
|
}
|
|
/**
|
|
* Convert to native bigint.
|
|
*/
|
|
toBigInt() {
|
|
assertBi(BI);
|
|
BI.V.setInt32(0, this.lo, true);
|
|
BI.V.setInt32(4, this.hi, true);
|
|
return BI.V.getBigInt64(0, true);
|
|
}
|
|
}
|
|
exports.PbLong = PbLong;
|
|
/**
|
|
* long 0 singleton.
|
|
*/
|
|
PbLong.ZERO = new PbLong(0, 0);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8950:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
// Copyright (c) 2016, Daniel Wirtz All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution.
|
|
// * Neither the name of its author, nor the names of its contributors
|
|
// may be used to endorse or promote products derived from this software
|
|
// without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.utf8read = void 0;
|
|
const fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk);
|
|
/**
|
|
* @deprecated This function will no longer be exported with the next major
|
|
* release, since protobuf-ts has switch to TextDecoder API. If you need this
|
|
* function, please migrate to @protobufjs/utf8. For context, see
|
|
* https://github.com/timostamm/protobuf-ts/issues/184
|
|
*
|
|
* Reads UTF8 bytes as a string.
|
|
*
|
|
* See [protobufjs / utf8](https://github.com/protobufjs/protobuf.js/blob/9893e35b854621cce64af4bf6be2cff4fb892796/lib/utf8/index.js#L40)
|
|
*
|
|
* Copyright (c) 2016, Daniel Wirtz
|
|
*/
|
|
function utf8read(bytes) {
|
|
if (bytes.length < 1)
|
|
return "";
|
|
let pos = 0, // position in bytes
|
|
parts = [], chunk = [], i = 0, // char offset
|
|
t; // temporary
|
|
let len = bytes.length;
|
|
while (pos < len) {
|
|
t = bytes[pos++];
|
|
if (t < 128)
|
|
chunk[i++] = t;
|
|
else if (t > 191 && t < 224)
|
|
chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63;
|
|
else if (t > 239 && t < 365) {
|
|
t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 0x10000;
|
|
chunk[i++] = 0xD800 + (t >> 10);
|
|
chunk[i++] = 0xDC00 + (t & 1023);
|
|
}
|
|
else
|
|
chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63;
|
|
if (i > 8191) {
|
|
parts.push(fromCharCodes(chunk));
|
|
i = 0;
|
|
}
|
|
}
|
|
if (parts.length) {
|
|
if (i)
|
|
parts.push(fromCharCodes(chunk.slice(0, i)));
|
|
return parts.join("");
|
|
}
|
|
return fromCharCodes(chunk.slice(0, i));
|
|
}
|
|
exports.utf8read = utf8read;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9611:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ReflectionBinaryReader = void 0;
|
|
const binary_format_contract_1 = __webpack_require__(4816);
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const reflection_long_convert_1 = __webpack_require__(3402);
|
|
const reflection_scalar_default_1 = __webpack_require__(9526);
|
|
/**
|
|
* Reads proto3 messages in binary format using reflection information.
|
|
*
|
|
* https://developers.google.com/protocol-buffers/docs/encoding
|
|
*/
|
|
class ReflectionBinaryReader {
|
|
constructor(info) {
|
|
this.info = info;
|
|
}
|
|
prepare() {
|
|
var _a;
|
|
if (!this.fieldNoToField) {
|
|
const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
|
|
this.fieldNoToField = new Map(fieldsInput.map(field => [field.no, field]));
|
|
}
|
|
}
|
|
/**
|
|
* Reads a message from binary format into the target message.
|
|
*
|
|
* Repeated fields are appended. Map entries are added, overwriting
|
|
* existing keys.
|
|
*
|
|
* If a message field is already present, it will be merged with the
|
|
* new data.
|
|
*/
|
|
read(reader, message, options, length) {
|
|
this.prepare();
|
|
const end = length === undefined ? reader.len : reader.pos + length;
|
|
while (reader.pos < end) {
|
|
// read the tag and find the field
|
|
const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo);
|
|
if (!field) {
|
|
let u = options.readUnknownField;
|
|
if (u == "throw")
|
|
throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? binary_format_contract_1.UnknownFieldHandler.onRead : u)(this.info.typeName, message, fieldNo, wireType, d);
|
|
continue;
|
|
}
|
|
// target object for the field we are reading
|
|
let target = message, repeated = field.repeat, localName = field.localName;
|
|
// if field is member of oneof ADT, use ADT as target
|
|
if (field.oneof) {
|
|
target = target[field.oneof];
|
|
// if other oneof member selected, set new ADT
|
|
if (target.oneofKind !== localName)
|
|
target = message[field.oneof] = {
|
|
oneofKind: localName
|
|
};
|
|
}
|
|
// we have handled oneof above, we just have read the value into `target[localName]`
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
case "enum":
|
|
let T = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T;
|
|
let L = field.kind == "scalar" ? field.L : undefined;
|
|
if (repeated) {
|
|
let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
|
|
if (wireType == binary_format_contract_1.WireType.LengthDelimited && T != reflection_info_1.ScalarType.STRING && T != reflection_info_1.ScalarType.BYTES) {
|
|
let e = reader.uint32() + reader.pos;
|
|
while (reader.pos < e)
|
|
arr.push(this.scalar(reader, T, L));
|
|
}
|
|
else
|
|
arr.push(this.scalar(reader, T, L));
|
|
}
|
|
else
|
|
target[localName] = this.scalar(reader, T, L);
|
|
break;
|
|
case "message":
|
|
if (repeated) {
|
|
let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
|
|
let msg = field.T().internalBinaryRead(reader, reader.uint32(), options);
|
|
arr.push(msg);
|
|
}
|
|
else
|
|
target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]);
|
|
break;
|
|
case "map":
|
|
let [mapKey, mapVal] = this.mapEntry(field, reader, options);
|
|
// safe to assume presence of map object, oneof cannot contain repeated values
|
|
target[localName][mapKey] = mapVal;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Read a map field, expecting key field = 1, value field = 2
|
|
*/
|
|
mapEntry(field, reader, options) {
|
|
let length = reader.uint32();
|
|
let end = reader.pos + length;
|
|
let key = undefined; // javascript only allows number or string for object properties
|
|
let val = undefined;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case 1:
|
|
if (field.K == reflection_info_1.ScalarType.BOOL)
|
|
key = reader.bool().toString();
|
|
else
|
|
// long types are read as string, number types are okay as number
|
|
key = this.scalar(reader, field.K, reflection_info_1.LongType.STRING);
|
|
break;
|
|
case 2:
|
|
switch (field.V.kind) {
|
|
case "scalar":
|
|
val = this.scalar(reader, field.V.T, field.V.L);
|
|
break;
|
|
case "enum":
|
|
val = reader.int32();
|
|
break;
|
|
case "message":
|
|
val = field.V.T().internalBinaryRead(reader, reader.uint32(), options);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`);
|
|
}
|
|
}
|
|
if (key === undefined) {
|
|
let keyRaw = reflection_scalar_default_1.reflectionScalarDefault(field.K);
|
|
key = field.K == reflection_info_1.ScalarType.BOOL ? keyRaw.toString() : keyRaw;
|
|
}
|
|
if (val === undefined)
|
|
switch (field.V.kind) {
|
|
case "scalar":
|
|
val = reflection_scalar_default_1.reflectionScalarDefault(field.V.T, field.V.L);
|
|
break;
|
|
case "enum":
|
|
val = 0;
|
|
break;
|
|
case "message":
|
|
val = field.V.T().create();
|
|
break;
|
|
}
|
|
return [key, val];
|
|
}
|
|
scalar(reader, type, longType) {
|
|
switch (type) {
|
|
case reflection_info_1.ScalarType.INT32:
|
|
return reader.int32();
|
|
case reflection_info_1.ScalarType.STRING:
|
|
return reader.string();
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
return reader.bool();
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
return reader.double();
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
return reader.float();
|
|
case reflection_info_1.ScalarType.INT64:
|
|
return reflection_long_convert_1.reflectionLongConvert(reader.int64(), longType);
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
return reflection_long_convert_1.reflectionLongConvert(reader.uint64(), longType);
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
return reflection_long_convert_1.reflectionLongConvert(reader.fixed64(), longType);
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
return reader.fixed32();
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
return reader.bytes();
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
return reader.uint32();
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
return reader.sfixed32();
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
return reflection_long_convert_1.reflectionLongConvert(reader.sfixed64(), longType);
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
return reader.sint32();
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
return reflection_long_convert_1.reflectionLongConvert(reader.sint64(), longType);
|
|
}
|
|
}
|
|
}
|
|
exports.ReflectionBinaryReader = ReflectionBinaryReader;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6907:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ReflectionBinaryWriter = void 0;
|
|
const binary_format_contract_1 = __webpack_require__(4816);
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const assert_1 = __webpack_require__(8602);
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
/**
|
|
* Writes proto3 messages in binary format using reflection information.
|
|
*
|
|
* https://developers.google.com/protocol-buffers/docs/encoding
|
|
*/
|
|
class ReflectionBinaryWriter {
|
|
constructor(info) {
|
|
this.info = info;
|
|
}
|
|
prepare() {
|
|
if (!this.fields) {
|
|
const fieldsInput = this.info.fields ? this.info.fields.concat() : [];
|
|
this.fields = fieldsInput.sort((a, b) => a.no - b.no);
|
|
}
|
|
}
|
|
/**
|
|
* Writes the message to binary format.
|
|
*/
|
|
write(message, writer, options) {
|
|
this.prepare();
|
|
for (const field of this.fields) {
|
|
let value, // this will be our field value, whether it is member of a oneof or not
|
|
emitDefault, // whether we emit the default value (only true for oneof members)
|
|
repeated = field.repeat, localName = field.localName;
|
|
// handle oneof ADT
|
|
if (field.oneof) {
|
|
const group = message[field.oneof];
|
|
if (group.oneofKind !== localName)
|
|
continue; // if field is not selected, skip
|
|
value = group[localName];
|
|
emitDefault = true;
|
|
}
|
|
else {
|
|
value = message[localName];
|
|
emitDefault = false;
|
|
}
|
|
// we have handled oneof above. we just have to honor `emitDefault`.
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
case "enum":
|
|
let T = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T;
|
|
if (repeated) {
|
|
assert_1.assert(Array.isArray(value));
|
|
if (repeated == reflection_info_1.RepeatType.PACKED)
|
|
this.packed(writer, T, field.no, value);
|
|
else
|
|
for (const item of value)
|
|
this.scalar(writer, T, field.no, item, true);
|
|
}
|
|
else if (value === undefined)
|
|
assert_1.assert(field.opt);
|
|
else
|
|
this.scalar(writer, T, field.no, value, emitDefault || field.opt);
|
|
break;
|
|
case "message":
|
|
if (repeated) {
|
|
assert_1.assert(Array.isArray(value));
|
|
for (const item of value)
|
|
this.message(writer, options, field.T(), field.no, item);
|
|
}
|
|
else {
|
|
this.message(writer, options, field.T(), field.no, value);
|
|
}
|
|
break;
|
|
case "map":
|
|
assert_1.assert(typeof value == 'object' && value !== null);
|
|
for (const [key, val] of Object.entries(value))
|
|
this.mapEntry(writer, options, field, key, val);
|
|
break;
|
|
}
|
|
}
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u === true ? binary_format_contract_1.UnknownFieldHandler.onWrite : u)(this.info.typeName, message, writer);
|
|
}
|
|
mapEntry(writer, options, field, key, value) {
|
|
writer.tag(field.no, binary_format_contract_1.WireType.LengthDelimited);
|
|
writer.fork();
|
|
// javascript only allows number or string for object properties
|
|
// we convert from our representation to the protobuf type
|
|
let keyValue = key;
|
|
switch (field.K) {
|
|
case reflection_info_1.ScalarType.INT32:
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
keyValue = Number.parseInt(key);
|
|
break;
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
assert_1.assert(key == 'true' || key == 'false');
|
|
keyValue = key == 'true';
|
|
break;
|
|
}
|
|
// write key, expecting key field number = 1
|
|
this.scalar(writer, field.K, 1, keyValue, true);
|
|
// write value, expecting value field number = 2
|
|
switch (field.V.kind) {
|
|
case 'scalar':
|
|
this.scalar(writer, field.V.T, 2, value, true);
|
|
break;
|
|
case 'enum':
|
|
this.scalar(writer, reflection_info_1.ScalarType.INT32, 2, value, true);
|
|
break;
|
|
case 'message':
|
|
this.message(writer, options, field.V.T(), 2, value);
|
|
break;
|
|
}
|
|
writer.join();
|
|
}
|
|
message(writer, options, handler, fieldNo, value) {
|
|
if (value === undefined)
|
|
return;
|
|
handler.internalBinaryWrite(value, writer.tag(fieldNo, binary_format_contract_1.WireType.LengthDelimited).fork(), options);
|
|
writer.join();
|
|
}
|
|
/**
|
|
* Write a single scalar value.
|
|
*/
|
|
scalar(writer, type, fieldNo, value, emitDefault) {
|
|
let [wireType, method, isDefault] = this.scalarInfo(type, value);
|
|
if (!isDefault || emitDefault) {
|
|
writer.tag(fieldNo, wireType);
|
|
writer[method](value);
|
|
}
|
|
}
|
|
/**
|
|
* Write an array of scalar values in packed format.
|
|
*/
|
|
packed(writer, type, fieldNo, value) {
|
|
if (!value.length)
|
|
return;
|
|
assert_1.assert(type !== reflection_info_1.ScalarType.BYTES && type !== reflection_info_1.ScalarType.STRING);
|
|
// write tag
|
|
writer.tag(fieldNo, binary_format_contract_1.WireType.LengthDelimited);
|
|
// begin length-delimited
|
|
writer.fork();
|
|
// write values without tags
|
|
let [, method,] = this.scalarInfo(type);
|
|
for (let i = 0; i < value.length; i++)
|
|
writer[method](value[i]);
|
|
// end length delimited
|
|
writer.join();
|
|
}
|
|
/**
|
|
* Get information for writing a scalar value.
|
|
*
|
|
* Returns tuple:
|
|
* [0]: appropriate WireType
|
|
* [1]: name of the appropriate method of IBinaryWriter
|
|
* [2]: whether the given value is a default value
|
|
*
|
|
* If argument `value` is omitted, [2] is always false.
|
|
*/
|
|
scalarInfo(type, value) {
|
|
let t = binary_format_contract_1.WireType.Varint;
|
|
let m;
|
|
let i = value === undefined;
|
|
let d = value === 0;
|
|
switch (type) {
|
|
case reflection_info_1.ScalarType.INT32:
|
|
m = "int32";
|
|
break;
|
|
case reflection_info_1.ScalarType.STRING:
|
|
d = i || !value.length;
|
|
t = binary_format_contract_1.WireType.LengthDelimited;
|
|
m = "string";
|
|
break;
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
d = value === false;
|
|
m = "bool";
|
|
break;
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
m = "uint32";
|
|
break;
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
t = binary_format_contract_1.WireType.Bit64;
|
|
m = "double";
|
|
break;
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
t = binary_format_contract_1.WireType.Bit32;
|
|
m = "float";
|
|
break;
|
|
case reflection_info_1.ScalarType.INT64:
|
|
d = i || pb_long_1.PbLong.from(value).isZero();
|
|
m = "int64";
|
|
break;
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
d = i || pb_long_1.PbULong.from(value).isZero();
|
|
m = "uint64";
|
|
break;
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
d = i || pb_long_1.PbULong.from(value).isZero();
|
|
t = binary_format_contract_1.WireType.Bit64;
|
|
m = "fixed64";
|
|
break;
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
d = i || !value.byteLength;
|
|
t = binary_format_contract_1.WireType.LengthDelimited;
|
|
m = "bytes";
|
|
break;
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
t = binary_format_contract_1.WireType.Bit32;
|
|
m = "fixed32";
|
|
break;
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
t = binary_format_contract_1.WireType.Bit32;
|
|
m = "sfixed32";
|
|
break;
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
d = i || pb_long_1.PbLong.from(value).isZero();
|
|
t = binary_format_contract_1.WireType.Bit64;
|
|
m = "sfixed64";
|
|
break;
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
m = "sint32";
|
|
break;
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
d = i || pb_long_1.PbLong.from(value).isZero();
|
|
m = "sint64";
|
|
break;
|
|
}
|
|
return [t, m, i || d];
|
|
}
|
|
}
|
|
exports.ReflectionBinaryWriter = ReflectionBinaryWriter;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9946:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.containsMessageType = void 0;
|
|
const message_type_contract_1 = __webpack_require__(3785);
|
|
/**
|
|
* Check if the provided object is a proto message.
|
|
*
|
|
* Note that this is an experimental feature - it is here to stay, but
|
|
* implementation details may change without notice.
|
|
*/
|
|
function containsMessageType(msg) {
|
|
return msg[message_type_contract_1.MESSAGE_TYPE] != null;
|
|
}
|
|
exports.containsMessageType = containsMessageType;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5726:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.reflectionCreate = void 0;
|
|
const reflection_scalar_default_1 = __webpack_require__(9526);
|
|
const message_type_contract_1 = __webpack_require__(3785);
|
|
/**
|
|
* Creates an instance of the generic message, using the field
|
|
* information.
|
|
*/
|
|
function reflectionCreate(type) {
|
|
/**
|
|
* This ternary can be removed in the next major version.
|
|
* The `Object.create()` code path utilizes a new `messagePrototype`
|
|
* property on the `IMessageType` which has this same `MESSAGE_TYPE`
|
|
* non-enumerable property on it. Doing it this way means that we only
|
|
* pay the cost of `Object.defineProperty()` once per `IMessageType`
|
|
* class of once per "instance". The falsy code path is only provided
|
|
* for backwards compatibility in cases where the runtime library is
|
|
* updated without also updating the generated code.
|
|
*/
|
|
const msg = type.messagePrototype
|
|
? Object.create(type.messagePrototype)
|
|
: Object.defineProperty({}, message_type_contract_1.MESSAGE_TYPE, { value: type });
|
|
for (let field of type.fields) {
|
|
let name = field.localName;
|
|
if (field.opt)
|
|
continue;
|
|
if (field.oneof)
|
|
msg[field.oneof] = { oneofKind: undefined };
|
|
else if (field.repeat)
|
|
msg[name] = [];
|
|
else
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
msg[name] = reflection_scalar_default_1.reflectionScalarDefault(field.T, field.L);
|
|
break;
|
|
case "enum":
|
|
// we require 0 to be default value for all enums
|
|
msg[name] = 0;
|
|
break;
|
|
case "map":
|
|
msg[name] = {};
|
|
break;
|
|
}
|
|
}
|
|
return msg;
|
|
}
|
|
exports.reflectionCreate = reflectionCreate;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4827:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.reflectionEquals = void 0;
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
/**
|
|
* Determines whether two message of the same type have the same field values.
|
|
* Checks for deep equality, traversing repeated fields, oneof groups, maps
|
|
* and messages recursively.
|
|
* Will also return true if both messages are `undefined`.
|
|
*/
|
|
function reflectionEquals(info, a, b) {
|
|
if (a === b)
|
|
return true;
|
|
if (!a || !b)
|
|
return false;
|
|
for (let field of info.fields) {
|
|
let localName = field.localName;
|
|
let val_a = field.oneof ? a[field.oneof][localName] : a[localName];
|
|
let val_b = field.oneof ? b[field.oneof][localName] : b[localName];
|
|
switch (field.kind) {
|
|
case "enum":
|
|
case "scalar":
|
|
let t = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T;
|
|
if (!(field.repeat
|
|
? repeatedPrimitiveEq(t, val_a, val_b)
|
|
: primitiveEq(t, val_a, val_b)))
|
|
return false;
|
|
break;
|
|
case "map":
|
|
if (!(field.V.kind == "message"
|
|
? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b))
|
|
: repeatedPrimitiveEq(field.V.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b))))
|
|
return false;
|
|
break;
|
|
case "message":
|
|
let T = field.T();
|
|
if (!(field.repeat
|
|
? repeatedMsgEq(T, val_a, val_b)
|
|
: T.equals(val_a, val_b)))
|
|
return false;
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
exports.reflectionEquals = reflectionEquals;
|
|
const objectValues = Object.values;
|
|
function primitiveEq(type, a, b) {
|
|
if (a === b)
|
|
return true;
|
|
if (type !== reflection_info_1.ScalarType.BYTES)
|
|
return false;
|
|
let ba = a;
|
|
let bb = b;
|
|
if (ba.length !== bb.length)
|
|
return false;
|
|
for (let i = 0; i < ba.length; i++)
|
|
if (ba[i] != bb[i])
|
|
return false;
|
|
return true;
|
|
}
|
|
function repeatedPrimitiveEq(type, a, b) {
|
|
if (a.length !== b.length)
|
|
return false;
|
|
for (let i = 0; i < a.length; i++)
|
|
if (!primitiveEq(type, a[i], b[i]))
|
|
return false;
|
|
return true;
|
|
}
|
|
function repeatedMsgEq(type, a, b) {
|
|
if (a.length !== b.length)
|
|
return false;
|
|
for (let i = 0; i < a.length; i++)
|
|
if (!type.equals(a[i], b[i]))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7910:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.readMessageOption = exports.readFieldOption = exports.readFieldOptions = exports.normalizeFieldInfo = exports.RepeatType = exports.LongType = exports.ScalarType = void 0;
|
|
const lower_camel_case_1 = __webpack_require__(4073);
|
|
/**
|
|
* Scalar value types. This is a subset of field types declared by protobuf
|
|
* enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE
|
|
* are omitted, but the numerical values are identical.
|
|
*/
|
|
var ScalarType;
|
|
(function (ScalarType) {
|
|
// 0 is reserved for errors.
|
|
// Order is weird for historical reasons.
|
|
ScalarType[ScalarType["DOUBLE"] = 1] = "DOUBLE";
|
|
ScalarType[ScalarType["FLOAT"] = 2] = "FLOAT";
|
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
|
|
// negative values are likely.
|
|
ScalarType[ScalarType["INT64"] = 3] = "INT64";
|
|
ScalarType[ScalarType["UINT64"] = 4] = "UINT64";
|
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
|
|
// negative values are likely.
|
|
ScalarType[ScalarType["INT32"] = 5] = "INT32";
|
|
ScalarType[ScalarType["FIXED64"] = 6] = "FIXED64";
|
|
ScalarType[ScalarType["FIXED32"] = 7] = "FIXED32";
|
|
ScalarType[ScalarType["BOOL"] = 8] = "BOOL";
|
|
ScalarType[ScalarType["STRING"] = 9] = "STRING";
|
|
// Tag-delimited aggregate.
|
|
// Group type is deprecated and not supported in proto3. However, Proto3
|
|
// implementations should still be able to parse the group wire format and
|
|
// treat group fields as unknown fields.
|
|
// TYPE_GROUP = 10,
|
|
// TYPE_MESSAGE = 11, // Length-delimited aggregate.
|
|
// New in version 2.
|
|
ScalarType[ScalarType["BYTES"] = 12] = "BYTES";
|
|
ScalarType[ScalarType["UINT32"] = 13] = "UINT32";
|
|
// TYPE_ENUM = 14,
|
|
ScalarType[ScalarType["SFIXED32"] = 15] = "SFIXED32";
|
|
ScalarType[ScalarType["SFIXED64"] = 16] = "SFIXED64";
|
|
ScalarType[ScalarType["SINT32"] = 17] = "SINT32";
|
|
ScalarType[ScalarType["SINT64"] = 18] = "SINT64";
|
|
})(ScalarType = exports.ScalarType || (exports.ScalarType = {}));
|
|
/**
|
|
* JavaScript representation of 64 bit integral types. Equivalent to the
|
|
* field option "jstype".
|
|
*
|
|
* By default, protobuf-ts represents 64 bit types as `bigint`.
|
|
*
|
|
* You can change the default behaviour by enabling the plugin parameter
|
|
* `long_type_string`, which will represent 64 bit types as `string`.
|
|
*
|
|
* Alternatively, you can change the behaviour for individual fields
|
|
* with the field option "jstype":
|
|
*
|
|
* ```protobuf
|
|
* uint64 my_field = 1 [jstype = JS_STRING];
|
|
* uint64 other_field = 2 [jstype = JS_NUMBER];
|
|
* ```
|
|
*/
|
|
var LongType;
|
|
(function (LongType) {
|
|
/**
|
|
* Use JavaScript `bigint`.
|
|
*
|
|
* Field option `[jstype = JS_NORMAL]`.
|
|
*/
|
|
LongType[LongType["BIGINT"] = 0] = "BIGINT";
|
|
/**
|
|
* Use JavaScript `string`.
|
|
*
|
|
* Field option `[jstype = JS_STRING]`.
|
|
*/
|
|
LongType[LongType["STRING"] = 1] = "STRING";
|
|
/**
|
|
* Use JavaScript `number`.
|
|
*
|
|
* Large values will loose precision.
|
|
*
|
|
* Field option `[jstype = JS_NUMBER]`.
|
|
*/
|
|
LongType[LongType["NUMBER"] = 2] = "NUMBER";
|
|
})(LongType = exports.LongType || (exports.LongType = {}));
|
|
/**
|
|
* Protobuf 2.1.0 introduced packed repeated fields.
|
|
* Setting the field option `[packed = true]` enables packing.
|
|
*
|
|
* In proto3, all repeated fields are packed by default.
|
|
* Setting the field option `[packed = false]` disables packing.
|
|
*
|
|
* Packed repeated fields are encoded with a single tag,
|
|
* then a length-delimiter, then the element values.
|
|
*
|
|
* Unpacked repeated fields are encoded with a tag and
|
|
* value for each element.
|
|
*
|
|
* `bytes` and `string` cannot be packed.
|
|
*/
|
|
var RepeatType;
|
|
(function (RepeatType) {
|
|
/**
|
|
* The field is not repeated.
|
|
*/
|
|
RepeatType[RepeatType["NO"] = 0] = "NO";
|
|
/**
|
|
* The field is repeated and should be packed.
|
|
* Invalid for `bytes` and `string`, they cannot be packed.
|
|
*/
|
|
RepeatType[RepeatType["PACKED"] = 1] = "PACKED";
|
|
/**
|
|
* The field is repeated but should not be packed.
|
|
* The only valid repeat type for repeated `bytes` and `string`.
|
|
*/
|
|
RepeatType[RepeatType["UNPACKED"] = 2] = "UNPACKED";
|
|
})(RepeatType = exports.RepeatType || (exports.RepeatType = {}));
|
|
/**
|
|
* Turns PartialFieldInfo into FieldInfo.
|
|
*/
|
|
function normalizeFieldInfo(field) {
|
|
var _a, _b, _c, _d;
|
|
field.localName = (_a = field.localName) !== null && _a !== void 0 ? _a : lower_camel_case_1.lowerCamelCase(field.name);
|
|
field.jsonName = (_b = field.jsonName) !== null && _b !== void 0 ? _b : lower_camel_case_1.lowerCamelCase(field.name);
|
|
field.repeat = (_c = field.repeat) !== null && _c !== void 0 ? _c : RepeatType.NO;
|
|
field.opt = (_d = field.opt) !== null && _d !== void 0 ? _d : (field.repeat ? false : field.oneof ? false : field.kind == "message");
|
|
return field;
|
|
}
|
|
exports.normalizeFieldInfo = normalizeFieldInfo;
|
|
/**
|
|
* Read custom field options from a generated message type.
|
|
*
|
|
* @deprecated use readFieldOption()
|
|
*/
|
|
function readFieldOptions(messageType, fieldName, extensionName, extensionType) {
|
|
var _a;
|
|
const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
|
|
return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined;
|
|
}
|
|
exports.readFieldOptions = readFieldOptions;
|
|
function readFieldOption(messageType, fieldName, extensionName, extensionType) {
|
|
var _a;
|
|
const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === void 0 ? void 0 : _a.options;
|
|
if (!options) {
|
|
return undefined;
|
|
}
|
|
const optionVal = options[extensionName];
|
|
if (optionVal === undefined) {
|
|
return optionVal;
|
|
}
|
|
return extensionType ? extensionType.fromJson(optionVal) : optionVal;
|
|
}
|
|
exports.readFieldOption = readFieldOption;
|
|
function readMessageOption(messageType, extensionName, extensionType) {
|
|
const options = messageType.options;
|
|
const optionVal = options[extensionName];
|
|
if (optionVal === undefined) {
|
|
return optionVal;
|
|
}
|
|
return extensionType ? extensionType.fromJson(optionVal) : optionVal;
|
|
}
|
|
exports.readMessageOption = readMessageOption;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6790:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ReflectionJsonReader = void 0;
|
|
const json_typings_1 = __webpack_require__(9999);
|
|
const base64_1 = __webpack_require__(6335);
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
const assert_1 = __webpack_require__(8602);
|
|
const reflection_long_convert_1 = __webpack_require__(3402);
|
|
/**
|
|
* Reads proto3 messages in canonical JSON format using reflection information.
|
|
*
|
|
* https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
*/
|
|
class ReflectionJsonReader {
|
|
constructor(info) {
|
|
this.info = info;
|
|
}
|
|
prepare() {
|
|
var _a;
|
|
if (this.fMap === undefined) {
|
|
this.fMap = {};
|
|
const fieldsInput = (_a = this.info.fields) !== null && _a !== void 0 ? _a : [];
|
|
for (const field of fieldsInput) {
|
|
this.fMap[field.name] = field;
|
|
this.fMap[field.jsonName] = field;
|
|
this.fMap[field.localName] = field;
|
|
}
|
|
}
|
|
}
|
|
// Cannot parse JSON <type of jsonValue> for <type name>#<fieldName>.
|
|
assert(condition, fieldName, jsonValue) {
|
|
if (!condition) {
|
|
let what = json_typings_1.typeofJsonValue(jsonValue);
|
|
if (what == "number" || what == "boolean")
|
|
what = jsonValue.toString();
|
|
throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`);
|
|
}
|
|
}
|
|
/**
|
|
* Reads a message from canonical JSON format into the target message.
|
|
*
|
|
* Repeated fields are appended. Map entries are added, overwriting
|
|
* existing keys.
|
|
*
|
|
* If a message field is already present, it will be merged with the
|
|
* new data.
|
|
*/
|
|
read(input, message, options) {
|
|
this.prepare();
|
|
const oneofsHandled = [];
|
|
for (const [jsonKey, jsonValue] of Object.entries(input)) {
|
|
const field = this.fMap[jsonKey];
|
|
if (!field) {
|
|
if (!options.ignoreUnknownFields)
|
|
throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`);
|
|
continue;
|
|
}
|
|
const localName = field.localName;
|
|
// handle oneof ADT
|
|
let target; // this will be the target for the field value, whether it is member of a oneof or not
|
|
if (field.oneof) {
|
|
if (jsonValue === null && (field.kind !== 'enum' || field.T()[0] !== 'google.protobuf.NullValue')) {
|
|
continue;
|
|
}
|
|
// since json objects are unordered by specification, it is not possible to take the last of multiple oneofs
|
|
if (oneofsHandled.includes(field.oneof))
|
|
throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`);
|
|
oneofsHandled.push(field.oneof);
|
|
target = message[field.oneof] = {
|
|
oneofKind: localName
|
|
};
|
|
}
|
|
else {
|
|
target = message;
|
|
}
|
|
// we have handled oneof above. we just have read the value into `target`.
|
|
if (field.kind == 'map') {
|
|
if (jsonValue === null) {
|
|
continue;
|
|
}
|
|
// check input
|
|
this.assert(json_typings_1.isJsonObject(jsonValue), field.name, jsonValue);
|
|
// our target to put map entries into
|
|
const fieldObj = target[localName];
|
|
// read entries
|
|
for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) {
|
|
this.assert(jsonObjValue !== null, field.name + " map value", null);
|
|
// read value
|
|
let val;
|
|
switch (field.V.kind) {
|
|
case "message":
|
|
val = field.V.T().internalJsonRead(jsonObjValue, options);
|
|
break;
|
|
case "enum":
|
|
val = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields);
|
|
if (val === false)
|
|
continue;
|
|
break;
|
|
case "scalar":
|
|
val = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name);
|
|
break;
|
|
}
|
|
this.assert(val !== undefined, field.name + " map value", jsonObjValue);
|
|
// read key
|
|
let key = jsonObjKey;
|
|
if (field.K == reflection_info_1.ScalarType.BOOL)
|
|
key = key == "true" ? true : key == "false" ? false : key;
|
|
key = this.scalar(key, field.K, reflection_info_1.LongType.STRING, field.name).toString();
|
|
fieldObj[key] = val;
|
|
}
|
|
}
|
|
else if (field.repeat) {
|
|
if (jsonValue === null)
|
|
continue;
|
|
// check input
|
|
this.assert(Array.isArray(jsonValue), field.name, jsonValue);
|
|
// our target to put array entries into
|
|
const fieldArr = target[localName];
|
|
// read array entries
|
|
for (const jsonItem of jsonValue) {
|
|
this.assert(jsonItem !== null, field.name, null);
|
|
let val;
|
|
switch (field.kind) {
|
|
case "message":
|
|
val = field.T().internalJsonRead(jsonItem, options);
|
|
break;
|
|
case "enum":
|
|
val = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields);
|
|
if (val === false)
|
|
continue;
|
|
break;
|
|
case "scalar":
|
|
val = this.scalar(jsonItem, field.T, field.L, field.name);
|
|
break;
|
|
}
|
|
this.assert(val !== undefined, field.name, jsonValue);
|
|
fieldArr.push(val);
|
|
}
|
|
}
|
|
else {
|
|
switch (field.kind) {
|
|
case "message":
|
|
if (jsonValue === null && field.T().typeName != 'google.protobuf.Value') {
|
|
this.assert(field.oneof === undefined, field.name + " (oneof member)", null);
|
|
continue;
|
|
}
|
|
target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]);
|
|
break;
|
|
case "enum":
|
|
if (jsonValue === null)
|
|
continue;
|
|
let val = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields);
|
|
if (val === false)
|
|
continue;
|
|
target[localName] = val;
|
|
break;
|
|
case "scalar":
|
|
if (jsonValue === null)
|
|
continue;
|
|
target[localName] = this.scalar(jsonValue, field.T, field.L, field.name);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Returns `false` for unrecognized string representations.
|
|
*
|
|
* google.protobuf.NullValue accepts only JSON `null` (or the old `"NULL_VALUE"`).
|
|
*/
|
|
enum(type, json, fieldName, ignoreUnknownFields) {
|
|
if (type[0] == 'google.protobuf.NullValue')
|
|
assert_1.assert(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`);
|
|
if (json === null)
|
|
// we require 0 to be default value for all enums
|
|
return 0;
|
|
switch (typeof json) {
|
|
case "number":
|
|
assert_1.assert(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`);
|
|
return json;
|
|
case "string":
|
|
let localEnumName = json;
|
|
if (type[2] && json.substring(0, type[2].length) === type[2])
|
|
// lookup without the shared prefix
|
|
localEnumName = json.substring(type[2].length);
|
|
let enumNumber = type[1][localEnumName];
|
|
if (typeof enumNumber === 'undefined' && ignoreUnknownFields) {
|
|
return false;
|
|
}
|
|
assert_1.assert(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`);
|
|
return enumNumber;
|
|
}
|
|
assert_1.assert(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`);
|
|
}
|
|
scalar(json, type, longType, fieldName) {
|
|
let e;
|
|
try {
|
|
switch (type) {
|
|
// float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
|
|
// Either numbers or strings are accepted. Exponent notation is also accepted.
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
if (json === null)
|
|
return .0;
|
|
if (json === "NaN")
|
|
return Number.NaN;
|
|
if (json === "Infinity")
|
|
return Number.POSITIVE_INFINITY;
|
|
if (json === "-Infinity")
|
|
return Number.NEGATIVE_INFINITY;
|
|
if (json === "") {
|
|
e = "empty string";
|
|
break;
|
|
}
|
|
if (typeof json == "string" && json.trim().length !== json.length) {
|
|
e = "extra whitespace";
|
|
break;
|
|
}
|
|
if (typeof json != "string" && typeof json != "number") {
|
|
break;
|
|
}
|
|
let float = Number(json);
|
|
if (Number.isNaN(float)) {
|
|
e = "not a number";
|
|
break;
|
|
}
|
|
if (!Number.isFinite(float)) {
|
|
// infinity and -infinity are handled by string representation above, so this is an error
|
|
e = "too large or small";
|
|
break;
|
|
}
|
|
if (type == reflection_info_1.ScalarType.FLOAT)
|
|
assert_1.assertFloat32(float);
|
|
return float;
|
|
// int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
|
|
case reflection_info_1.ScalarType.INT32:
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
if (json === null)
|
|
return 0;
|
|
let int32;
|
|
if (typeof json == "number")
|
|
int32 = json;
|
|
else if (json === "")
|
|
e = "empty string";
|
|
else if (typeof json == "string") {
|
|
if (json.trim().length !== json.length)
|
|
e = "extra whitespace";
|
|
else
|
|
int32 = Number(json);
|
|
}
|
|
if (int32 === undefined)
|
|
break;
|
|
if (type == reflection_info_1.ScalarType.UINT32)
|
|
assert_1.assertUInt32(int32);
|
|
else
|
|
assert_1.assertInt32(int32);
|
|
return int32;
|
|
// int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.
|
|
case reflection_info_1.ScalarType.INT64:
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
if (json === null)
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.ZERO, longType);
|
|
if (typeof json != "number" && typeof json != "string")
|
|
break;
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.from(json), longType);
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
if (json === null)
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.ZERO, longType);
|
|
if (typeof json != "number" && typeof json != "string")
|
|
break;
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.from(json), longType);
|
|
// bool:
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
if (json === null)
|
|
return false;
|
|
if (typeof json !== "boolean")
|
|
break;
|
|
return json;
|
|
// string:
|
|
case reflection_info_1.ScalarType.STRING:
|
|
if (json === null)
|
|
return "";
|
|
if (typeof json !== "string") {
|
|
e = "extra whitespace";
|
|
break;
|
|
}
|
|
try {
|
|
encodeURIComponent(json);
|
|
}
|
|
catch (e) {
|
|
e = "invalid UTF8";
|
|
break;
|
|
}
|
|
return json;
|
|
// bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
|
|
// Either standard or URL-safe base64 encoding with/without paddings are accepted.
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
if (json === null || json === "")
|
|
return new Uint8Array(0);
|
|
if (typeof json !== 'string')
|
|
break;
|
|
return base64_1.base64decode(json);
|
|
}
|
|
}
|
|
catch (error) {
|
|
e = error.message;
|
|
}
|
|
this.assert(false, fieldName + (e ? " - " + e : ""), json);
|
|
}
|
|
}
|
|
exports.ReflectionJsonReader = ReflectionJsonReader;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 1094:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ReflectionJsonWriter = void 0;
|
|
const base64_1 = __webpack_require__(6335);
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const assert_1 = __webpack_require__(8602);
|
|
/**
|
|
* Writes proto3 messages in canonical JSON format using reflection
|
|
* information.
|
|
*
|
|
* https://developers.google.com/protocol-buffers/docs/proto3#json
|
|
*/
|
|
class ReflectionJsonWriter {
|
|
constructor(info) {
|
|
var _a;
|
|
this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
|
|
}
|
|
/**
|
|
* Converts the message to a JSON object, based on the field descriptors.
|
|
*/
|
|
write(message, options) {
|
|
const json = {}, source = message;
|
|
for (const field of this.fields) {
|
|
// field is not part of a oneof, simply write as is
|
|
if (!field.oneof) {
|
|
let jsonValue = this.field(field, source[field.localName], options);
|
|
if (jsonValue !== undefined)
|
|
json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
|
|
continue;
|
|
}
|
|
// field is part of a oneof
|
|
const group = source[field.oneof];
|
|
if (group.oneofKind !== field.localName)
|
|
continue; // not selected, skip
|
|
const opt = field.kind == 'scalar' || field.kind == 'enum'
|
|
? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options;
|
|
let jsonValue = this.field(field, group[field.localName], opt);
|
|
assert_1.assert(jsonValue !== undefined);
|
|
json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;
|
|
}
|
|
return json;
|
|
}
|
|
field(field, value, options) {
|
|
let jsonValue = undefined;
|
|
if (field.kind == 'map') {
|
|
assert_1.assert(typeof value == "object" && value !== null);
|
|
const jsonObj = {};
|
|
switch (field.V.kind) {
|
|
case "scalar":
|
|
for (const [entryKey, entryValue] of Object.entries(value)) {
|
|
const val = this.scalar(field.V.T, entryValue, field.name, false, true);
|
|
assert_1.assert(val !== undefined);
|
|
jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
|
|
}
|
|
break;
|
|
case "message":
|
|
const messageType = field.V.T();
|
|
for (const [entryKey, entryValue] of Object.entries(value)) {
|
|
const val = this.message(messageType, entryValue, field.name, options);
|
|
assert_1.assert(val !== undefined);
|
|
jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
|
|
}
|
|
break;
|
|
case "enum":
|
|
const enumInfo = field.V.T();
|
|
for (const [entryKey, entryValue] of Object.entries(value)) {
|
|
assert_1.assert(entryValue === undefined || typeof entryValue == 'number');
|
|
const val = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger);
|
|
assert_1.assert(val !== undefined);
|
|
jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
|
|
}
|
|
break;
|
|
}
|
|
if (options.emitDefaultValues || Object.keys(jsonObj).length > 0)
|
|
jsonValue = jsonObj;
|
|
}
|
|
else if (field.repeat) {
|
|
assert_1.assert(Array.isArray(value));
|
|
const jsonArr = [];
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
for (let i = 0; i < value.length; i++) {
|
|
const val = this.scalar(field.T, value[i], field.name, field.opt, true);
|
|
assert_1.assert(val !== undefined);
|
|
jsonArr.push(val);
|
|
}
|
|
break;
|
|
case "enum":
|
|
const enumInfo = field.T();
|
|
for (let i = 0; i < value.length; i++) {
|
|
assert_1.assert(value[i] === undefined || typeof value[i] == 'number');
|
|
const val = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger);
|
|
assert_1.assert(val !== undefined);
|
|
jsonArr.push(val);
|
|
}
|
|
break;
|
|
case "message":
|
|
const messageType = field.T();
|
|
for (let i = 0; i < value.length; i++) {
|
|
const val = this.message(messageType, value[i], field.name, options);
|
|
assert_1.assert(val !== undefined);
|
|
jsonArr.push(val);
|
|
}
|
|
break;
|
|
}
|
|
// add converted array to json output
|
|
if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues)
|
|
jsonValue = jsonArr;
|
|
}
|
|
else {
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues);
|
|
break;
|
|
case "enum":
|
|
jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger);
|
|
break;
|
|
case "message":
|
|
jsonValue = this.message(field.T(), value, field.name, options);
|
|
break;
|
|
}
|
|
}
|
|
return jsonValue;
|
|
}
|
|
/**
|
|
* Returns `null` as the default for google.protobuf.NullValue.
|
|
*/
|
|
enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) {
|
|
if (type[0] == 'google.protobuf.NullValue')
|
|
return !emitDefaultValues && !optional ? undefined : null;
|
|
if (value === undefined) {
|
|
assert_1.assert(optional);
|
|
return undefined;
|
|
}
|
|
if (value === 0 && !emitDefaultValues && !optional)
|
|
// we require 0 to be default value for all enums
|
|
return undefined;
|
|
assert_1.assert(typeof value == 'number');
|
|
assert_1.assert(Number.isInteger(value));
|
|
if (enumAsInteger || !type[1].hasOwnProperty(value))
|
|
// if we don't now the enum value, just return the number
|
|
return value;
|
|
if (type[2])
|
|
// restore the dropped prefix
|
|
return type[2] + type[1][value];
|
|
return type[1][value];
|
|
}
|
|
message(type, value, fieldName, options) {
|
|
if (value === undefined)
|
|
return options.emitDefaultValues ? null : undefined;
|
|
return type.internalJsonWrite(value, options);
|
|
}
|
|
scalar(type, value, fieldName, optional, emitDefaultValues) {
|
|
if (value === undefined) {
|
|
assert_1.assert(optional);
|
|
return undefined;
|
|
}
|
|
const ed = emitDefaultValues || optional;
|
|
// noinspection FallThroughInSwitchStatementJS
|
|
switch (type) {
|
|
// int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.
|
|
case reflection_info_1.ScalarType.INT32:
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
if (value === 0)
|
|
return ed ? 0 : undefined;
|
|
assert_1.assertInt32(value);
|
|
return value;
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
if (value === 0)
|
|
return ed ? 0 : undefined;
|
|
assert_1.assertUInt32(value);
|
|
return value;
|
|
// float, double: JSON value will be a number or one of the special string values "NaN", "Infinity", and "-Infinity".
|
|
// Either numbers or strings are accepted. Exponent notation is also accepted.
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
assert_1.assertFloat32(value);
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
if (value === 0)
|
|
return ed ? 0 : undefined;
|
|
assert_1.assert(typeof value == 'number');
|
|
if (Number.isNaN(value))
|
|
return 'NaN';
|
|
if (value === Number.POSITIVE_INFINITY)
|
|
return 'Infinity';
|
|
if (value === Number.NEGATIVE_INFINITY)
|
|
return '-Infinity';
|
|
return value;
|
|
// string:
|
|
case reflection_info_1.ScalarType.STRING:
|
|
if (value === "")
|
|
return ed ? '' : undefined;
|
|
assert_1.assert(typeof value == 'string');
|
|
return value;
|
|
// bool:
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
if (value === false)
|
|
return ed ? false : undefined;
|
|
assert_1.assert(typeof value == 'boolean');
|
|
return value;
|
|
// JSON value will be a decimal string. Either numbers or strings are accepted.
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
assert_1.assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
|
|
let ulong = pb_long_1.PbULong.from(value);
|
|
if (ulong.isZero() && !ed)
|
|
return undefined;
|
|
return ulong.toString();
|
|
// JSON value will be a decimal string. Either numbers or strings are accepted.
|
|
case reflection_info_1.ScalarType.INT64:
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
assert_1.assert(typeof value == 'number' || typeof value == 'string' || typeof value == 'bigint');
|
|
let long = pb_long_1.PbLong.from(value);
|
|
if (long.isZero() && !ed)
|
|
return undefined;
|
|
return long.toString();
|
|
// bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
|
|
// Either standard or URL-safe base64 encoding with/without paddings are accepted.
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
assert_1.assert(value instanceof Uint8Array);
|
|
if (!value.byteLength)
|
|
return ed ? "" : undefined;
|
|
return base64_1.base64encode(value);
|
|
}
|
|
}
|
|
}
|
|
exports.ReflectionJsonWriter = ReflectionJsonWriter;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3402:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.reflectionLongConvert = void 0;
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
/**
|
|
* Utility method to convert a PbLong or PbUlong to a JavaScript
|
|
* representation during runtime.
|
|
*
|
|
* Works with generated field information, `undefined` is equivalent
|
|
* to `STRING`.
|
|
*/
|
|
function reflectionLongConvert(long, type) {
|
|
switch (type) {
|
|
case reflection_info_1.LongType.BIGINT:
|
|
return long.toBigInt();
|
|
case reflection_info_1.LongType.NUMBER:
|
|
return long.toNumber();
|
|
default:
|
|
// case undefined:
|
|
// case LongType.STRING:
|
|
return long.toString();
|
|
}
|
|
}
|
|
exports.reflectionLongConvert = reflectionLongConvert;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8044:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.reflectionMergePartial = void 0;
|
|
/**
|
|
* Copy partial data into the target message.
|
|
*
|
|
* If a singular scalar or enum field is present in the source, it
|
|
* replaces the field in the target.
|
|
*
|
|
* If a singular message field is present in the source, it is merged
|
|
* with the target field by calling mergePartial() of the responsible
|
|
* message type.
|
|
*
|
|
* If a repeated field is present in the source, its values replace
|
|
* all values in the target array, removing extraneous values.
|
|
* Repeated message fields are copied, not merged.
|
|
*
|
|
* If a map field is present in the source, entries are added to the
|
|
* target map, replacing entries with the same key. Entries that only
|
|
* exist in the target remain. Entries with message values are copied,
|
|
* not merged.
|
|
*
|
|
* Note that this function differs from protobuf merge semantics,
|
|
* which appends repeated fields.
|
|
*/
|
|
function reflectionMergePartial(info, target, source) {
|
|
let fieldValue, // the field value we are working with
|
|
input = source, output; // where we want our field value to go
|
|
for (let field of info.fields) {
|
|
let name = field.localName;
|
|
if (field.oneof) {
|
|
const group = input[field.oneof]; // this is the oneof`s group in the source
|
|
if ((group === null || group === void 0 ? void 0 : group.oneofKind) == undefined) { // the user is free to omit
|
|
continue; // we skip this field, and all other members too
|
|
}
|
|
fieldValue = group[name]; // our value comes from the the oneof group of the source
|
|
output = target[field.oneof]; // and our output is the oneof group of the target
|
|
output.oneofKind = group.oneofKind; // always update discriminator
|
|
if (fieldValue == undefined) {
|
|
delete output[name]; // remove any existing value
|
|
continue; // skip further work on field
|
|
}
|
|
}
|
|
else {
|
|
fieldValue = input[name]; // we are using the source directly
|
|
output = target; // we want our field value to go directly into the target
|
|
if (fieldValue == undefined) {
|
|
continue; // skip further work on field, existing value is used as is
|
|
}
|
|
}
|
|
if (field.repeat)
|
|
output[name].length = fieldValue.length; // resize target array to match source array
|
|
// now we just work with `fieldValue` and `output` to merge the value
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
case "enum":
|
|
if (field.repeat)
|
|
for (let i = 0; i < fieldValue.length; i++)
|
|
output[name][i] = fieldValue[i]; // not a reference type
|
|
else
|
|
output[name] = fieldValue; // not a reference type
|
|
break;
|
|
case "message":
|
|
let T = field.T();
|
|
if (field.repeat)
|
|
for (let i = 0; i < fieldValue.length; i++)
|
|
output[name][i] = T.create(fieldValue[i]);
|
|
else if (output[name] === undefined)
|
|
output[name] = T.create(fieldValue); // nothing to merge with
|
|
else
|
|
T.mergePartial(output[name], fieldValue);
|
|
break;
|
|
case "map":
|
|
// Map and repeated fields are simply overwritten, not appended or merged
|
|
switch (field.V.kind) {
|
|
case "scalar":
|
|
case "enum":
|
|
Object.assign(output[name], fieldValue); // elements are not reference types
|
|
break;
|
|
case "message":
|
|
let T = field.V.T();
|
|
for (let k of Object.keys(fieldValue))
|
|
output[name][k] = T.create(fieldValue[k]);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
exports.reflectionMergePartial = reflectionMergePartial;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9526:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.reflectionScalarDefault = void 0;
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const reflection_long_convert_1 = __webpack_require__(3402);
|
|
const pb_long_1 = __webpack_require__(1753);
|
|
/**
|
|
* Creates the default value for a scalar type.
|
|
*/
|
|
function reflectionScalarDefault(type, longType = reflection_info_1.LongType.STRING) {
|
|
switch (type) {
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
return false;
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.ZERO, longType);
|
|
case reflection_info_1.ScalarType.INT64:
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.ZERO, longType);
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
return 0.0;
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
return new Uint8Array(0);
|
|
case reflection_info_1.ScalarType.STRING:
|
|
return "";
|
|
default:
|
|
// case ScalarType.INT32:
|
|
// case ScalarType.UINT32:
|
|
// case ScalarType.SINT32:
|
|
// case ScalarType.FIXED32:
|
|
// case ScalarType.SFIXED32:
|
|
return 0;
|
|
}
|
|
}
|
|
exports.reflectionScalarDefault = reflectionScalarDefault;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5167:
|
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
|
|
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.ReflectionTypeCheck = void 0;
|
|
const reflection_info_1 = __webpack_require__(7910);
|
|
const oneof_1 = __webpack_require__(8063);
|
|
// noinspection JSMethodCanBeStatic
|
|
class ReflectionTypeCheck {
|
|
constructor(info) {
|
|
var _a;
|
|
this.fields = (_a = info.fields) !== null && _a !== void 0 ? _a : [];
|
|
}
|
|
prepare() {
|
|
if (this.data)
|
|
return;
|
|
const req = [], known = [], oneofs = [];
|
|
for (let field of this.fields) {
|
|
if (field.oneof) {
|
|
if (!oneofs.includes(field.oneof)) {
|
|
oneofs.push(field.oneof);
|
|
req.push(field.oneof);
|
|
known.push(field.oneof);
|
|
}
|
|
}
|
|
else {
|
|
known.push(field.localName);
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
case "enum":
|
|
if (!field.opt || field.repeat)
|
|
req.push(field.localName);
|
|
break;
|
|
case "message":
|
|
if (field.repeat)
|
|
req.push(field.localName);
|
|
break;
|
|
case "map":
|
|
req.push(field.localName);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
this.data = { req, known, oneofs: Object.values(oneofs) };
|
|
}
|
|
/**
|
|
* Is the argument a valid message as specified by the
|
|
* reflection information?
|
|
*
|
|
* Checks all field types recursively. The `depth`
|
|
* specifies how deep into the structure the check will be.
|
|
*
|
|
* With a depth of 0, only the presence of fields
|
|
* is checked.
|
|
*
|
|
* With a depth of 1 or more, the field types are checked.
|
|
*
|
|
* With a depth of 2 or more, the members of map, repeated
|
|
* and message fields are checked.
|
|
*
|
|
* Message fields will be checked recursively with depth - 1.
|
|
*
|
|
* The number of map entries / repeated values being checked
|
|
* is < depth.
|
|
*/
|
|
is(message, depth, allowExcessProperties = false) {
|
|
if (depth < 0)
|
|
return true;
|
|
if (message === null || message === undefined || typeof message != 'object')
|
|
return false;
|
|
this.prepare();
|
|
let keys = Object.keys(message), data = this.data;
|
|
// if a required field is missing in arg, this cannot be a T
|
|
if (keys.length < data.req.length || data.req.some(n => !keys.includes(n)))
|
|
return false;
|
|
if (!allowExcessProperties) {
|
|
// if the arg contains a key we dont know, this is not a literal T
|
|
if (keys.some(k => !data.known.includes(k)))
|
|
return false;
|
|
}
|
|
// "With a depth of 0, only the presence and absence of fields is checked."
|
|
// "With a depth of 1 or more, the field types are checked."
|
|
if (depth < 1) {
|
|
return true;
|
|
}
|
|
// check oneof group
|
|
for (const name of data.oneofs) {
|
|
const group = message[name];
|
|
if (!oneof_1.isOneofGroup(group))
|
|
return false;
|
|
if (group.oneofKind === undefined)
|
|
continue;
|
|
const field = this.fields.find(f => f.localName === group.oneofKind);
|
|
if (!field)
|
|
return false; // we found no field, but have a kind, something is wrong
|
|
if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth))
|
|
return false;
|
|
}
|
|
// check types
|
|
for (const field of this.fields) {
|
|
if (field.oneof !== undefined)
|
|
continue;
|
|
if (!this.field(message[field.localName], field, allowExcessProperties, depth))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
field(arg, field, allowExcessProperties, depth) {
|
|
let repeated = field.repeat;
|
|
switch (field.kind) {
|
|
case "scalar":
|
|
if (arg === undefined)
|
|
return field.opt;
|
|
if (repeated)
|
|
return this.scalars(arg, field.T, depth, field.L);
|
|
return this.scalar(arg, field.T, field.L);
|
|
case "enum":
|
|
if (arg === undefined)
|
|
return field.opt;
|
|
if (repeated)
|
|
return this.scalars(arg, reflection_info_1.ScalarType.INT32, depth);
|
|
return this.scalar(arg, reflection_info_1.ScalarType.INT32);
|
|
case "message":
|
|
if (arg === undefined)
|
|
return true;
|
|
if (repeated)
|
|
return this.messages(arg, field.T(), allowExcessProperties, depth);
|
|
return this.message(arg, field.T(), allowExcessProperties, depth);
|
|
case "map":
|
|
if (typeof arg != 'object' || arg === null)
|
|
return false;
|
|
if (depth < 2)
|
|
return true;
|
|
if (!this.mapKeys(arg, field.K, depth))
|
|
return false;
|
|
switch (field.V.kind) {
|
|
case "scalar":
|
|
return this.scalars(Object.values(arg), field.V.T, depth, field.V.L);
|
|
case "enum":
|
|
return this.scalars(Object.values(arg), reflection_info_1.ScalarType.INT32, depth);
|
|
case "message":
|
|
return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth);
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
message(arg, type, allowExcessProperties, depth) {
|
|
if (allowExcessProperties) {
|
|
return type.isAssignable(arg, depth);
|
|
}
|
|
return type.is(arg, depth);
|
|
}
|
|
messages(arg, type, allowExcessProperties, depth) {
|
|
if (!Array.isArray(arg))
|
|
return false;
|
|
if (depth < 2)
|
|
return true;
|
|
if (allowExcessProperties) {
|
|
for (let i = 0; i < arg.length && i < depth; i++)
|
|
if (!type.isAssignable(arg[i], depth - 1))
|
|
return false;
|
|
}
|
|
else {
|
|
for (let i = 0; i < arg.length && i < depth; i++)
|
|
if (!type.is(arg[i], depth - 1))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
scalar(arg, type, longType) {
|
|
let argType = typeof arg;
|
|
switch (type) {
|
|
case reflection_info_1.ScalarType.UINT64:
|
|
case reflection_info_1.ScalarType.FIXED64:
|
|
case reflection_info_1.ScalarType.INT64:
|
|
case reflection_info_1.ScalarType.SFIXED64:
|
|
case reflection_info_1.ScalarType.SINT64:
|
|
switch (longType) {
|
|
case reflection_info_1.LongType.BIGINT:
|
|
return argType == "bigint";
|
|
case reflection_info_1.LongType.NUMBER:
|
|
return argType == "number" && !isNaN(arg);
|
|
default:
|
|
return argType == "string";
|
|
}
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
return argType == 'boolean';
|
|
case reflection_info_1.ScalarType.STRING:
|
|
return argType == 'string';
|
|
case reflection_info_1.ScalarType.BYTES:
|
|
return arg instanceof Uint8Array;
|
|
case reflection_info_1.ScalarType.DOUBLE:
|
|
case reflection_info_1.ScalarType.FLOAT:
|
|
return argType == 'number' && !isNaN(arg);
|
|
default:
|
|
// case ScalarType.UINT32:
|
|
// case ScalarType.FIXED32:
|
|
// case ScalarType.INT32:
|
|
// case ScalarType.SINT32:
|
|
// case ScalarType.SFIXED32:
|
|
return argType == 'number' && Number.isInteger(arg);
|
|
}
|
|
}
|
|
scalars(arg, type, depth, longType) {
|
|
if (!Array.isArray(arg))
|
|
return false;
|
|
if (depth < 2)
|
|
return true;
|
|
if (Array.isArray(arg))
|
|
for (let i = 0; i < arg.length && i < depth; i++)
|
|
if (!this.scalar(arg[i], type, longType))
|
|
return false;
|
|
return true;
|
|
}
|
|
mapKeys(map, type, depth) {
|
|
let keys = Object.keys(map);
|
|
switch (type) {
|
|
case reflection_info_1.ScalarType.INT32:
|
|
case reflection_info_1.ScalarType.FIXED32:
|
|
case reflection_info_1.ScalarType.SFIXED32:
|
|
case reflection_info_1.ScalarType.SINT32:
|
|
case reflection_info_1.ScalarType.UINT32:
|
|
return this.scalars(keys.slice(0, depth).map(k => parseInt(k)), type, depth);
|
|
case reflection_info_1.ScalarType.BOOL:
|
|
return this.scalars(keys.slice(0, depth).map(k => k == 'true' ? true : k == 'false' ? false : k), type, depth);
|
|
default:
|
|
return this.scalars(keys, type, depth, reflection_info_1.LongType.STRING);
|
|
}
|
|
}
|
|
}
|
|
exports.ReflectionTypeCheck = ReflectionTypeCheck;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5183:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.req = exports.json = exports.toBuffer = void 0;
|
|
const http = __importStar(__webpack_require__(8611));
|
|
const https = __importStar(__webpack_require__(5692));
|
|
async function toBuffer(stream) {
|
|
let length = 0;
|
|
const chunks = [];
|
|
for await (const chunk of stream) {
|
|
length += chunk.length;
|
|
chunks.push(chunk);
|
|
}
|
|
return Buffer.concat(chunks, length);
|
|
}
|
|
exports.toBuffer = toBuffer;
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
async function json(stream) {
|
|
const buf = await toBuffer(stream);
|
|
const str = buf.toString('utf8');
|
|
try {
|
|
return JSON.parse(str);
|
|
}
|
|
catch (_err) {
|
|
const err = _err;
|
|
err.message += ` (input: ${str})`;
|
|
throw err;
|
|
}
|
|
}
|
|
exports.json = json;
|
|
function req(url, opts = {}) {
|
|
const href = typeof url === 'string' ? url : url.href;
|
|
const req = (href.startsWith('https:') ? https : http).request(url, opts);
|
|
const promise = new Promise((resolve, reject) => {
|
|
req
|
|
.once('response', resolve)
|
|
.once('error', reject)
|
|
.end();
|
|
});
|
|
req.then = promise.then.bind(promise);
|
|
return req;
|
|
}
|
|
exports.req = req;
|
|
//# sourceMappingURL=helpers.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8894:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.Agent = void 0;
|
|
const net = __importStar(__webpack_require__(9278));
|
|
const http = __importStar(__webpack_require__(8611));
|
|
const https_1 = __webpack_require__(5692);
|
|
__exportStar(__webpack_require__(5183), exports);
|
|
const INTERNAL = Symbol('AgentBaseInternalState');
|
|
class Agent extends http.Agent {
|
|
constructor(opts) {
|
|
super(opts);
|
|
this[INTERNAL] = {};
|
|
}
|
|
/**
|
|
* Determine whether this is an `http` or `https` request.
|
|
*/
|
|
isSecureEndpoint(options) {
|
|
if (options) {
|
|
// First check the `secureEndpoint` property explicitly, since this
|
|
// means that a parent `Agent` is "passing through" to this instance.
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
if (typeof options.secureEndpoint === 'boolean') {
|
|
return options.secureEndpoint;
|
|
}
|
|
// If no explicit `secure` endpoint, check if `protocol` property is
|
|
// set. This will usually be the case since using a full string URL
|
|
// or `URL` instance should be the most common usage.
|
|
if (typeof options.protocol === 'string') {
|
|
return options.protocol === 'https:';
|
|
}
|
|
}
|
|
// Finally, if no `protocol` property was set, then fall back to
|
|
// checking the stack trace of the current call stack, and try to
|
|
// detect the "https" module.
|
|
const { stack } = new Error();
|
|
if (typeof stack !== 'string')
|
|
return false;
|
|
return stack
|
|
.split('\n')
|
|
.some((l) => l.indexOf('(https.js:') !== -1 ||
|
|
l.indexOf('node:https:') !== -1);
|
|
}
|
|
// In order to support async signatures in `connect()` and Node's native
|
|
// connection pooling in `http.Agent`, the array of sockets for each origin
|
|
// has to be updated synchronously. This is so the length of the array is
|
|
// accurate when `addRequest()` is next called. We achieve this by creating a
|
|
// fake socket and adding it to `sockets[origin]` and incrementing
|
|
// `totalSocketCount`.
|
|
incrementSockets(name) {
|
|
// If `maxSockets` and `maxTotalSockets` are both Infinity then there is no
|
|
// need to create a fake socket because Node.js native connection pooling
|
|
// will never be invoked.
|
|
if (this.maxSockets === Infinity && this.maxTotalSockets === Infinity) {
|
|
return null;
|
|
}
|
|
// All instances of `sockets` are expected TypeScript errors. The
|
|
// alternative is to add it as a private property of this class but that
|
|
// will break TypeScript subclassing.
|
|
if (!this.sockets[name]) {
|
|
// @ts-expect-error `sockets` is readonly in `@types/node`
|
|
this.sockets[name] = [];
|
|
}
|
|
const fakeSocket = new net.Socket({ writable: false });
|
|
this.sockets[name].push(fakeSocket);
|
|
// @ts-expect-error `totalSocketCount` isn't defined in `@types/node`
|
|
this.totalSocketCount++;
|
|
return fakeSocket;
|
|
}
|
|
decrementSockets(name, socket) {
|
|
if (!this.sockets[name] || socket === null) {
|
|
return;
|
|
}
|
|
const sockets = this.sockets[name];
|
|
const index = sockets.indexOf(socket);
|
|
if (index !== -1) {
|
|
sockets.splice(index, 1);
|
|
// @ts-expect-error `totalSocketCount` isn't defined in `@types/node`
|
|
this.totalSocketCount--;
|
|
if (sockets.length === 0) {
|
|
// @ts-expect-error `sockets` is readonly in `@types/node`
|
|
delete this.sockets[name];
|
|
}
|
|
}
|
|
}
|
|
// In order to properly update the socket pool, we need to call `getName()` on
|
|
// the core `https.Agent` if it is a secureEndpoint.
|
|
getName(options) {
|
|
const secureEndpoint = this.isSecureEndpoint(options);
|
|
if (secureEndpoint) {
|
|
// @ts-expect-error `getName()` isn't defined in `@types/node`
|
|
return https_1.Agent.prototype.getName.call(this, options);
|
|
}
|
|
// @ts-expect-error `getName()` isn't defined in `@types/node`
|
|
return super.getName(options);
|
|
}
|
|
createSocket(req, options, cb) {
|
|
const connectOpts = {
|
|
...options,
|
|
secureEndpoint: this.isSecureEndpoint(options),
|
|
};
|
|
const name = this.getName(connectOpts);
|
|
const fakeSocket = this.incrementSockets(name);
|
|
Promise.resolve()
|
|
.then(() => this.connect(req, connectOpts))
|
|
.then((socket) => {
|
|
this.decrementSockets(name, fakeSocket);
|
|
if (socket instanceof http.Agent) {
|
|
try {
|
|
// @ts-expect-error `addRequest()` isn't defined in `@types/node`
|
|
return socket.addRequest(req, connectOpts);
|
|
}
|
|
catch (err) {
|
|
return cb(err);
|
|
}
|
|
}
|
|
this[INTERNAL].currentSocket = socket;
|
|
// @ts-expect-error `createSocket()` isn't defined in `@types/node`
|
|
super.createSocket(req, options, cb);
|
|
}, (err) => {
|
|
this.decrementSockets(name, fakeSocket);
|
|
cb(err);
|
|
});
|
|
}
|
|
createConnection() {
|
|
const socket = this[INTERNAL].currentSocket;
|
|
this[INTERNAL].currentSocket = undefined;
|
|
if (!socket) {
|
|
throw new Error('No socket was returned in the `connect()` function');
|
|
}
|
|
return socket;
|
|
}
|
|
get defaultPort() {
|
|
return (this[INTERNAL].defaultPort ??
|
|
(this.protocol === 'https:' ? 443 : 80));
|
|
}
|
|
set defaultPort(v) {
|
|
if (this[INTERNAL]) {
|
|
this[INTERNAL].defaultPort = v;
|
|
}
|
|
}
|
|
get protocol() {
|
|
return (this[INTERNAL].protocol ??
|
|
(this.isSecureEndpoint() ? 'https:' : 'http:'));
|
|
}
|
|
set protocol(v) {
|
|
if (this[INTERNAL]) {
|
|
this[INTERNAL].protocol = v;
|
|
}
|
|
}
|
|
}
|
|
exports.Agent = Agent;
|
|
//# sourceMappingURL=index.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7087:
|
|
/***/ ((module) => {
|
|
|
|
module.exports = function (xs, fn) {
|
|
var res = [];
|
|
for (var i = 0; i < xs.length; i++) {
|
|
var x = fn(xs[i], i);
|
|
if (isArray(x)) res.push.apply(res, x);
|
|
else res.push(x);
|
|
}
|
|
return res;
|
|
};
|
|
|
|
var isArray = Array.isArray || function (xs) {
|
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 6110:
|
|
/***/ ((module, exports, __webpack_require__) => {
|
|
|
|
/* eslint-env browser */
|
|
|
|
/**
|
|
* This is the web browser implementation of `debug()`.
|
|
*/
|
|
|
|
exports.formatArgs = formatArgs;
|
|
exports.save = save;
|
|
exports.load = load;
|
|
exports.useColors = useColors;
|
|
exports.storage = localstorage();
|
|
exports.destroy = (() => {
|
|
let warned = false;
|
|
|
|
return () => {
|
|
if (!warned) {
|
|
warned = true;
|
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
|
}
|
|
};
|
|
})();
|
|
|
|
/**
|
|
* Colors.
|
|
*/
|
|
|
|
exports.colors = [
|
|
'#0000CC',
|
|
'#0000FF',
|
|
'#0033CC',
|
|
'#0033FF',
|
|
'#0066CC',
|
|
'#0066FF',
|
|
'#0099CC',
|
|
'#0099FF',
|
|
'#00CC00',
|
|
'#00CC33',
|
|
'#00CC66',
|
|
'#00CC99',
|
|
'#00CCCC',
|
|
'#00CCFF',
|
|
'#3300CC',
|
|
'#3300FF',
|
|
'#3333CC',
|
|
'#3333FF',
|
|
'#3366CC',
|
|
'#3366FF',
|
|
'#3399CC',
|
|
'#3399FF',
|
|
'#33CC00',
|
|
'#33CC33',
|
|
'#33CC66',
|
|
'#33CC99',
|
|
'#33CCCC',
|
|
'#33CCFF',
|
|
'#6600CC',
|
|
'#6600FF',
|
|
'#6633CC',
|
|
'#6633FF',
|
|
'#66CC00',
|
|
'#66CC33',
|
|
'#9900CC',
|
|
'#9900FF',
|
|
'#9933CC',
|
|
'#9933FF',
|
|
'#99CC00',
|
|
'#99CC33',
|
|
'#CC0000',
|
|
'#CC0033',
|
|
'#CC0066',
|
|
'#CC0099',
|
|
'#CC00CC',
|
|
'#CC00FF',
|
|
'#CC3300',
|
|
'#CC3333',
|
|
'#CC3366',
|
|
'#CC3399',
|
|
'#CC33CC',
|
|
'#CC33FF',
|
|
'#CC6600',
|
|
'#CC6633',
|
|
'#CC9900',
|
|
'#CC9933',
|
|
'#CCCC00',
|
|
'#CCCC33',
|
|
'#FF0000',
|
|
'#FF0033',
|
|
'#FF0066',
|
|
'#FF0099',
|
|
'#FF00CC',
|
|
'#FF00FF',
|
|
'#FF3300',
|
|
'#FF3333',
|
|
'#FF3366',
|
|
'#FF3399',
|
|
'#FF33CC',
|
|
'#FF33FF',
|
|
'#FF6600',
|
|
'#FF6633',
|
|
'#FF9900',
|
|
'#FF9933',
|
|
'#FFCC00',
|
|
'#FFCC33'
|
|
];
|
|
|
|
/**
|
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
|
* and the Firebug extension (any Firefox version) are known
|
|
* to support "%c" CSS customizations.
|
|
*
|
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
|
*/
|
|
|
|
// eslint-disable-next-line complexity
|
|
function useColors() {
|
|
// NB: In an Electron preload script, document will be defined but not fully
|
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
|
// explicitly
|
|
if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
|
|
return true;
|
|
}
|
|
|
|
// Internet Explorer and Edge do not support colors.
|
|
if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
|
|
return false;
|
|
}
|
|
|
|
let m;
|
|
|
|
// Is webkit? http://stackoverflow.com/a/16459606/376773
|
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
|
// eslint-disable-next-line no-return-assign
|
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
|
// Is firebug? http://stackoverflow.com/a/398120/376773
|
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
|
// Is firefox >= v31?
|
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
|
(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) ||
|
|
// Double check webkit in userAgent just in case we are in a worker
|
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
|
}
|
|
|
|
/**
|
|
* Colorize log arguments if enabled.
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
function formatArgs(args) {
|
|
args[0] = (this.useColors ? '%c' : '') +
|
|
this.namespace +
|
|
(this.useColors ? ' %c' : ' ') +
|
|
args[0] +
|
|
(this.useColors ? '%c ' : ' ') +
|
|
'+' + module.exports.humanize(this.diff);
|
|
|
|
if (!this.useColors) {
|
|
return;
|
|
}
|
|
|
|
const c = 'color: ' + this.color;
|
|
args.splice(1, 0, c, 'color: inherit');
|
|
|
|
// The final "%c" is somewhat tricky, because there could be other
|
|
// arguments passed either before or after the %c, so we need to
|
|
// figure out the correct index to insert the CSS into
|
|
let index = 0;
|
|
let lastC = 0;
|
|
args[0].replace(/%[a-zA-Z%]/g, match => {
|
|
if (match === '%%') {
|
|
return;
|
|
}
|
|
index++;
|
|
if (match === '%c') {
|
|
// We only are interested in the *last* %c
|
|
// (the user may have provided their own)
|
|
lastC = index;
|
|
}
|
|
});
|
|
|
|
args.splice(lastC, 0, c);
|
|
}
|
|
|
|
/**
|
|
* Invokes `console.debug()` when available.
|
|
* No-op when `console.debug` is not a "function".
|
|
* If `console.debug` is not available, falls back
|
|
* to `console.log`.
|
|
*
|
|
* @api public
|
|
*/
|
|
exports.log = console.debug || console.log || (() => {});
|
|
|
|
/**
|
|
* Save `namespaces`.
|
|
*
|
|
* @param {String} namespaces
|
|
* @api private
|
|
*/
|
|
function save(namespaces) {
|
|
try {
|
|
if (namespaces) {
|
|
exports.storage.setItem('debug', namespaces);
|
|
} else {
|
|
exports.storage.removeItem('debug');
|
|
}
|
|
} catch (error) {
|
|
// Swallow
|
|
// XXX (@Qix-) should we be logging these?
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load `namespaces`.
|
|
*
|
|
* @return {String} returns the previously persisted debug modes
|
|
* @api private
|
|
*/
|
|
function load() {
|
|
let r;
|
|
try {
|
|
r = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;
|
|
} catch (error) {
|
|
// Swallow
|
|
// XXX (@Qix-) should we be logging these?
|
|
}
|
|
|
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
|
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
|
r = process.env.DEBUG;
|
|
}
|
|
|
|
return r;
|
|
}
|
|
|
|
/**
|
|
* Localstorage attempts to return the localstorage.
|
|
*
|
|
* This is necessary because safari throws
|
|
* when a user disables cookies/localstorage
|
|
* and you attempt to access it.
|
|
*
|
|
* @return {LocalStorage}
|
|
* @api private
|
|
*/
|
|
|
|
function localstorage() {
|
|
try {
|
|
// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
|
|
// The Browser also has localStorage in the global context.
|
|
return localStorage;
|
|
} catch (error) {
|
|
// Swallow
|
|
// XXX (@Qix-) should we be logging these?
|
|
}
|
|
}
|
|
|
|
module.exports = __webpack_require__(897)(exports);
|
|
|
|
const {formatters} = module.exports;
|
|
|
|
/**
|
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
|
*/
|
|
|
|
formatters.j = function (v) {
|
|
try {
|
|
return JSON.stringify(v);
|
|
} catch (error) {
|
|
return '[UnexpectedJSONParseError]: ' + error.message;
|
|
}
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 897:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
* This is the common logic for both the Node.js and web browser
|
|
* implementations of `debug()`.
|
|
*/
|
|
|
|
function setup(env) {
|
|
createDebug.debug = createDebug;
|
|
createDebug.default = createDebug;
|
|
createDebug.coerce = coerce;
|
|
createDebug.disable = disable;
|
|
createDebug.enable = enable;
|
|
createDebug.enabled = enabled;
|
|
createDebug.humanize = __webpack_require__(744);
|
|
createDebug.destroy = destroy;
|
|
|
|
Object.keys(env).forEach(key => {
|
|
createDebug[key] = env[key];
|
|
});
|
|
|
|
/**
|
|
* The currently active debug mode names, and names to skip.
|
|
*/
|
|
|
|
createDebug.names = [];
|
|
createDebug.skips = [];
|
|
|
|
/**
|
|
* Map of special "%n" handling functions, for the debug "format" argument.
|
|
*
|
|
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
|
*/
|
|
createDebug.formatters = {};
|
|
|
|
/**
|
|
* Selects a color for a debug namespace
|
|
* @param {String} namespace The namespace string for the debug instance to be colored
|
|
* @return {Number|String} An ANSI color code for the given namespace
|
|
* @api private
|
|
*/
|
|
function selectColor(namespace) {
|
|
let hash = 0;
|
|
|
|
for (let i = 0; i < namespace.length; i++) {
|
|
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
|
hash |= 0; // Convert to 32bit integer
|
|
}
|
|
|
|
return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
|
|
}
|
|
createDebug.selectColor = selectColor;
|
|
|
|
/**
|
|
* Create a debugger with the given `namespace`.
|
|
*
|
|
* @param {String} namespace
|
|
* @return {Function}
|
|
* @api public
|
|
*/
|
|
function createDebug(namespace) {
|
|
let prevTime;
|
|
let enableOverride = null;
|
|
let namespacesCache;
|
|
let enabledCache;
|
|
|
|
function debug(...args) {
|
|
// Disabled?
|
|
if (!debug.enabled) {
|
|
return;
|
|
}
|
|
|
|
const self = debug;
|
|
|
|
// Set `diff` timestamp
|
|
const curr = Number(new Date());
|
|
const ms = curr - (prevTime || curr);
|
|
self.diff = ms;
|
|
self.prev = prevTime;
|
|
self.curr = curr;
|
|
prevTime = curr;
|
|
|
|
args[0] = createDebug.coerce(args[0]);
|
|
|
|
if (typeof args[0] !== 'string') {
|
|
// Anything else let's inspect with %O
|
|
args.unshift('%O');
|
|
}
|
|
|
|
// Apply any `formatters` transformations
|
|
let index = 0;
|
|
args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
|
|
// If we encounter an escaped % then don't increase the array index
|
|
if (match === '%%') {
|
|
return '%';
|
|
}
|
|
index++;
|
|
const formatter = createDebug.formatters[format];
|
|
if (typeof formatter === 'function') {
|
|
const val = args[index];
|
|
match = formatter.call(self, val);
|
|
|
|
// Now we need to remove `args[index]` since it's inlined in the `format`
|
|
args.splice(index, 1);
|
|
index--;
|
|
}
|
|
return match;
|
|
});
|
|
|
|
// Apply env-specific formatting (colors, etc.)
|
|
createDebug.formatArgs.call(self, args);
|
|
|
|
const logFn = self.log || createDebug.log;
|
|
logFn.apply(self, args);
|
|
}
|
|
|
|
debug.namespace = namespace;
|
|
debug.useColors = createDebug.useColors();
|
|
debug.color = createDebug.selectColor(namespace);
|
|
debug.extend = extend;
|
|
debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
|
|
|
|
Object.defineProperty(debug, 'enabled', {
|
|
enumerable: true,
|
|
configurable: false,
|
|
get: () => {
|
|
if (enableOverride !== null) {
|
|
return enableOverride;
|
|
}
|
|
if (namespacesCache !== createDebug.namespaces) {
|
|
namespacesCache = createDebug.namespaces;
|
|
enabledCache = createDebug.enabled(namespace);
|
|
}
|
|
|
|
return enabledCache;
|
|
},
|
|
set: v => {
|
|
enableOverride = v;
|
|
}
|
|
});
|
|
|
|
// Env-specific initialization logic for debug instances
|
|
if (typeof createDebug.init === 'function') {
|
|
createDebug.init(debug);
|
|
}
|
|
|
|
return debug;
|
|
}
|
|
|
|
function extend(namespace, delimiter) {
|
|
const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
|
|
newDebug.log = this.log;
|
|
return newDebug;
|
|
}
|
|
|
|
/**
|
|
* Enables a debug mode by namespaces. This can include modes
|
|
* separated by a colon and wildcards.
|
|
*
|
|
* @param {String} namespaces
|
|
* @api public
|
|
*/
|
|
function enable(namespaces) {
|
|
createDebug.save(namespaces);
|
|
createDebug.namespaces = namespaces;
|
|
|
|
createDebug.names = [];
|
|
createDebug.skips = [];
|
|
|
|
const split = (typeof namespaces === 'string' ? namespaces : '')
|
|
.trim()
|
|
.replace(/\s+/g, ',')
|
|
.split(',')
|
|
.filter(Boolean);
|
|
|
|
for (const ns of split) {
|
|
if (ns[0] === '-') {
|
|
createDebug.skips.push(ns.slice(1));
|
|
} else {
|
|
createDebug.names.push(ns);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if the given string matches a namespace template, honoring
|
|
* asterisks as wildcards.
|
|
*
|
|
* @param {String} search
|
|
* @param {String} template
|
|
* @return {Boolean}
|
|
*/
|
|
function matchesTemplate(search, template) {
|
|
let searchIndex = 0;
|
|
let templateIndex = 0;
|
|
let starIndex = -1;
|
|
let matchIndex = 0;
|
|
|
|
while (searchIndex < search.length) {
|
|
if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
|
|
// Match character or proceed with wildcard
|
|
if (template[templateIndex] === '*') {
|
|
starIndex = templateIndex;
|
|
matchIndex = searchIndex;
|
|
templateIndex++; // Skip the '*'
|
|
} else {
|
|
searchIndex++;
|
|
templateIndex++;
|
|
}
|
|
} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
|
|
// Backtrack to the last '*' and try to match more characters
|
|
templateIndex = starIndex + 1;
|
|
matchIndex++;
|
|
searchIndex = matchIndex;
|
|
} else {
|
|
return false; // No match
|
|
}
|
|
}
|
|
|
|
// Handle trailing '*' in template
|
|
while (templateIndex < template.length && template[templateIndex] === '*') {
|
|
templateIndex++;
|
|
}
|
|
|
|
return templateIndex === template.length;
|
|
}
|
|
|
|
/**
|
|
* Disable debug output.
|
|
*
|
|
* @return {String} namespaces
|
|
* @api public
|
|
*/
|
|
function disable() {
|
|
const namespaces = [
|
|
...createDebug.names,
|
|
...createDebug.skips.map(namespace => '-' + namespace)
|
|
].join(',');
|
|
createDebug.enable('');
|
|
return namespaces;
|
|
}
|
|
|
|
/**
|
|
* Returns true if the given mode name is enabled, false otherwise.
|
|
*
|
|
* @param {String} name
|
|
* @return {Boolean}
|
|
* @api public
|
|
*/
|
|
function enabled(name) {
|
|
for (const skip of createDebug.skips) {
|
|
if (matchesTemplate(name, skip)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
for (const ns of createDebug.names) {
|
|
if (matchesTemplate(name, ns)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Coerce `val`.
|
|
*
|
|
* @param {Mixed} val
|
|
* @return {Mixed}
|
|
* @api private
|
|
*/
|
|
function coerce(val) {
|
|
if (val instanceof Error) {
|
|
return val.stack || val.message;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
/**
|
|
* XXX DO NOT USE. This is a temporary stub function.
|
|
* XXX It WILL be removed in the next major release.
|
|
*/
|
|
function destroy() {
|
|
console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
|
|
}
|
|
|
|
createDebug.enable(createDebug.load());
|
|
|
|
return createDebug;
|
|
}
|
|
|
|
module.exports = setup;
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 2830:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
/**
|
|
* Detect Electron renderer / nwjs process, which is node, but we should
|
|
* treat as a browser.
|
|
*/
|
|
|
|
if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
|
|
module.exports = __webpack_require__(6110);
|
|
} else {
|
|
module.exports = __webpack_require__(5108);
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5108:
|
|
/***/ ((module, exports, __webpack_require__) => {
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
const tty = __webpack_require__(2018);
|
|
const util = __webpack_require__(9023);
|
|
|
|
/**
|
|
* This is the Node.js implementation of `debug()`.
|
|
*/
|
|
|
|
exports.init = init;
|
|
exports.log = log;
|
|
exports.formatArgs = formatArgs;
|
|
exports.save = save;
|
|
exports.load = load;
|
|
exports.useColors = useColors;
|
|
exports.destroy = util.deprecate(
|
|
() => {},
|
|
'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
|
|
);
|
|
|
|
/**
|
|
* Colors.
|
|
*/
|
|
|
|
exports.colors = [6, 2, 3, 4, 5, 1];
|
|
|
|
try {
|
|
// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
|
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
const supportsColor = __webpack_require__(1450);
|
|
|
|
if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
|
|
exports.colors = [
|
|
20,
|
|
21,
|
|
26,
|
|
27,
|
|
32,
|
|
33,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
56,
|
|
57,
|
|
62,
|
|
63,
|
|
68,
|
|
69,
|
|
74,
|
|
75,
|
|
76,
|
|
77,
|
|
78,
|
|
79,
|
|
80,
|
|
81,
|
|
92,
|
|
93,
|
|
98,
|
|
99,
|
|
112,
|
|
113,
|
|
128,
|
|
129,
|
|
134,
|
|
135,
|
|
148,
|
|
149,
|
|
160,
|
|
161,
|
|
162,
|
|
163,
|
|
164,
|
|
165,
|
|
166,
|
|
167,
|
|
168,
|
|
169,
|
|
170,
|
|
171,
|
|
172,
|
|
173,
|
|
178,
|
|
179,
|
|
184,
|
|
185,
|
|
196,
|
|
197,
|
|
198,
|
|
199,
|
|
200,
|
|
201,
|
|
202,
|
|
203,
|
|
204,
|
|
205,
|
|
206,
|
|
207,
|
|
208,
|
|
209,
|
|
214,
|
|
215,
|
|
220,
|
|
221
|
|
];
|
|
}
|
|
} catch (error) {
|
|
// Swallow - we only care if `supports-color` is available; it doesn't have to be.
|
|
}
|
|
|
|
/**
|
|
* Build up the default `inspectOpts` object from the environment variables.
|
|
*
|
|
* $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
|
|
*/
|
|
|
|
exports.inspectOpts = Object.keys(process.env).filter(key => {
|
|
return /^debug_/i.test(key);
|
|
}).reduce((obj, key) => {
|
|
// Camel-case
|
|
const prop = key
|
|
.substring(6)
|
|
.toLowerCase()
|
|
.replace(/_([a-z])/g, (_, k) => {
|
|
return k.toUpperCase();
|
|
});
|
|
|
|
// Coerce string value into JS value
|
|
let val = process.env[key];
|
|
if (/^(yes|on|true|enabled)$/i.test(val)) {
|
|
val = true;
|
|
} else if (/^(no|off|false|disabled)$/i.test(val)) {
|
|
val = false;
|
|
} else if (val === 'null') {
|
|
val = null;
|
|
} else {
|
|
val = Number(val);
|
|
}
|
|
|
|
obj[prop] = val;
|
|
return obj;
|
|
}, {});
|
|
|
|
/**
|
|
* Is stdout a TTY? Colored output is enabled when `true`.
|
|
*/
|
|
|
|
function useColors() {
|
|
return 'colors' in exports.inspectOpts ?
|
|
Boolean(exports.inspectOpts.colors) :
|
|
tty.isatty(process.stderr.fd);
|
|
}
|
|
|
|
/**
|
|
* Adds ANSI color escape codes if enabled.
|
|
*
|
|
* @api public
|
|
*/
|
|
|
|
function formatArgs(args) {
|
|
const {namespace: name, useColors} = this;
|
|
|
|
if (useColors) {
|
|
const c = this.color;
|
|
const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
|
|
const prefix = ` ${colorCode};1m${name} \u001B[0m`;
|
|
|
|
args[0] = prefix + args[0].split('\n').join('\n' + prefix);
|
|
args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
|
|
} else {
|
|
args[0] = getDate() + name + ' ' + args[0];
|
|
}
|
|
}
|
|
|
|
function getDate() {
|
|
if (exports.inspectOpts.hideDate) {
|
|
return '';
|
|
}
|
|
return new Date().toISOString() + ' ';
|
|
}
|
|
|
|
/**
|
|
* Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.
|
|
*/
|
|
|
|
function log(...args) {
|
|
return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n');
|
|
}
|
|
|
|
/**
|
|
* Save `namespaces`.
|
|
*
|
|
* @param {String} namespaces
|
|
* @api private
|
|
*/
|
|
function save(namespaces) {
|
|
if (namespaces) {
|
|
process.env.DEBUG = namespaces;
|
|
} else {
|
|
// If you set a process.env field to null or undefined, it gets cast to the
|
|
// string 'null' or 'undefined'. Just delete instead.
|
|
delete process.env.DEBUG;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load `namespaces`.
|
|
*
|
|
* @return {String} returns the previously persisted debug modes
|
|
* @api private
|
|
*/
|
|
|
|
function load() {
|
|
return process.env.DEBUG;
|
|
}
|
|
|
|
/**
|
|
* Init logic for `debug` instances.
|
|
*
|
|
* Create a new `inspectOpts` object in case `useColors` is set
|
|
* differently for a particular `debug` instance.
|
|
*/
|
|
|
|
function init(debug) {
|
|
debug.inspectOpts = {};
|
|
|
|
const keys = Object.keys(exports.inspectOpts);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
|
|
}
|
|
}
|
|
|
|
module.exports = __webpack_require__(897)(exports);
|
|
|
|
const {formatters} = module.exports;
|
|
|
|
/**
|
|
* Map %o to `util.inspect()`, all on a single line.
|
|
*/
|
|
|
|
formatters.o = function (v) {
|
|
this.inspectOpts.colors = this.useColors;
|
|
return util.inspect(v, this.inspectOpts)
|
|
.split('\n')
|
|
.map(str => str.trim())
|
|
.join(' ');
|
|
};
|
|
|
|
/**
|
|
* Map %O to `util.inspect()`, allowing multiple lines if needed.
|
|
*/
|
|
|
|
formatters.O = function (v) {
|
|
this.inspectOpts.colors = this.useColors;
|
|
return util.inspect(v, this.inspectOpts);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3813:
|
|
/***/ ((module) => {
|
|
|
|
|
|
|
|
module.exports = (flag, argv = process.argv) => {
|
|
const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
|
|
const position = argv.indexOf(prefix + flag);
|
|
const terminatorPosition = argv.indexOf('--');
|
|
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 1970:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.HttpProxyAgent = void 0;
|
|
const net = __importStar(__webpack_require__(9278));
|
|
const tls = __importStar(__webpack_require__(4756));
|
|
const debug_1 = __importDefault(__webpack_require__(2830));
|
|
const events_1 = __webpack_require__(4434);
|
|
const agent_base_1 = __webpack_require__(8894);
|
|
const url_1 = __webpack_require__(7016);
|
|
const debug = (0, debug_1.default)('http-proxy-agent');
|
|
/**
|
|
* The `HttpProxyAgent` implements an HTTP Agent subclass that connects
|
|
* to the specified "HTTP proxy server" in order to proxy HTTP requests.
|
|
*/
|
|
class HttpProxyAgent extends agent_base_1.Agent {
|
|
constructor(proxy, opts) {
|
|
super(opts);
|
|
this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
|
|
this.proxyHeaders = opts?.headers ?? {};
|
|
debug('Creating new HttpProxyAgent instance: %o', this.proxy.href);
|
|
// Trim off the brackets from IPv6 addresses
|
|
const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
|
|
const port = this.proxy.port
|
|
? parseInt(this.proxy.port, 10)
|
|
: this.proxy.protocol === 'https:'
|
|
? 443
|
|
: 80;
|
|
this.connectOpts = {
|
|
...(opts ? omit(opts, 'headers') : null),
|
|
host,
|
|
port,
|
|
};
|
|
}
|
|
addRequest(req, opts) {
|
|
req._header = null;
|
|
this.setRequestProps(req, opts);
|
|
// @ts-expect-error `addRequest()` isn't defined in `@types/node`
|
|
super.addRequest(req, opts);
|
|
}
|
|
setRequestProps(req, opts) {
|
|
const { proxy } = this;
|
|
const protocol = opts.secureEndpoint ? 'https:' : 'http:';
|
|
const hostname = req.getHeader('host') || 'localhost';
|
|
const base = `${protocol}//${hostname}`;
|
|
const url = new url_1.URL(req.path, base);
|
|
if (opts.port !== 80) {
|
|
url.port = String(opts.port);
|
|
}
|
|
// Change the `http.ClientRequest` instance's "path" field
|
|
// to the absolute path of the URL that will be requested.
|
|
req.path = String(url);
|
|
// Inject the `Proxy-Authorization` header if necessary.
|
|
const headers = typeof this.proxyHeaders === 'function'
|
|
? this.proxyHeaders()
|
|
: { ...this.proxyHeaders };
|
|
if (proxy.username || proxy.password) {
|
|
const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
|
|
headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
|
|
}
|
|
if (!headers['Proxy-Connection']) {
|
|
headers['Proxy-Connection'] = this.keepAlive
|
|
? 'Keep-Alive'
|
|
: 'close';
|
|
}
|
|
for (const name of Object.keys(headers)) {
|
|
const value = headers[name];
|
|
if (value) {
|
|
req.setHeader(name, value);
|
|
}
|
|
}
|
|
}
|
|
async connect(req, opts) {
|
|
req._header = null;
|
|
if (!req.path.includes('://')) {
|
|
this.setRequestProps(req, opts);
|
|
}
|
|
// At this point, the http ClientRequest's internal `_header` field
|
|
// might have already been set. If this is the case then we'll need
|
|
// to re-generate the string since we just changed the `req.path`.
|
|
let first;
|
|
let endOfHeaders;
|
|
debug('Regenerating stored HTTP header string for request');
|
|
req._implicitHeader();
|
|
if (req.outputData && req.outputData.length > 0) {
|
|
debug('Patching connection write() output buffer with updated header');
|
|
first = req.outputData[0].data;
|
|
endOfHeaders = first.indexOf('\r\n\r\n') + 4;
|
|
req.outputData[0].data =
|
|
req._header + first.substring(endOfHeaders);
|
|
debug('Output buffer: %o', req.outputData[0].data);
|
|
}
|
|
// Create a socket connection to the proxy server.
|
|
let socket;
|
|
if (this.proxy.protocol === 'https:') {
|
|
debug('Creating `tls.Socket`: %o', this.connectOpts);
|
|
socket = tls.connect(this.connectOpts);
|
|
}
|
|
else {
|
|
debug('Creating `net.Socket`: %o', this.connectOpts);
|
|
socket = net.connect(this.connectOpts);
|
|
}
|
|
// Wait for the socket's `connect` event, so that this `callback()`
|
|
// function throws instead of the `http` request machinery. This is
|
|
// important for i.e. `PacProxyAgent` which determines a failed proxy
|
|
// connection via the `callback()` function throwing.
|
|
await (0, events_1.once)(socket, 'connect');
|
|
return socket;
|
|
}
|
|
}
|
|
HttpProxyAgent.protocols = ['http', 'https'];
|
|
exports.HttpProxyAgent = HttpProxyAgent;
|
|
function omit(obj, ...keys) {
|
|
const ret = {};
|
|
let key;
|
|
for (key in obj) {
|
|
if (!keys.includes(key)) {
|
|
ret[key] = obj[key];
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
//# sourceMappingURL=index.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 3669:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.HttpsProxyAgent = void 0;
|
|
const net = __importStar(__webpack_require__(9278));
|
|
const tls = __importStar(__webpack_require__(4756));
|
|
const assert_1 = __importDefault(__webpack_require__(2613));
|
|
const debug_1 = __importDefault(__webpack_require__(2830));
|
|
const agent_base_1 = __webpack_require__(8894);
|
|
const url_1 = __webpack_require__(7016);
|
|
const parse_proxy_response_1 = __webpack_require__(7943);
|
|
const debug = (0, debug_1.default)('https-proxy-agent');
|
|
const setServernameFromNonIpHost = (options) => {
|
|
if (options.servername === undefined &&
|
|
options.host &&
|
|
!net.isIP(options.host)) {
|
|
return {
|
|
...options,
|
|
servername: options.host,
|
|
};
|
|
}
|
|
return options;
|
|
};
|
|
/**
|
|
* The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to
|
|
* the specified "HTTP(s) proxy server" in order to proxy HTTPS requests.
|
|
*
|
|
* Outgoing HTTP requests are first tunneled through the proxy server using the
|
|
* `CONNECT` HTTP request method to establish a connection to the proxy server,
|
|
* and then the proxy server connects to the destination target and issues the
|
|
* HTTP request from the proxy server.
|
|
*
|
|
* `https:` requests have their socket connection upgraded to TLS once
|
|
* the connection to the proxy server has been established.
|
|
*/
|
|
class HttpsProxyAgent extends agent_base_1.Agent {
|
|
constructor(proxy, opts) {
|
|
super(opts);
|
|
this.options = { path: undefined };
|
|
this.proxy = typeof proxy === 'string' ? new url_1.URL(proxy) : proxy;
|
|
this.proxyHeaders = opts?.headers ?? {};
|
|
debug('Creating new HttpsProxyAgent instance: %o', this.proxy.href);
|
|
// Trim off the brackets from IPv6 addresses
|
|
const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, '');
|
|
const port = this.proxy.port
|
|
? parseInt(this.proxy.port, 10)
|
|
: this.proxy.protocol === 'https:'
|
|
? 443
|
|
: 80;
|
|
this.connectOpts = {
|
|
// Attempt to negotiate http/1.1 for proxy servers that support http/2
|
|
ALPNProtocols: ['http/1.1'],
|
|
...(opts ? omit(opts, 'headers') : null),
|
|
host,
|
|
port,
|
|
};
|
|
}
|
|
/**
|
|
* Called when the node-core HTTP client library is creating a
|
|
* new HTTP request.
|
|
*/
|
|
async connect(req, opts) {
|
|
const { proxy } = this;
|
|
if (!opts.host) {
|
|
throw new TypeError('No "host" provided');
|
|
}
|
|
// Create a socket connection to the proxy server.
|
|
let socket;
|
|
if (proxy.protocol === 'https:') {
|
|
debug('Creating `tls.Socket`: %o', this.connectOpts);
|
|
socket = tls.connect(setServernameFromNonIpHost(this.connectOpts));
|
|
}
|
|
else {
|
|
debug('Creating `net.Socket`: %o', this.connectOpts);
|
|
socket = net.connect(this.connectOpts);
|
|
}
|
|
const headers = typeof this.proxyHeaders === 'function'
|
|
? this.proxyHeaders()
|
|
: { ...this.proxyHeaders };
|
|
const host = net.isIPv6(opts.host) ? `[${opts.host}]` : opts.host;
|
|
let payload = `CONNECT ${host}:${opts.port} HTTP/1.1\r\n`;
|
|
// Inject the `Proxy-Authorization` header if necessary.
|
|
if (proxy.username || proxy.password) {
|
|
const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
|
|
headers['Proxy-Authorization'] = `Basic ${Buffer.from(auth).toString('base64')}`;
|
|
}
|
|
headers.Host = `${host}:${opts.port}`;
|
|
if (!headers['Proxy-Connection']) {
|
|
headers['Proxy-Connection'] = this.keepAlive
|
|
? 'Keep-Alive'
|
|
: 'close';
|
|
}
|
|
for (const name of Object.keys(headers)) {
|
|
payload += `${name}: ${headers[name]}\r\n`;
|
|
}
|
|
const proxyResponsePromise = (0, parse_proxy_response_1.parseProxyResponse)(socket);
|
|
socket.write(`${payload}\r\n`);
|
|
const { connect, buffered } = await proxyResponsePromise;
|
|
req.emit('proxyConnect', connect);
|
|
this.emit('proxyConnect', connect, req);
|
|
if (connect.statusCode === 200) {
|
|
req.once('socket', resume);
|
|
if (opts.secureEndpoint) {
|
|
// The proxy is connecting to a TLS server, so upgrade
|
|
// this socket connection to a TLS connection.
|
|
debug('Upgrading socket connection to TLS');
|
|
return tls.connect({
|
|
...omit(setServernameFromNonIpHost(opts), 'host', 'path', 'port'),
|
|
socket,
|
|
});
|
|
}
|
|
return socket;
|
|
}
|
|
// Some other status code that's not 200... need to re-play the HTTP
|
|
// header "data" events onto the socket once the HTTP machinery is
|
|
// attached so that the node core `http` can parse and handle the
|
|
// error status code.
|
|
// Close the original socket, and a new "fake" socket is returned
|
|
// instead, so that the proxy doesn't get the HTTP request
|
|
// written to it (which may contain `Authorization` headers or other
|
|
// sensitive data).
|
|
//
|
|
// See: https://hackerone.com/reports/541502
|
|
socket.destroy();
|
|
const fakeSocket = new net.Socket({ writable: false });
|
|
fakeSocket.readable = true;
|
|
// Need to wait for the "socket" event to re-play the "data" events.
|
|
req.once('socket', (s) => {
|
|
debug('Replaying proxy buffer for failed request');
|
|
(0, assert_1.default)(s.listenerCount('data') > 0);
|
|
// Replay the "buffered" Buffer onto the fake `socket`, since at
|
|
// this point the HTTP module machinery has been hooked up for
|
|
// the user.
|
|
s.push(buffered);
|
|
s.push(null);
|
|
});
|
|
return fakeSocket;
|
|
}
|
|
}
|
|
HttpsProxyAgent.protocols = ['http', 'https'];
|
|
exports.HttpsProxyAgent = HttpsProxyAgent;
|
|
function resume(socket) {
|
|
socket.resume();
|
|
}
|
|
function omit(obj, ...keys) {
|
|
const ret = {};
|
|
let key;
|
|
for (key in obj) {
|
|
if (!keys.includes(key)) {
|
|
ret[key] = obj[key];
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
//# sourceMappingURL=index.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7943:
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
exports.parseProxyResponse = void 0;
|
|
const debug_1 = __importDefault(__webpack_require__(2830));
|
|
const debug = (0, debug_1.default)('https-proxy-agent:parse-proxy-response');
|
|
function parseProxyResponse(socket) {
|
|
return new Promise((resolve, reject) => {
|
|
// we need to buffer any HTTP traffic that happens with the proxy before we get
|
|
// the CONNECT response, so that if the response is anything other than an "200"
|
|
// response code, then we can re-play the "data" events on the socket once the
|
|
// HTTP parser is hooked up...
|
|
let buffersLength = 0;
|
|
const buffers = [];
|
|
function read() {
|
|
const b = socket.read();
|
|
if (b)
|
|
ondata(b);
|
|
else
|
|
socket.once('readable', read);
|
|
}
|
|
function cleanup() {
|
|
socket.removeListener('end', onend);
|
|
socket.removeListener('error', onerror);
|
|
socket.removeListener('readable', read);
|
|
}
|
|
function onend() {
|
|
cleanup();
|
|
debug('onend');
|
|
reject(new Error('Proxy connection ended before receiving CONNECT response'));
|
|
}
|
|
function onerror(err) {
|
|
cleanup();
|
|
debug('onerror %o', err);
|
|
reject(err);
|
|
}
|
|
function ondata(b) {
|
|
buffers.push(b);
|
|
buffersLength += b.length;
|
|
const buffered = Buffer.concat(buffers, buffersLength);
|
|
const endOfHeaders = buffered.indexOf('\r\n\r\n');
|
|
if (endOfHeaders === -1) {
|
|
// keep buffering
|
|
debug('have not received end of HTTP headers yet...');
|
|
read();
|
|
return;
|
|
}
|
|
const headerParts = buffered
|
|
.slice(0, endOfHeaders)
|
|
.toString('ascii')
|
|
.split('\r\n');
|
|
const firstLine = headerParts.shift();
|
|
if (!firstLine) {
|
|
socket.destroy();
|
|
return reject(new Error('No header received from proxy CONNECT response'));
|
|
}
|
|
const firstLineParts = firstLine.split(' ');
|
|
const statusCode = +firstLineParts[1];
|
|
const statusText = firstLineParts.slice(2).join(' ');
|
|
const headers = {};
|
|
for (const header of headerParts) {
|
|
if (!header)
|
|
continue;
|
|
const firstColon = header.indexOf(':');
|
|
if (firstColon === -1) {
|
|
socket.destroy();
|
|
return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`));
|
|
}
|
|
const key = header.slice(0, firstColon).toLowerCase();
|
|
const value = header.slice(firstColon + 1).trimStart();
|
|
const current = headers[key];
|
|
if (typeof current === 'string') {
|
|
headers[key] = [current, value];
|
|
}
|
|
else if (Array.isArray(current)) {
|
|
current.push(value);
|
|
}
|
|
else {
|
|
headers[key] = value;
|
|
}
|
|
}
|
|
debug('got proxy server response: %o %o', firstLine, headers);
|
|
cleanup();
|
|
resolve({
|
|
connect: {
|
|
statusCode,
|
|
statusText,
|
|
headers,
|
|
},
|
|
buffered,
|
|
});
|
|
}
|
|
socket.on('error', onerror);
|
|
socket.on('end', onend);
|
|
read();
|
|
});
|
|
}
|
|
exports.parseProxyResponse = parseProxyResponse;
|
|
//# sourceMappingURL=parse-proxy-response.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 744:
|
|
/***/ ((module) => {
|
|
|
|
/**
|
|
* Helpers.
|
|
*/
|
|
|
|
var s = 1000;
|
|
var m = s * 60;
|
|
var h = m * 60;
|
|
var d = h * 24;
|
|
var w = d * 7;
|
|
var y = d * 365.25;
|
|
|
|
/**
|
|
* Parse or format the given `val`.
|
|
*
|
|
* Options:
|
|
*
|
|
* - `long` verbose formatting [false]
|
|
*
|
|
* @param {String|Number} val
|
|
* @param {Object} [options]
|
|
* @throws {Error} throw an error if val is not a non-empty string or a number
|
|
* @return {String|Number}
|
|
* @api public
|
|
*/
|
|
|
|
module.exports = function (val, options) {
|
|
options = options || {};
|
|
var type = typeof val;
|
|
if (type === 'string' && val.length > 0) {
|
|
return parse(val);
|
|
} else if (type === 'number' && isFinite(val)) {
|
|
return options.long ? fmtLong(val) : fmtShort(val);
|
|
}
|
|
throw new Error(
|
|
'val is not a non-empty string or a valid number. val=' +
|
|
JSON.stringify(val)
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Parse the given `str` and return milliseconds.
|
|
*
|
|
* @param {String} str
|
|
* @return {Number}
|
|
* @api private
|
|
*/
|
|
|
|
function parse(str) {
|
|
str = String(str);
|
|
if (str.length > 100) {
|
|
return;
|
|
}
|
|
var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
|
|
str
|
|
);
|
|
if (!match) {
|
|
return;
|
|
}
|
|
var n = parseFloat(match[1]);
|
|
var type = (match[2] || 'ms').toLowerCase();
|
|
switch (type) {
|
|
case 'years':
|
|
case 'year':
|
|
case 'yrs':
|
|
case 'yr':
|
|
case 'y':
|
|
return n * y;
|
|
case 'weeks':
|
|
case 'week':
|
|
case 'w':
|
|
return n * w;
|
|
case 'days':
|
|
case 'day':
|
|
case 'd':
|
|
return n * d;
|
|
case 'hours':
|
|
case 'hour':
|
|
case 'hrs':
|
|
case 'hr':
|
|
case 'h':
|
|
return n * h;
|
|
case 'minutes':
|
|
case 'minute':
|
|
case 'mins':
|
|
case 'min':
|
|
case 'm':
|
|
return n * m;
|
|
case 'seconds':
|
|
case 'second':
|
|
case 'secs':
|
|
case 'sec':
|
|
case 's':
|
|
return n * s;
|
|
case 'milliseconds':
|
|
case 'millisecond':
|
|
case 'msecs':
|
|
case 'msec':
|
|
case 'ms':
|
|
return n;
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Short format for `ms`.
|
|
*
|
|
* @param {Number} ms
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
function fmtShort(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return Math.round(ms / d) + 'd';
|
|
}
|
|
if (msAbs >= h) {
|
|
return Math.round(ms / h) + 'h';
|
|
}
|
|
if (msAbs >= m) {
|
|
return Math.round(ms / m) + 'm';
|
|
}
|
|
if (msAbs >= s) {
|
|
return Math.round(ms / s) + 's';
|
|
}
|
|
return ms + 'ms';
|
|
}
|
|
|
|
/**
|
|
* Long format for `ms`.
|
|
*
|
|
* @param {Number} ms
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
function fmtLong(ms) {
|
|
var msAbs = Math.abs(ms);
|
|
if (msAbs >= d) {
|
|
return plural(ms, msAbs, d, 'day');
|
|
}
|
|
if (msAbs >= h) {
|
|
return plural(ms, msAbs, h, 'hour');
|
|
}
|
|
if (msAbs >= m) {
|
|
return plural(ms, msAbs, m, 'minute');
|
|
}
|
|
if (msAbs >= s) {
|
|
return plural(ms, msAbs, s, 'second');
|
|
}
|
|
return ms + ' ms';
|
|
}
|
|
|
|
/**
|
|
* Pluralization helper.
|
|
*/
|
|
|
|
function plural(ms, msAbs, n, name) {
|
|
var isPlural = msAbs >= n * 1.5;
|
|
return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 1450:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
const os = __webpack_require__(857);
|
|
const tty = __webpack_require__(2018);
|
|
const hasFlag = __webpack_require__(3813);
|
|
|
|
const {env} = process;
|
|
|
|
let forceColor;
|
|
if (hasFlag('no-color') ||
|
|
hasFlag('no-colors') ||
|
|
hasFlag('color=false') ||
|
|
hasFlag('color=never')) {
|
|
forceColor = 0;
|
|
} else if (hasFlag('color') ||
|
|
hasFlag('colors') ||
|
|
hasFlag('color=true') ||
|
|
hasFlag('color=always')) {
|
|
forceColor = 1;
|
|
}
|
|
|
|
if ('FORCE_COLOR' in env) {
|
|
if (env.FORCE_COLOR === 'true') {
|
|
forceColor = 1;
|
|
} else if (env.FORCE_COLOR === 'false') {
|
|
forceColor = 0;
|
|
} else {
|
|
forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
|
|
}
|
|
}
|
|
|
|
function translateLevel(level) {
|
|
if (level === 0) {
|
|
return false;
|
|
}
|
|
|
|
return {
|
|
level,
|
|
hasBasic: true,
|
|
has256: level >= 2,
|
|
has16m: level >= 3
|
|
};
|
|
}
|
|
|
|
function supportsColor(haveStream, streamIsTTY) {
|
|
if (forceColor === 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (hasFlag('color=16m') ||
|
|
hasFlag('color=full') ||
|
|
hasFlag('color=truecolor')) {
|
|
return 3;
|
|
}
|
|
|
|
if (hasFlag('color=256')) {
|
|
return 2;
|
|
}
|
|
|
|
if (haveStream && !streamIsTTY && forceColor === undefined) {
|
|
return 0;
|
|
}
|
|
|
|
const min = forceColor || 0;
|
|
|
|
if (env.TERM === 'dumb') {
|
|
return min;
|
|
}
|
|
|
|
if (process.platform === 'win32') {
|
|
// Windows 10 build 10586 is the first Windows release that supports 256 colors.
|
|
// Windows 10 build 14931 is the first release that supports 16m/TrueColor.
|
|
const osRelease = os.release().split('.');
|
|
if (
|
|
Number(osRelease[0]) >= 10 &&
|
|
Number(osRelease[2]) >= 10586
|
|
) {
|
|
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
if ('CI' in env) {
|
|
if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
|
|
return 1;
|
|
}
|
|
|
|
return min;
|
|
}
|
|
|
|
if ('TEAMCITY_VERSION' in env) {
|
|
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
}
|
|
|
|
if (env.COLORTERM === 'truecolor') {
|
|
return 3;
|
|
}
|
|
|
|
if ('TERM_PROGRAM' in env) {
|
|
const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
|
|
|
|
switch (env.TERM_PROGRAM) {
|
|
case 'iTerm.app':
|
|
return version >= 3 ? 3 : 2;
|
|
case 'Apple_Terminal':
|
|
return 2;
|
|
// No default
|
|
}
|
|
}
|
|
|
|
if (/-256(color)?$/i.test(env.TERM)) {
|
|
return 2;
|
|
}
|
|
|
|
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
|
|
return 1;
|
|
}
|
|
|
|
if ('COLORTERM' in env) {
|
|
return 1;
|
|
}
|
|
|
|
return min;
|
|
}
|
|
|
|
function getSupportLevel(stream) {
|
|
const level = supportsColor(stream, stream && stream.isTTY);
|
|
return translateLevel(level);
|
|
}
|
|
|
|
module.exports = {
|
|
supportsColor: getSupportLevel,
|
|
stdout: translateLevel(supportsColor(true, tty.isatty(1))),
|
|
stderr: translateLevel(supportsColor(true, tty.isatty(2)))
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 30:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
var __webpack_unused_export__;
|
|
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
__webpack_unused_export__ = ({ value: true });
|
|
exports.w = void 0;
|
|
/**
|
|
* Holds the singleton operationRequestMap, to be shared across CJS and ESM imports.
|
|
*/
|
|
exports.w = {
|
|
operationRequestMap: new WeakMap(),
|
|
};
|
|
//# sourceMappingURL=state-cjs.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 9437:
|
|
/***/ ((__unused_webpack_module, exports) => {
|
|
|
|
var __webpack_unused_export__;
|
|
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
__webpack_unused_export__ = ({ value: true });
|
|
exports.w = void 0;
|
|
/**
|
|
* @internal
|
|
*
|
|
* Holds the singleton instrumenter, to be shared across CJS and ESM imports.
|
|
*/
|
|
exports.w = {
|
|
instrumenterImplementation: undefined,
|
|
};
|
|
//# sourceMappingURL=state-cjs.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 8658:
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
// This file exists as a CommonJS module to read the version from package.json.
|
|
// In an ESM package, using `require()` directly in .ts files requires disabling
|
|
// ESLint rules and doesn't work reliably across all Node.js versions.
|
|
// By keeping this as a .cjs file, we can use require() naturally and export
|
|
// the version for the ESM modules to import.
|
|
const packageJson = __webpack_require__(4012)
|
|
module.exports = { version: packageJson.version }
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 5295:
|
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
|
|
|
|
// EXPORTS
|
|
__webpack_require__.d(__webpack_exports__, {
|
|
Zh: () => (/* binding */ ReserveCacheError),
|
|
w3: () => (/* binding */ isFeatureAvailable),
|
|
P3: () => (/* binding */ restoreCache),
|
|
Io: () => (/* binding */ cache_saveCache)
|
|
});
|
|
|
|
// UNUSED EXPORTS: CACHE_READ_DENIED_PREFIX, CACHE_WRITE_DENIED_PREFIX, CacheReadDeniedError, CacheWriteDeniedError, FinalizeCacheError, ValidationError
|
|
|
|
// NAMESPACE OBJECT: ./node_modules/@azure/storage-blob/dist/esm/generated/src/models/mappers.js
|
|
var mappers_namespaceObject = {};
|
|
__webpack_require__.r(mappers_namespaceObject);
|
|
__webpack_require__.d(mappers_namespaceObject, {
|
|
AccessPolicy: () => (AccessPolicy),
|
|
AppendBlobAppendBlockExceptionHeaders: () => (AppendBlobAppendBlockExceptionHeaders),
|
|
AppendBlobAppendBlockFromUrlExceptionHeaders: () => (AppendBlobAppendBlockFromUrlExceptionHeaders),
|
|
AppendBlobAppendBlockFromUrlHeaders: () => (AppendBlobAppendBlockFromUrlHeaders),
|
|
AppendBlobAppendBlockHeaders: () => (AppendBlobAppendBlockHeaders),
|
|
AppendBlobCreateExceptionHeaders: () => (AppendBlobCreateExceptionHeaders),
|
|
AppendBlobCreateHeaders: () => (AppendBlobCreateHeaders),
|
|
AppendBlobSealExceptionHeaders: () => (AppendBlobSealExceptionHeaders),
|
|
AppendBlobSealHeaders: () => (AppendBlobSealHeaders),
|
|
ArrowConfiguration: () => (ArrowConfiguration),
|
|
ArrowField: () => (ArrowField),
|
|
BlobAbortCopyFromURLExceptionHeaders: () => (BlobAbortCopyFromURLExceptionHeaders),
|
|
BlobAbortCopyFromURLHeaders: () => (BlobAbortCopyFromURLHeaders),
|
|
BlobAcquireLeaseExceptionHeaders: () => (BlobAcquireLeaseExceptionHeaders),
|
|
BlobAcquireLeaseHeaders: () => (BlobAcquireLeaseHeaders),
|
|
BlobBreakLeaseExceptionHeaders: () => (BlobBreakLeaseExceptionHeaders),
|
|
BlobBreakLeaseHeaders: () => (BlobBreakLeaseHeaders),
|
|
BlobChangeLeaseExceptionHeaders: () => (BlobChangeLeaseExceptionHeaders),
|
|
BlobChangeLeaseHeaders: () => (BlobChangeLeaseHeaders),
|
|
BlobCopyFromURLExceptionHeaders: () => (BlobCopyFromURLExceptionHeaders),
|
|
BlobCopyFromURLHeaders: () => (BlobCopyFromURLHeaders),
|
|
BlobCreateSnapshotExceptionHeaders: () => (BlobCreateSnapshotExceptionHeaders),
|
|
BlobCreateSnapshotHeaders: () => (BlobCreateSnapshotHeaders),
|
|
BlobDeleteExceptionHeaders: () => (BlobDeleteExceptionHeaders),
|
|
BlobDeleteHeaders: () => (BlobDeleteHeaders),
|
|
BlobDeleteImmutabilityPolicyExceptionHeaders: () => (BlobDeleteImmutabilityPolicyExceptionHeaders),
|
|
BlobDeleteImmutabilityPolicyHeaders: () => (BlobDeleteImmutabilityPolicyHeaders),
|
|
BlobDownloadExceptionHeaders: () => (BlobDownloadExceptionHeaders),
|
|
BlobDownloadHeaders: () => (BlobDownloadHeaders),
|
|
BlobFlatListSegment: () => (BlobFlatListSegment),
|
|
BlobGetAccountInfoExceptionHeaders: () => (BlobGetAccountInfoExceptionHeaders),
|
|
BlobGetAccountInfoHeaders: () => (BlobGetAccountInfoHeaders),
|
|
BlobGetPropertiesExceptionHeaders: () => (BlobGetPropertiesExceptionHeaders),
|
|
BlobGetPropertiesHeaders: () => (BlobGetPropertiesHeaders),
|
|
BlobGetTagsExceptionHeaders: () => (BlobGetTagsExceptionHeaders),
|
|
BlobGetTagsHeaders: () => (BlobGetTagsHeaders),
|
|
BlobHierarchyListSegment: () => (BlobHierarchyListSegment),
|
|
BlobItemInternal: () => (BlobItemInternal),
|
|
BlobName: () => (BlobName),
|
|
BlobPrefix: () => (BlobPrefix),
|
|
BlobPropertiesInternal: () => (BlobPropertiesInternal),
|
|
BlobQueryExceptionHeaders: () => (BlobQueryExceptionHeaders),
|
|
BlobQueryHeaders: () => (BlobQueryHeaders),
|
|
BlobReleaseLeaseExceptionHeaders: () => (BlobReleaseLeaseExceptionHeaders),
|
|
BlobReleaseLeaseHeaders: () => (BlobReleaseLeaseHeaders),
|
|
BlobRenewLeaseExceptionHeaders: () => (BlobRenewLeaseExceptionHeaders),
|
|
BlobRenewLeaseHeaders: () => (BlobRenewLeaseHeaders),
|
|
BlobServiceProperties: () => (BlobServiceProperties),
|
|
BlobServiceStatistics: () => (BlobServiceStatistics),
|
|
BlobSetExpiryExceptionHeaders: () => (BlobSetExpiryExceptionHeaders),
|
|
BlobSetExpiryHeaders: () => (BlobSetExpiryHeaders),
|
|
BlobSetHttpHeadersExceptionHeaders: () => (BlobSetHttpHeadersExceptionHeaders),
|
|
BlobSetHttpHeadersHeaders: () => (BlobSetHttpHeadersHeaders),
|
|
BlobSetImmutabilityPolicyExceptionHeaders: () => (BlobSetImmutabilityPolicyExceptionHeaders),
|
|
BlobSetImmutabilityPolicyHeaders: () => (BlobSetImmutabilityPolicyHeaders),
|
|
BlobSetLegalHoldExceptionHeaders: () => (BlobSetLegalHoldExceptionHeaders),
|
|
BlobSetLegalHoldHeaders: () => (BlobSetLegalHoldHeaders),
|
|
BlobSetMetadataExceptionHeaders: () => (BlobSetMetadataExceptionHeaders),
|
|
BlobSetMetadataHeaders: () => (BlobSetMetadataHeaders),
|
|
BlobSetTagsExceptionHeaders: () => (BlobSetTagsExceptionHeaders),
|
|
BlobSetTagsHeaders: () => (BlobSetTagsHeaders),
|
|
BlobSetTierExceptionHeaders: () => (BlobSetTierExceptionHeaders),
|
|
BlobSetTierHeaders: () => (BlobSetTierHeaders),
|
|
BlobStartCopyFromURLExceptionHeaders: () => (BlobStartCopyFromURLExceptionHeaders),
|
|
BlobStartCopyFromURLHeaders: () => (BlobStartCopyFromURLHeaders),
|
|
BlobTag: () => (BlobTag),
|
|
BlobTags: () => (BlobTags),
|
|
BlobUndeleteExceptionHeaders: () => (BlobUndeleteExceptionHeaders),
|
|
BlobUndeleteHeaders: () => (BlobUndeleteHeaders),
|
|
Block: () => (Block),
|
|
BlockBlobCommitBlockListExceptionHeaders: () => (BlockBlobCommitBlockListExceptionHeaders),
|
|
BlockBlobCommitBlockListHeaders: () => (BlockBlobCommitBlockListHeaders),
|
|
BlockBlobGetBlockListExceptionHeaders: () => (BlockBlobGetBlockListExceptionHeaders),
|
|
BlockBlobGetBlockListHeaders: () => (BlockBlobGetBlockListHeaders),
|
|
BlockBlobPutBlobFromUrlExceptionHeaders: () => (BlockBlobPutBlobFromUrlExceptionHeaders),
|
|
BlockBlobPutBlobFromUrlHeaders: () => (BlockBlobPutBlobFromUrlHeaders),
|
|
BlockBlobStageBlockExceptionHeaders: () => (BlockBlobStageBlockExceptionHeaders),
|
|
BlockBlobStageBlockFromURLExceptionHeaders: () => (BlockBlobStageBlockFromURLExceptionHeaders),
|
|
BlockBlobStageBlockFromURLHeaders: () => (BlockBlobStageBlockFromURLHeaders),
|
|
BlockBlobStageBlockHeaders: () => (BlockBlobStageBlockHeaders),
|
|
BlockBlobUploadExceptionHeaders: () => (BlockBlobUploadExceptionHeaders),
|
|
BlockBlobUploadHeaders: () => (BlockBlobUploadHeaders),
|
|
BlockList: () => (BlockList),
|
|
BlockLookupList: () => (BlockLookupList),
|
|
ClearRange: () => (ClearRange),
|
|
ContainerAcquireLeaseExceptionHeaders: () => (ContainerAcquireLeaseExceptionHeaders),
|
|
ContainerAcquireLeaseHeaders: () => (ContainerAcquireLeaseHeaders),
|
|
ContainerBreakLeaseExceptionHeaders: () => (ContainerBreakLeaseExceptionHeaders),
|
|
ContainerBreakLeaseHeaders: () => (ContainerBreakLeaseHeaders),
|
|
ContainerChangeLeaseExceptionHeaders: () => (ContainerChangeLeaseExceptionHeaders),
|
|
ContainerChangeLeaseHeaders: () => (ContainerChangeLeaseHeaders),
|
|
ContainerCreateExceptionHeaders: () => (ContainerCreateExceptionHeaders),
|
|
ContainerCreateHeaders: () => (ContainerCreateHeaders),
|
|
ContainerDeleteExceptionHeaders: () => (ContainerDeleteExceptionHeaders),
|
|
ContainerDeleteHeaders: () => (ContainerDeleteHeaders),
|
|
ContainerFilterBlobsExceptionHeaders: () => (ContainerFilterBlobsExceptionHeaders),
|
|
ContainerFilterBlobsHeaders: () => (ContainerFilterBlobsHeaders),
|
|
ContainerGetAccessPolicyExceptionHeaders: () => (ContainerGetAccessPolicyExceptionHeaders),
|
|
ContainerGetAccessPolicyHeaders: () => (ContainerGetAccessPolicyHeaders),
|
|
ContainerGetAccountInfoExceptionHeaders: () => (ContainerGetAccountInfoExceptionHeaders),
|
|
ContainerGetAccountInfoHeaders: () => (ContainerGetAccountInfoHeaders),
|
|
ContainerGetPropertiesExceptionHeaders: () => (ContainerGetPropertiesExceptionHeaders),
|
|
ContainerGetPropertiesHeaders: () => (ContainerGetPropertiesHeaders),
|
|
ContainerItem: () => (ContainerItem),
|
|
ContainerListBlobFlatSegmentExceptionHeaders: () => (ContainerListBlobFlatSegmentExceptionHeaders),
|
|
ContainerListBlobFlatSegmentHeaders: () => (ContainerListBlobFlatSegmentHeaders),
|
|
ContainerListBlobHierarchySegmentExceptionHeaders: () => (ContainerListBlobHierarchySegmentExceptionHeaders),
|
|
ContainerListBlobHierarchySegmentHeaders: () => (ContainerListBlobHierarchySegmentHeaders),
|
|
ContainerProperties: () => (ContainerProperties),
|
|
ContainerReleaseLeaseExceptionHeaders: () => (ContainerReleaseLeaseExceptionHeaders),
|
|
ContainerReleaseLeaseHeaders: () => (ContainerReleaseLeaseHeaders),
|
|
ContainerRenameExceptionHeaders: () => (ContainerRenameExceptionHeaders),
|
|
ContainerRenameHeaders: () => (ContainerRenameHeaders),
|
|
ContainerRenewLeaseExceptionHeaders: () => (ContainerRenewLeaseExceptionHeaders),
|
|
ContainerRenewLeaseHeaders: () => (ContainerRenewLeaseHeaders),
|
|
ContainerRestoreExceptionHeaders: () => (ContainerRestoreExceptionHeaders),
|
|
ContainerRestoreHeaders: () => (ContainerRestoreHeaders),
|
|
ContainerSetAccessPolicyExceptionHeaders: () => (ContainerSetAccessPolicyExceptionHeaders),
|
|
ContainerSetAccessPolicyHeaders: () => (ContainerSetAccessPolicyHeaders),
|
|
ContainerSetMetadataExceptionHeaders: () => (ContainerSetMetadataExceptionHeaders),
|
|
ContainerSetMetadataHeaders: () => (ContainerSetMetadataHeaders),
|
|
ContainerSubmitBatchExceptionHeaders: () => (ContainerSubmitBatchExceptionHeaders),
|
|
ContainerSubmitBatchHeaders: () => (ContainerSubmitBatchHeaders),
|
|
CorsRule: () => (CorsRule),
|
|
DelimitedTextConfiguration: () => (DelimitedTextConfiguration),
|
|
FilterBlobItem: () => (FilterBlobItem),
|
|
FilterBlobSegment: () => (FilterBlobSegment),
|
|
GeoReplication: () => (GeoReplication),
|
|
JsonTextConfiguration: () => (JsonTextConfiguration),
|
|
KeyInfo: () => (KeyInfo),
|
|
ListBlobsFlatSegmentResponse: () => (ListBlobsFlatSegmentResponse),
|
|
ListBlobsHierarchySegmentResponse: () => (ListBlobsHierarchySegmentResponse),
|
|
ListContainersSegmentResponse: () => (ListContainersSegmentResponse),
|
|
Logging: () => (Logging),
|
|
Metrics: () => (Metrics),
|
|
PageBlobClearPagesExceptionHeaders: () => (PageBlobClearPagesExceptionHeaders),
|
|
PageBlobClearPagesHeaders: () => (PageBlobClearPagesHeaders),
|
|
PageBlobCopyIncrementalExceptionHeaders: () => (PageBlobCopyIncrementalExceptionHeaders),
|
|
PageBlobCopyIncrementalHeaders: () => (PageBlobCopyIncrementalHeaders),
|
|
PageBlobCreateExceptionHeaders: () => (PageBlobCreateExceptionHeaders),
|
|
PageBlobCreateHeaders: () => (PageBlobCreateHeaders),
|
|
PageBlobGetPageRangesDiffExceptionHeaders: () => (PageBlobGetPageRangesDiffExceptionHeaders),
|
|
PageBlobGetPageRangesDiffHeaders: () => (PageBlobGetPageRangesDiffHeaders),
|
|
PageBlobGetPageRangesExceptionHeaders: () => (PageBlobGetPageRangesExceptionHeaders),
|
|
PageBlobGetPageRangesHeaders: () => (PageBlobGetPageRangesHeaders),
|
|
PageBlobResizeExceptionHeaders: () => (PageBlobResizeExceptionHeaders),
|
|
PageBlobResizeHeaders: () => (PageBlobResizeHeaders),
|
|
PageBlobUpdateSequenceNumberExceptionHeaders: () => (PageBlobUpdateSequenceNumberExceptionHeaders),
|
|
PageBlobUpdateSequenceNumberHeaders: () => (PageBlobUpdateSequenceNumberHeaders),
|
|
PageBlobUploadPagesExceptionHeaders: () => (PageBlobUploadPagesExceptionHeaders),
|
|
PageBlobUploadPagesFromURLExceptionHeaders: () => (PageBlobUploadPagesFromURLExceptionHeaders),
|
|
PageBlobUploadPagesFromURLHeaders: () => (PageBlobUploadPagesFromURLHeaders),
|
|
PageBlobUploadPagesHeaders: () => (PageBlobUploadPagesHeaders),
|
|
PageList: () => (PageList),
|
|
PageRange: () => (PageRange),
|
|
QueryFormat: () => (QueryFormat),
|
|
QueryRequest: () => (QueryRequest),
|
|
QuerySerialization: () => (QuerySerialization),
|
|
RetentionPolicy: () => (RetentionPolicy),
|
|
ServiceFilterBlobsExceptionHeaders: () => (ServiceFilterBlobsExceptionHeaders),
|
|
ServiceFilterBlobsHeaders: () => (ServiceFilterBlobsHeaders),
|
|
ServiceGetAccountInfoExceptionHeaders: () => (ServiceGetAccountInfoExceptionHeaders),
|
|
ServiceGetAccountInfoHeaders: () => (ServiceGetAccountInfoHeaders),
|
|
ServiceGetPropertiesExceptionHeaders: () => (ServiceGetPropertiesExceptionHeaders),
|
|
ServiceGetPropertiesHeaders: () => (ServiceGetPropertiesHeaders),
|
|
ServiceGetStatisticsExceptionHeaders: () => (ServiceGetStatisticsExceptionHeaders),
|
|
ServiceGetStatisticsHeaders: () => (ServiceGetStatisticsHeaders),
|
|
ServiceGetUserDelegationKeyExceptionHeaders: () => (ServiceGetUserDelegationKeyExceptionHeaders),
|
|
ServiceGetUserDelegationKeyHeaders: () => (ServiceGetUserDelegationKeyHeaders),
|
|
ServiceListContainersSegmentExceptionHeaders: () => (ServiceListContainersSegmentExceptionHeaders),
|
|
ServiceListContainersSegmentHeaders: () => (ServiceListContainersSegmentHeaders),
|
|
ServiceSetPropertiesExceptionHeaders: () => (ServiceSetPropertiesExceptionHeaders),
|
|
ServiceSetPropertiesHeaders: () => (ServiceSetPropertiesHeaders),
|
|
ServiceSubmitBatchExceptionHeaders: () => (ServiceSubmitBatchExceptionHeaders),
|
|
ServiceSubmitBatchHeaders: () => (ServiceSubmitBatchHeaders),
|
|
SignedIdentifier: () => (SignedIdentifier),
|
|
StaticWebsite: () => (StaticWebsite),
|
|
StorageError: () => (StorageError),
|
|
UserDelegationKey: () => (UserDelegationKey)
|
|
});
|
|
|
|
// EXTERNAL MODULE: ./node_modules/@actions/core/lib/core.js + 7 modules
|
|
var lib_core = __webpack_require__(3838);
|
|
// EXTERNAL MODULE: external "path"
|
|
var external_path_ = __webpack_require__(6928);
|
|
// EXTERNAL MODULE: ./node_modules/@actions/exec/lib/exec.js + 2 modules
|
|
var exec = __webpack_require__(5260);
|
|
// EXTERNAL MODULE: external "fs"
|
|
var external_fs_ = __webpack_require__(9896);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-glob-options-helper.js
|
|
|
|
/**
|
|
* Returns a copy with defaults filled in.
|
|
*/
|
|
function getOptions(copy) {
|
|
const result = {
|
|
followSymbolicLinks: true,
|
|
implicitDescendants: true,
|
|
matchDirectories: true,
|
|
omitBrokenSymbolicLinks: true,
|
|
excludeHiddenFiles: false
|
|
};
|
|
if (copy) {
|
|
if (typeof copy.followSymbolicLinks === 'boolean') {
|
|
result.followSymbolicLinks = copy.followSymbolicLinks;
|
|
lib_core/* debug */.Yz(`followSymbolicLinks '${result.followSymbolicLinks}'`);
|
|
}
|
|
if (typeof copy.implicitDescendants === 'boolean') {
|
|
result.implicitDescendants = copy.implicitDescendants;
|
|
lib_core/* debug */.Yz(`implicitDescendants '${result.implicitDescendants}'`);
|
|
}
|
|
if (typeof copy.matchDirectories === 'boolean') {
|
|
result.matchDirectories = copy.matchDirectories;
|
|
lib_core/* debug */.Yz(`matchDirectories '${result.matchDirectories}'`);
|
|
}
|
|
if (typeof copy.omitBrokenSymbolicLinks === 'boolean') {
|
|
result.omitBrokenSymbolicLinks = copy.omitBrokenSymbolicLinks;
|
|
lib_core/* debug */.Yz(`omitBrokenSymbolicLinks '${result.omitBrokenSymbolicLinks}'`);
|
|
}
|
|
if (typeof copy.excludeHiddenFiles === 'boolean') {
|
|
result.excludeHiddenFiles = copy.excludeHiddenFiles;
|
|
lib_core/* debug */.Yz(`excludeHiddenFiles '${result.excludeHiddenFiles}'`);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
//# sourceMappingURL=internal-glob-options-helper.js.map
|
|
// EXTERNAL MODULE: external "assert"
|
|
var external_assert_ = __webpack_require__(2613);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-path-helper.js
|
|
|
|
|
|
const IS_WINDOWS = process.platform === 'win32';
|
|
/**
|
|
* Similar to path.dirname except normalizes the path separators and slightly better handling for Windows UNC paths.
|
|
*
|
|
* For example, on Linux/macOS:
|
|
* - `/ => /`
|
|
* - `/hello => /`
|
|
*
|
|
* For example, on Windows:
|
|
* - `C:\ => C:\`
|
|
* - `C:\hello => C:\`
|
|
* - `C: => C:`
|
|
* - `C:hello => C:`
|
|
* - `\ => \`
|
|
* - `\hello => \`
|
|
* - `\\hello => \\hello`
|
|
* - `\\hello\world => \\hello\world`
|
|
*/
|
|
function dirname(p) {
|
|
// Normalize slashes and trim unnecessary trailing slash
|
|
p = safeTrimTrailingSeparator(p);
|
|
// Windows UNC root, e.g. \\hello or \\hello\world
|
|
if (IS_WINDOWS && /^\\\\[^\\]+(\\[^\\]+)?$/.test(p)) {
|
|
return p;
|
|
}
|
|
// Get dirname
|
|
let result = external_path_.dirname(p);
|
|
// Trim trailing slash for Windows UNC root, e.g. \\hello\world\
|
|
if (IS_WINDOWS && /^\\\\[^\\]+\\[^\\]+\\$/.test(result)) {
|
|
result = safeTrimTrailingSeparator(result);
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Roots the path if not already rooted. On Windows, relative roots like `\`
|
|
* or `C:` are expanded based on the current working directory.
|
|
*/
|
|
function ensureAbsoluteRoot(root, itemPath) {
|
|
external_assert_(root, `ensureAbsoluteRoot parameter 'root' must not be empty`);
|
|
external_assert_(itemPath, `ensureAbsoluteRoot parameter 'itemPath' must not be empty`);
|
|
// Already rooted
|
|
if (hasAbsoluteRoot(itemPath)) {
|
|
return itemPath;
|
|
}
|
|
// Windows
|
|
if (IS_WINDOWS) {
|
|
// Check for itemPath like C: or C:foo
|
|
if (itemPath.match(/^[A-Z]:[^\\/]|^[A-Z]:$/i)) {
|
|
let cwd = process.cwd();
|
|
external_assert_(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`);
|
|
// Drive letter matches cwd? Expand to cwd
|
|
if (itemPath[0].toUpperCase() === cwd[0].toUpperCase()) {
|
|
// Drive only, e.g. C:
|
|
if (itemPath.length === 2) {
|
|
// Preserve specified drive letter case (upper or lower)
|
|
return `${itemPath[0]}:\\${cwd.substr(3)}`;
|
|
}
|
|
// Drive + path, e.g. C:foo
|
|
else {
|
|
if (!cwd.endsWith('\\')) {
|
|
cwd += '\\';
|
|
}
|
|
// Preserve specified drive letter case (upper or lower)
|
|
return `${itemPath[0]}:\\${cwd.substr(3)}${itemPath.substr(2)}`;
|
|
}
|
|
}
|
|
// Different drive
|
|
else {
|
|
return `${itemPath[0]}:\\${itemPath.substr(2)}`;
|
|
}
|
|
}
|
|
// Check for itemPath like \ or \foo
|
|
else if (normalizeSeparators(itemPath).match(/^\\$|^\\[^\\]/)) {
|
|
const cwd = process.cwd();
|
|
external_assert_(cwd.match(/^[A-Z]:\\/i), `Expected current directory to start with an absolute drive root. Actual '${cwd}'`);
|
|
return `${cwd[0]}:\\${itemPath.substr(1)}`;
|
|
}
|
|
}
|
|
external_assert_(hasAbsoluteRoot(root), `ensureAbsoluteRoot parameter 'root' must have an absolute root`);
|
|
// Otherwise ensure root ends with a separator
|
|
if (root.endsWith('/') || (IS_WINDOWS && root.endsWith('\\'))) {
|
|
// Intentionally empty
|
|
}
|
|
else {
|
|
// Append separator
|
|
root += external_path_.sep;
|
|
}
|
|
return root + itemPath;
|
|
}
|
|
/**
|
|
* On Linux/macOS, true if path starts with `/`. On Windows, true for paths like:
|
|
* `\\hello\share` and `C:\hello` (and using alternate separator).
|
|
*/
|
|
function hasAbsoluteRoot(itemPath) {
|
|
external_assert_(itemPath, `hasAbsoluteRoot parameter 'itemPath' must not be empty`);
|
|
// Normalize separators
|
|
itemPath = normalizeSeparators(itemPath);
|
|
// Windows
|
|
if (IS_WINDOWS) {
|
|
// E.g. \\hello\share or C:\hello
|
|
return itemPath.startsWith('\\\\') || /^[A-Z]:\\/i.test(itemPath);
|
|
}
|
|
// E.g. /hello
|
|
return itemPath.startsWith('/');
|
|
}
|
|
/**
|
|
* On Linux/macOS, true if path starts with `/`. On Windows, true for paths like:
|
|
* `\`, `\hello`, `\\hello\share`, `C:`, and `C:\hello` (and using alternate separator).
|
|
*/
|
|
function hasRoot(itemPath) {
|
|
external_assert_(itemPath, `isRooted parameter 'itemPath' must not be empty`);
|
|
// Normalize separators
|
|
itemPath = normalizeSeparators(itemPath);
|
|
// Windows
|
|
if (IS_WINDOWS) {
|
|
// E.g. \ or \hello or \\hello
|
|
// E.g. C: or C:\hello
|
|
return itemPath.startsWith('\\') || /^[A-Z]:/i.test(itemPath);
|
|
}
|
|
// E.g. /hello
|
|
return itemPath.startsWith('/');
|
|
}
|
|
/**
|
|
* Removes redundant slashes and converts `/` to `\` on Windows
|
|
*/
|
|
function normalizeSeparators(p) {
|
|
p = p || '';
|
|
// Windows
|
|
if (IS_WINDOWS) {
|
|
// Convert slashes on Windows
|
|
p = p.replace(/\//g, '\\');
|
|
// Remove redundant slashes
|
|
const isUnc = /^\\\\+[^\\]/.test(p); // e.g. \\hello
|
|
return (isUnc ? '\\' : '') + p.replace(/\\\\+/g, '\\'); // preserve leading \\ for UNC
|
|
}
|
|
// Remove redundant slashes
|
|
return p.replace(/\/\/+/g, '/');
|
|
}
|
|
/**
|
|
* Normalizes the path separators and trims the trailing separator (when safe).
|
|
* For example, `/foo/ => /foo` but `/ => /`
|
|
*/
|
|
function safeTrimTrailingSeparator(p) {
|
|
// Short-circuit if empty
|
|
if (!p) {
|
|
return '';
|
|
}
|
|
// Normalize separators
|
|
p = normalizeSeparators(p);
|
|
// No trailing slash
|
|
if (!p.endsWith(external_path_.sep)) {
|
|
return p;
|
|
}
|
|
// Check '/' on Linux/macOS and '\' on Windows
|
|
if (p === external_path_.sep) {
|
|
return p;
|
|
}
|
|
// On Windows check if drive root. E.g. C:\
|
|
if (IS_WINDOWS && /^[A-Z]:\\$/i.test(p)) {
|
|
return p;
|
|
}
|
|
// Otherwise trim trailing slash
|
|
return p.substr(0, p.length - 1);
|
|
}
|
|
//# sourceMappingURL=internal-path-helper.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-match-kind.js
|
|
/**
|
|
* Indicates whether a pattern matches a path
|
|
*/
|
|
var MatchKind;
|
|
(function (MatchKind) {
|
|
/** Not matched */
|
|
MatchKind[MatchKind["None"] = 0] = "None";
|
|
/** Matched if the path is a directory */
|
|
MatchKind[MatchKind["Directory"] = 1] = "Directory";
|
|
/** Matched if the path is a regular file */
|
|
MatchKind[MatchKind["File"] = 2] = "File";
|
|
/** Matched */
|
|
MatchKind[MatchKind["All"] = 3] = "All";
|
|
})(MatchKind || (MatchKind = {}));
|
|
//# sourceMappingURL=internal-match-kind.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-pattern-helper.js
|
|
|
|
|
|
const internal_pattern_helper_IS_WINDOWS = process.platform === 'win32';
|
|
/**
|
|
* Given an array of patterns, returns an array of paths to search.
|
|
* Duplicates and paths under other included paths are filtered out.
|
|
*/
|
|
function getSearchPaths(patterns) {
|
|
// Ignore negate patterns
|
|
patterns = patterns.filter(x => !x.negate);
|
|
// Create a map of all search paths
|
|
const searchPathMap = {};
|
|
for (const pattern of patterns) {
|
|
const key = internal_pattern_helper_IS_WINDOWS
|
|
? pattern.searchPath.toUpperCase()
|
|
: pattern.searchPath;
|
|
searchPathMap[key] = 'candidate';
|
|
}
|
|
const result = [];
|
|
for (const pattern of patterns) {
|
|
// Check if already included
|
|
const key = internal_pattern_helper_IS_WINDOWS
|
|
? pattern.searchPath.toUpperCase()
|
|
: pattern.searchPath;
|
|
if (searchPathMap[key] === 'included') {
|
|
continue;
|
|
}
|
|
// Check for an ancestor search path
|
|
let foundAncestor = false;
|
|
let tempKey = key;
|
|
let parent = dirname(tempKey);
|
|
while (parent !== tempKey) {
|
|
if (searchPathMap[parent]) {
|
|
foundAncestor = true;
|
|
break;
|
|
}
|
|
tempKey = parent;
|
|
parent = dirname(tempKey);
|
|
}
|
|
// Include the search pattern in the result
|
|
if (!foundAncestor) {
|
|
result.push(pattern.searchPath);
|
|
searchPathMap[key] = 'included';
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Matches the patterns against the path
|
|
*/
|
|
function internal_pattern_helper_match(patterns, itemPath) {
|
|
let result = MatchKind.None;
|
|
for (const pattern of patterns) {
|
|
if (pattern.negate) {
|
|
result &= ~pattern.match(itemPath);
|
|
}
|
|
else {
|
|
result |= pattern.match(itemPath);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Checks whether to descend further into the directory
|
|
*/
|
|
function internal_pattern_helper_partialMatch(patterns, itemPath) {
|
|
return patterns.some(x => !x.negate && x.partialMatch(itemPath));
|
|
}
|
|
//# sourceMappingURL=internal-pattern-helper.js.map
|
|
// EXTERNAL MODULE: external "os"
|
|
var external_os_ = __webpack_require__(857);
|
|
// EXTERNAL MODULE: ./node_modules/@actions/cache/node_modules/minimatch/minimatch.js
|
|
var minimatch = __webpack_require__(2593);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-path.js
|
|
|
|
|
|
|
|
const internal_path_IS_WINDOWS = process.platform === 'win32';
|
|
/**
|
|
* Helper class for parsing paths into segments
|
|
*/
|
|
class Path {
|
|
/**
|
|
* Constructs a Path
|
|
* @param itemPath Path or array of segments
|
|
*/
|
|
constructor(itemPath) {
|
|
this.segments = [];
|
|
// String
|
|
if (typeof itemPath === 'string') {
|
|
external_assert_(itemPath, `Parameter 'itemPath' must not be empty`);
|
|
// Normalize slashes and trim unnecessary trailing slash
|
|
itemPath = safeTrimTrailingSeparator(itemPath);
|
|
// Not rooted
|
|
if (!hasRoot(itemPath)) {
|
|
this.segments = itemPath.split(external_path_.sep);
|
|
}
|
|
// Rooted
|
|
else {
|
|
// Add all segments, while not at the root
|
|
let remaining = itemPath;
|
|
let dir = dirname(remaining);
|
|
while (dir !== remaining) {
|
|
// Add the segment
|
|
const basename = external_path_.basename(remaining);
|
|
this.segments.unshift(basename);
|
|
// Truncate the last segment
|
|
remaining = dir;
|
|
dir = dirname(remaining);
|
|
}
|
|
// Remainder is the root
|
|
this.segments.unshift(remaining);
|
|
}
|
|
}
|
|
// Array
|
|
else {
|
|
// Must not be empty
|
|
external_assert_(itemPath.length > 0, `Parameter 'itemPath' must not be an empty array`);
|
|
// Each segment
|
|
for (let i = 0; i < itemPath.length; i++) {
|
|
let segment = itemPath[i];
|
|
// Must not be empty
|
|
external_assert_(segment, `Parameter 'itemPath' must not contain any empty segments`);
|
|
// Normalize slashes
|
|
segment = normalizeSeparators(itemPath[i]);
|
|
// Root segment
|
|
if (i === 0 && hasRoot(segment)) {
|
|
segment = safeTrimTrailingSeparator(segment);
|
|
external_assert_(segment === dirname(segment), `Parameter 'itemPath' root segment contains information for multiple segments`);
|
|
this.segments.push(segment);
|
|
}
|
|
// All other segments
|
|
else {
|
|
// Must not contain slash
|
|
external_assert_(!segment.includes(external_path_.sep), `Parameter 'itemPath' contains unexpected path separators`);
|
|
this.segments.push(segment);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Converts the path to it's string representation
|
|
*/
|
|
toString() {
|
|
// First segment
|
|
let result = this.segments[0];
|
|
// All others
|
|
let skipSlash = result.endsWith(external_path_.sep) || (internal_path_IS_WINDOWS && /^[A-Z]:$/i.test(result));
|
|
for (let i = 1; i < this.segments.length; i++) {
|
|
if (skipSlash) {
|
|
skipSlash = false;
|
|
}
|
|
else {
|
|
result += external_path_.sep;
|
|
}
|
|
result += this.segments[i];
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
//# sourceMappingURL=internal-path.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-pattern.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const { Minimatch } = minimatch;
|
|
const internal_pattern_IS_WINDOWS = process.platform === 'win32';
|
|
class Pattern {
|
|
constructor(patternOrNegate, isImplicitPattern = false, segments, homedir) {
|
|
/**
|
|
* Indicates whether matches should be excluded from the result set
|
|
*/
|
|
this.negate = false;
|
|
// Pattern overload
|
|
let pattern;
|
|
if (typeof patternOrNegate === 'string') {
|
|
pattern = patternOrNegate.trim();
|
|
}
|
|
// Segments overload
|
|
else {
|
|
// Convert to pattern
|
|
segments = segments || [];
|
|
external_assert_(segments.length, `Parameter 'segments' must not empty`);
|
|
const root = Pattern.getLiteral(segments[0]);
|
|
external_assert_(root && hasAbsoluteRoot(root), `Parameter 'segments' first element must be a root path`);
|
|
pattern = new Path(segments).toString().trim();
|
|
if (patternOrNegate) {
|
|
pattern = `!${pattern}`;
|
|
}
|
|
}
|
|
// Negate
|
|
while (pattern.startsWith('!')) {
|
|
this.negate = !this.negate;
|
|
pattern = pattern.substr(1).trim();
|
|
}
|
|
// Normalize slashes and ensures absolute root
|
|
pattern = Pattern.fixupPattern(pattern, homedir);
|
|
// Segments
|
|
this.segments = new Path(pattern).segments;
|
|
// Trailing slash indicates the pattern should only match directories, not regular files
|
|
this.trailingSeparator = normalizeSeparators(pattern)
|
|
.endsWith(external_path_.sep);
|
|
pattern = safeTrimTrailingSeparator(pattern);
|
|
// Search path (literal path prior to the first glob segment)
|
|
let foundGlob = false;
|
|
const searchSegments = this.segments
|
|
.map(x => Pattern.getLiteral(x))
|
|
.filter(x => !foundGlob && !(foundGlob = x === ''));
|
|
this.searchPath = new Path(searchSegments).toString();
|
|
// Root RegExp (required when determining partial match)
|
|
this.rootRegExp = new RegExp(Pattern.regExpEscape(searchSegments[0]), internal_pattern_IS_WINDOWS ? 'i' : '');
|
|
this.isImplicitPattern = isImplicitPattern;
|
|
// Create minimatch
|
|
const minimatchOptions = {
|
|
dot: true,
|
|
nobrace: true,
|
|
nocase: internal_pattern_IS_WINDOWS,
|
|
nocomment: true,
|
|
noext: true,
|
|
nonegate: true
|
|
};
|
|
pattern = internal_pattern_IS_WINDOWS ? pattern.replace(/\\/g, '/') : pattern;
|
|
this.minimatch = new Minimatch(pattern, minimatchOptions);
|
|
}
|
|
/**
|
|
* Matches the pattern against the specified path
|
|
*/
|
|
match(itemPath) {
|
|
// Last segment is globstar?
|
|
if (this.segments[this.segments.length - 1] === '**') {
|
|
// Normalize slashes
|
|
itemPath = normalizeSeparators(itemPath);
|
|
// Append a trailing slash. Otherwise Minimatch will not match the directory immediately
|
|
// preceding the globstar. For example, given the pattern `/foo/**`, Minimatch returns
|
|
// false for `/foo` but returns true for `/foo/`. Append a trailing slash to handle that quirk.
|
|
if (!itemPath.endsWith(external_path_.sep) && this.isImplicitPattern === false) {
|
|
// Note, this is safe because the constructor ensures the pattern has an absolute root.
|
|
// For example, formats like C: and C:foo on Windows are resolved to an absolute root.
|
|
itemPath = `${itemPath}${external_path_.sep}`;
|
|
}
|
|
}
|
|
else {
|
|
// Normalize slashes and trim unnecessary trailing slash
|
|
itemPath = safeTrimTrailingSeparator(itemPath);
|
|
}
|
|
// Match
|
|
if (this.minimatch.match(itemPath)) {
|
|
return this.trailingSeparator ? MatchKind.Directory : MatchKind.All;
|
|
}
|
|
return MatchKind.None;
|
|
}
|
|
/**
|
|
* Indicates whether the pattern may match descendants of the specified path
|
|
*/
|
|
partialMatch(itemPath) {
|
|
// Normalize slashes and trim unnecessary trailing slash
|
|
itemPath = safeTrimTrailingSeparator(itemPath);
|
|
// matchOne does not handle root path correctly
|
|
if (dirname(itemPath) === itemPath) {
|
|
return this.rootRegExp.test(itemPath);
|
|
}
|
|
return this.minimatch.matchOne(itemPath.split(internal_pattern_IS_WINDOWS ? /\\+/ : /\/+/), this.minimatch.set[0], true);
|
|
}
|
|
/**
|
|
* Escapes glob patterns within a path
|
|
*/
|
|
static globEscape(s) {
|
|
return (internal_pattern_IS_WINDOWS ? s : s.replace(/\\/g, '\\\\')) // escape '\' on Linux/macOS
|
|
.replace(/(\[)(?=[^/]+\])/g, '[[]') // escape '[' when ']' follows within the path segment
|
|
.replace(/\?/g, '[?]') // escape '?'
|
|
.replace(/\*/g, '[*]'); // escape '*'
|
|
}
|
|
/**
|
|
* Normalizes slashes and ensures absolute root
|
|
*/
|
|
static fixupPattern(pattern, homedir) {
|
|
// Empty
|
|
external_assert_(pattern, 'pattern cannot be empty');
|
|
// Must not contain `.` segment, unless first segment
|
|
// Must not contain `..` segment
|
|
const literalSegments = new Path(pattern).segments.map(x => Pattern.getLiteral(x));
|
|
external_assert_(literalSegments.every((x, i) => (x !== '.' || i === 0) && x !== '..'), `Invalid pattern '${pattern}'. Relative pathing '.' and '..' is not allowed.`);
|
|
// Must not contain globs in root, e.g. Windows UNC path \\foo\b*r
|
|
external_assert_(!hasRoot(pattern) || literalSegments[0], `Invalid pattern '${pattern}'. Root segment must not contain globs.`);
|
|
// Normalize slashes
|
|
pattern = normalizeSeparators(pattern);
|
|
// Replace leading `.` segment
|
|
if (pattern === '.' || pattern.startsWith(`.${external_path_.sep}`)) {
|
|
pattern = Pattern.globEscape(process.cwd()) + pattern.substr(1);
|
|
}
|
|
// Replace leading `~` segment
|
|
else if (pattern === '~' || pattern.startsWith(`~${external_path_.sep}`)) {
|
|
homedir = homedir || external_os_.homedir();
|
|
external_assert_(homedir, 'Unable to determine HOME directory');
|
|
external_assert_(hasAbsoluteRoot(homedir), `Expected HOME directory to be a rooted path. Actual '${homedir}'`);
|
|
pattern = Pattern.globEscape(homedir) + pattern.substr(1);
|
|
}
|
|
// Replace relative drive root, e.g. pattern is C: or C:foo
|
|
else if (internal_pattern_IS_WINDOWS &&
|
|
(pattern.match(/^[A-Z]:$/i) || pattern.match(/^[A-Z]:[^\\]/i))) {
|
|
let root = ensureAbsoluteRoot('C:\\dummy-root', pattern.substr(0, 2));
|
|
if (pattern.length > 2 && !root.endsWith('\\')) {
|
|
root += '\\';
|
|
}
|
|
pattern = Pattern.globEscape(root) + pattern.substr(2);
|
|
}
|
|
// Replace relative root, e.g. pattern is \ or \foo
|
|
else if (internal_pattern_IS_WINDOWS && (pattern === '\\' || pattern.match(/^\\[^\\]/))) {
|
|
let root = ensureAbsoluteRoot('C:\\dummy-root', '\\');
|
|
if (!root.endsWith('\\')) {
|
|
root += '\\';
|
|
}
|
|
pattern = Pattern.globEscape(root) + pattern.substr(1);
|
|
}
|
|
// Otherwise ensure absolute root
|
|
else {
|
|
pattern = ensureAbsoluteRoot(Pattern.globEscape(process.cwd()), pattern);
|
|
}
|
|
return normalizeSeparators(pattern);
|
|
}
|
|
/**
|
|
* Attempts to unescape a pattern segment to create a literal path segment.
|
|
* Otherwise returns empty string.
|
|
*/
|
|
static getLiteral(segment) {
|
|
let literal = '';
|
|
for (let i = 0; i < segment.length; i++) {
|
|
const c = segment[i];
|
|
// Escape
|
|
if (c === '\\' && !internal_pattern_IS_WINDOWS && i + 1 < segment.length) {
|
|
literal += segment[++i];
|
|
continue;
|
|
}
|
|
// Wildcard
|
|
else if (c === '*' || c === '?') {
|
|
return '';
|
|
}
|
|
// Character set
|
|
else if (c === '[' && i + 1 < segment.length) {
|
|
let set = '';
|
|
let closed = -1;
|
|
for (let i2 = i + 1; i2 < segment.length; i2++) {
|
|
const c2 = segment[i2];
|
|
// Escape
|
|
if (c2 === '\\' && !internal_pattern_IS_WINDOWS && i2 + 1 < segment.length) {
|
|
set += segment[++i2];
|
|
continue;
|
|
}
|
|
// Closed
|
|
else if (c2 === ']') {
|
|
closed = i2;
|
|
break;
|
|
}
|
|
// Otherwise
|
|
else {
|
|
set += c2;
|
|
}
|
|
}
|
|
// Closed?
|
|
if (closed >= 0) {
|
|
// Cannot convert
|
|
if (set.length > 1) {
|
|
return '';
|
|
}
|
|
// Convert to literal
|
|
if (set) {
|
|
literal += set;
|
|
i = closed;
|
|
continue;
|
|
}
|
|
}
|
|
// Otherwise fall thru
|
|
}
|
|
// Append
|
|
literal += c;
|
|
}
|
|
return literal;
|
|
}
|
|
/**
|
|
* Escapes regexp special characters
|
|
* https://javascript.info/regexp-escaping
|
|
*/
|
|
static regExpEscape(s) {
|
|
return s.replace(/[[\\^$.|?*+()]/g, '\\$&');
|
|
}
|
|
}
|
|
//# sourceMappingURL=internal-pattern.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-search-state.js
|
|
class SearchState {
|
|
constructor(path, level) {
|
|
this.path = path;
|
|
this.level = level;
|
|
}
|
|
}
|
|
//# sourceMappingURL=internal-search-state.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-globber.js
|
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var __asyncValues = (undefined && undefined.__asyncValues) || function (o) {
|
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var m = o[Symbol.asyncIterator], i;
|
|
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
};
|
|
var __await = (undefined && undefined.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
var __asyncGenerator = (undefined && undefined.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
|
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
function fulfill(value) { resume("next", value); }
|
|
function reject(value) { resume("throw", value); }
|
|
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const internal_globber_IS_WINDOWS = process.platform === 'win32';
|
|
class DefaultGlobber {
|
|
constructor(options) {
|
|
this.patterns = [];
|
|
this.searchPaths = [];
|
|
this.options = getOptions(options);
|
|
}
|
|
getSearchPaths() {
|
|
// Return a copy
|
|
return this.searchPaths.slice();
|
|
}
|
|
glob() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
var _a, e_1, _b, _c;
|
|
const result = [];
|
|
try {
|
|
for (var _d = true, _e = __asyncValues(this.globGenerator()), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
|
|
_c = _f.value;
|
|
_d = false;
|
|
const itemPath = _c;
|
|
result.push(itemPath);
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
return result;
|
|
});
|
|
}
|
|
globGenerator() {
|
|
return __asyncGenerator(this, arguments, function* globGenerator_1() {
|
|
// Fill in defaults options
|
|
const options = getOptions(this.options);
|
|
// Implicit descendants?
|
|
const patterns = [];
|
|
for (const pattern of this.patterns) {
|
|
patterns.push(pattern);
|
|
if (options.implicitDescendants &&
|
|
(pattern.trailingSeparator ||
|
|
pattern.segments[pattern.segments.length - 1] !== '**')) {
|
|
patterns.push(new Pattern(pattern.negate, true, pattern.segments.concat('**')));
|
|
}
|
|
}
|
|
// Push the search paths
|
|
const stack = [];
|
|
for (const searchPath of getSearchPaths(patterns)) {
|
|
lib_core/* debug */.Yz(`Search path '${searchPath}'`);
|
|
// Exists?
|
|
try {
|
|
// Intentionally using lstat. Detection for broken symlink
|
|
// will be performed later (if following symlinks).
|
|
yield __await(external_fs_.promises.lstat(searchPath));
|
|
}
|
|
catch (err) {
|
|
if (err.code === 'ENOENT') {
|
|
continue;
|
|
}
|
|
throw err;
|
|
}
|
|
stack.unshift(new SearchState(searchPath, 1));
|
|
}
|
|
// Search
|
|
const traversalChain = []; // used to detect cycles
|
|
while (stack.length) {
|
|
// Pop
|
|
const item = stack.pop();
|
|
// Match?
|
|
const match = internal_pattern_helper_match(patterns, item.path);
|
|
const partialMatch = !!match || internal_pattern_helper_partialMatch(patterns, item.path);
|
|
if (!match && !partialMatch) {
|
|
continue;
|
|
}
|
|
// Stat
|
|
const stats = yield __await(DefaultGlobber.stat(item, options, traversalChain)
|
|
// Broken symlink, or symlink cycle detected, or no longer exists
|
|
);
|
|
// Broken symlink, or symlink cycle detected, or no longer exists
|
|
if (!stats) {
|
|
continue;
|
|
}
|
|
// Hidden file or directory?
|
|
if (options.excludeHiddenFiles && external_path_.basename(item.path).match(/^\./)) {
|
|
continue;
|
|
}
|
|
// Directory
|
|
if (stats.isDirectory()) {
|
|
// Matched
|
|
if (match & MatchKind.Directory && options.matchDirectories) {
|
|
yield yield __await(item.path);
|
|
}
|
|
// Descend?
|
|
else if (!partialMatch) {
|
|
continue;
|
|
}
|
|
// Push the child items in reverse
|
|
const childLevel = item.level + 1;
|
|
const childItems = (yield __await(external_fs_.promises.readdir(item.path))).map(x => new SearchState(external_path_.join(item.path, x), childLevel));
|
|
stack.push(...childItems.reverse());
|
|
}
|
|
// File
|
|
else if (match & MatchKind.File) {
|
|
yield yield __await(item.path);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Constructs a DefaultGlobber
|
|
*/
|
|
static create(patterns, options) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const result = new DefaultGlobber(options);
|
|
if (internal_globber_IS_WINDOWS) {
|
|
patterns = patterns.replace(/\r\n/g, '\n');
|
|
patterns = patterns.replace(/\r/g, '\n');
|
|
}
|
|
const lines = patterns.split('\n').map(x => x.trim());
|
|
for (const line of lines) {
|
|
// Empty or comment
|
|
if (!line || line.startsWith('#')) {
|
|
continue;
|
|
}
|
|
// Pattern
|
|
else {
|
|
result.patterns.push(new Pattern(line));
|
|
}
|
|
}
|
|
result.searchPaths.push(...getSearchPaths(result.patterns));
|
|
return result;
|
|
});
|
|
}
|
|
static stat(item, options, traversalChain) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
// Note:
|
|
// `stat` returns info about the target of a symlink (or symlink chain)
|
|
// `lstat` returns info about a symlink itself
|
|
let stats;
|
|
if (options.followSymbolicLinks) {
|
|
try {
|
|
// Use `stat` (following symlinks)
|
|
stats = yield external_fs_.promises.stat(item.path);
|
|
}
|
|
catch (err) {
|
|
if (err.code === 'ENOENT') {
|
|
if (options.omitBrokenSymbolicLinks) {
|
|
lib_core/* debug */.Yz(`Broken symlink '${item.path}'`);
|
|
return undefined;
|
|
}
|
|
throw new Error(`No information found for the path '${item.path}'. This may indicate a broken symbolic link.`);
|
|
}
|
|
throw err;
|
|
}
|
|
}
|
|
else {
|
|
// Use `lstat` (not following symlinks)
|
|
stats = yield external_fs_.promises.lstat(item.path);
|
|
}
|
|
// Note, isDirectory() returns false for the lstat of a symlink
|
|
if (stats.isDirectory() && options.followSymbolicLinks) {
|
|
// Get the realpath
|
|
const realPath = yield external_fs_.promises.realpath(item.path);
|
|
// Fixup the traversal chain to match the item level
|
|
while (traversalChain.length >= item.level) {
|
|
traversalChain.pop();
|
|
}
|
|
// Test for a cycle
|
|
if (traversalChain.some((x) => x === realPath)) {
|
|
lib_core/* debug */.Yz(`Symlink cycle detected for path '${item.path}' and realpath '${realPath}'`);
|
|
return undefined;
|
|
}
|
|
// Update the traversal chain
|
|
traversalChain.push(realPath);
|
|
}
|
|
return stats;
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=internal-globber.js.map
|
|
// EXTERNAL MODULE: external "crypto"
|
|
var external_crypto_ = __webpack_require__(6982);
|
|
// EXTERNAL MODULE: external "stream"
|
|
var external_stream_ = __webpack_require__(2203);
|
|
// EXTERNAL MODULE: external "util"
|
|
var external_util_ = __webpack_require__(9023);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/internal-hash-files.js
|
|
var internal_hash_files_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var internal_hash_files_asyncValues = (undefined && undefined.__asyncValues) || function (o) {
|
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var m = o[Symbol.asyncIterator], i;
|
|
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function hashFiles(globber_1, currentWorkspace_1) {
|
|
return internal_hash_files_awaiter(this, arguments, void 0, function* (globber, currentWorkspace, verbose = false) {
|
|
var _a, e_1, _b, _c;
|
|
var _d;
|
|
const writeDelegate = verbose ? core.info : core.debug;
|
|
let hasMatch = false;
|
|
const githubWorkspace = currentWorkspace
|
|
? currentWorkspace
|
|
: ((_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd());
|
|
const result = crypto.createHash('sha256');
|
|
let count = 0;
|
|
try {
|
|
for (var _e = true, _f = internal_hash_files_asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
|
|
_c = _g.value;
|
|
_e = false;
|
|
const file = _c;
|
|
writeDelegate(file);
|
|
if (!file.startsWith(`${githubWorkspace}${path.sep}`)) {
|
|
writeDelegate(`Ignore '${file}' since it is not under GITHUB_WORKSPACE.`);
|
|
continue;
|
|
}
|
|
if (fs.statSync(file).isDirectory()) {
|
|
writeDelegate(`Skip directory '${file}'.`);
|
|
continue;
|
|
}
|
|
const hash = crypto.createHash('sha256');
|
|
const pipeline = util.promisify(stream.pipeline);
|
|
yield pipeline(fs.createReadStream(file), hash);
|
|
result.write(hash.digest());
|
|
count++;
|
|
if (!hasMatch) {
|
|
hasMatch = true;
|
|
}
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
result.end();
|
|
if (hasMatch) {
|
|
writeDelegate(`Found ${count} files to hash.`);
|
|
return result.digest('hex');
|
|
}
|
|
else {
|
|
writeDelegate(`No matches found for glob`);
|
|
return '';
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=internal-hash-files.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/node_modules/@actions/glob/lib/glob.js
|
|
var glob_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
/**
|
|
* Constructs a globber
|
|
*
|
|
* @param patterns Patterns separated by newlines
|
|
* @param options Glob options
|
|
*/
|
|
function create(patterns, options) {
|
|
return glob_awaiter(this, void 0, void 0, function* () {
|
|
return yield DefaultGlobber.create(patterns, options);
|
|
});
|
|
}
|
|
/**
|
|
* Computes the sha256 hash of a glob
|
|
*
|
|
* @param patterns Patterns separated by newlines
|
|
* @param currentWorkspace Workspace used when matching files
|
|
* @param options Glob options
|
|
* @param verbose Enables verbose logging
|
|
*/
|
|
function glob_hashFiles(patterns_1) {
|
|
return glob_awaiter(this, arguments, void 0, function* (patterns, currentWorkspace = '', options, verbose = false) {
|
|
let followSymbolicLinks = true;
|
|
if (options && typeof options.followSymbolicLinks === 'boolean') {
|
|
followSymbolicLinks = options.followSymbolicLinks;
|
|
}
|
|
const globber = yield create(patterns, { followSymbolicLinks });
|
|
return _hashFiles(globber, currentWorkspace, verbose);
|
|
});
|
|
}
|
|
//# sourceMappingURL=glob.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@actions/io/lib/io.js
|
|
var io = __webpack_require__(8701);
|
|
// EXTERNAL MODULE: ./node_modules/semver/index.js
|
|
var semver = __webpack_require__(2088);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/constants.js
|
|
var CacheFilename;
|
|
(function (CacheFilename) {
|
|
CacheFilename["Gzip"] = "cache.tgz";
|
|
CacheFilename["Zstd"] = "cache.tzst";
|
|
})(CacheFilename || (CacheFilename = {}));
|
|
var CompressionMethod;
|
|
(function (CompressionMethod) {
|
|
CompressionMethod["Gzip"] = "gzip";
|
|
// Long range mode was added to zstd in v1.3.2.
|
|
// This enum is for earlier version of zstd that does not have --long support
|
|
CompressionMethod["ZstdWithoutLong"] = "zstd-without-long";
|
|
CompressionMethod["Zstd"] = "zstd";
|
|
})(CompressionMethod || (CompressionMethod = {}));
|
|
var ArchiveToolType;
|
|
(function (ArchiveToolType) {
|
|
ArchiveToolType["GNU"] = "gnu";
|
|
ArchiveToolType["BSD"] = "bsd";
|
|
})(ArchiveToolType || (ArchiveToolType = {}));
|
|
// The default number of retry attempts.
|
|
const DefaultRetryAttempts = 2;
|
|
// The default delay in milliseconds between retry attempts.
|
|
const DefaultRetryDelay = 5000;
|
|
// Socket timeout in milliseconds during download. If no traffic is received
|
|
// over the socket during this period, the socket is destroyed and the download
|
|
// is aborted.
|
|
const SocketTimeout = 5000;
|
|
// The default path of GNUtar on hosted Windows runners
|
|
const GnuTarPathOnWindows = `${process.env['PROGRAMFILES']}\\Git\\usr\\bin\\tar.exe`;
|
|
// The default path of BSDtar on hosted Windows runners
|
|
const SystemTarPathOnWindows = `${process.env['SYSTEMDRIVE']}\\Windows\\System32\\tar.exe`;
|
|
const TarFilename = 'cache.tar';
|
|
const ManifestFilename = 'manifest.txt';
|
|
const CacheFileSizeLimit = 10 * Math.pow(1024, 3); // 10GiB per repository
|
|
// Prefix the cache backend embeds in a read-denial message (v2 twirp
|
|
// GetCacheEntryDownloadURL error or the GHES v1 `_apis/artifactcache` 403 body).
|
|
// Shared so cache.ts and cacheHttpClient.ts match the same contract value.
|
|
const CacheReadDeniedMessagePrefix = 'cache read denied:';
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/cacheUtils.js
|
|
var cacheUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var cacheUtils_asyncValues = (undefined && undefined.__asyncValues) || function (o) {
|
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var m = o[Symbol.asyncIterator], i;
|
|
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const versionSalt = '1.0';
|
|
// From https://github.com/actions/toolkit/blob/main/packages/tool-cache/src/tool-cache.ts#L23
|
|
function createTempDirectory() {
|
|
return cacheUtils_awaiter(this, void 0, void 0, function* () {
|
|
const IS_WINDOWS = process.platform === 'win32';
|
|
let tempDirectory = process.env['RUNNER_TEMP'] || '';
|
|
if (!tempDirectory) {
|
|
let baseLocation;
|
|
if (IS_WINDOWS) {
|
|
// On Windows use the USERPROFILE env variable
|
|
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
|
}
|
|
else {
|
|
if (process.platform === 'darwin') {
|
|
baseLocation = '/Users';
|
|
}
|
|
else {
|
|
baseLocation = '/home';
|
|
}
|
|
}
|
|
tempDirectory = external_path_.join(baseLocation, 'actions', 'temp');
|
|
}
|
|
const dest = external_path_.join(tempDirectory, external_crypto_.randomUUID());
|
|
yield io/* mkdirP */.U$(dest);
|
|
return dest;
|
|
});
|
|
}
|
|
function getArchiveFileSizeInBytes(filePath) {
|
|
return external_fs_.statSync(filePath).size;
|
|
}
|
|
function resolvePaths(patterns) {
|
|
return cacheUtils_awaiter(this, void 0, void 0, function* () {
|
|
var _a, e_1, _b, _c;
|
|
var _d;
|
|
const paths = [];
|
|
const workspace = (_d = process.env['GITHUB_WORKSPACE']) !== null && _d !== void 0 ? _d : process.cwd();
|
|
const globber = yield create(patterns.join('\n'), {
|
|
implicitDescendants: false
|
|
});
|
|
try {
|
|
for (var _e = true, _f = cacheUtils_asyncValues(globber.globGenerator()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {
|
|
_c = _g.value;
|
|
_e = false;
|
|
const file = _c;
|
|
const relativeFile = external_path_.relative(workspace, file)
|
|
.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/');
|
|
lib_core/* debug */.Yz(`Matched: ${relativeFile}`);
|
|
// Paths are made relative so the tar entries are all relative to the root of the workspace.
|
|
if (relativeFile === '') {
|
|
// path.relative returns empty string if workspace and file are equal
|
|
paths.push('.');
|
|
}
|
|
else {
|
|
paths.push(`${relativeFile}`);
|
|
}
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
return paths;
|
|
});
|
|
}
|
|
function unlinkFile(filePath) {
|
|
return cacheUtils_awaiter(this, void 0, void 0, function* () {
|
|
return external_util_.promisify(external_fs_.unlink)(filePath);
|
|
});
|
|
}
|
|
function getVersion(app_1) {
|
|
return cacheUtils_awaiter(this, arguments, void 0, function* (app, additionalArgs = []) {
|
|
let versionOutput = '';
|
|
additionalArgs.push('--version');
|
|
lib_core/* debug */.Yz(`Checking ${app} ${additionalArgs.join(' ')}`);
|
|
try {
|
|
yield exec/* exec */.m(`${app}`, additionalArgs, {
|
|
ignoreReturnCode: true,
|
|
silent: true,
|
|
listeners: {
|
|
stdout: (data) => (versionOutput += data.toString()),
|
|
stderr: (data) => (versionOutput += data.toString())
|
|
}
|
|
});
|
|
}
|
|
catch (err) {
|
|
lib_core/* debug */.Yz(err.message);
|
|
}
|
|
versionOutput = versionOutput.trim();
|
|
lib_core/* debug */.Yz(versionOutput);
|
|
return versionOutput;
|
|
});
|
|
}
|
|
// Use zstandard if possible to maximize cache performance
|
|
function getCompressionMethod() {
|
|
return cacheUtils_awaiter(this, void 0, void 0, function* () {
|
|
const versionOutput = yield getVersion('zstd', ['--quiet']);
|
|
const version = semver.clean(versionOutput);
|
|
lib_core/* debug */.Yz(`zstd version: ${version}`);
|
|
if (versionOutput === '') {
|
|
return CompressionMethod.Gzip;
|
|
}
|
|
else {
|
|
return CompressionMethod.ZstdWithoutLong;
|
|
}
|
|
});
|
|
}
|
|
function getCacheFileName(compressionMethod) {
|
|
return compressionMethod === CompressionMethod.Gzip
|
|
? CacheFilename.Gzip
|
|
: CacheFilename.Zstd;
|
|
}
|
|
function getGnuTarPathOnWindows() {
|
|
return cacheUtils_awaiter(this, void 0, void 0, function* () {
|
|
if (external_fs_.existsSync(GnuTarPathOnWindows)) {
|
|
return GnuTarPathOnWindows;
|
|
}
|
|
const versionOutput = yield getVersion('tar');
|
|
return versionOutput.toLowerCase().includes('gnu tar') ? io/* which */.K7('tar') : '';
|
|
});
|
|
}
|
|
function assertDefined(name, value) {
|
|
if (value === undefined) {
|
|
throw Error(`Expected ${name} but value was undefiend`);
|
|
}
|
|
return value;
|
|
}
|
|
function getCacheVersion(paths, compressionMethod, enableCrossOsArchive = false) {
|
|
// don't pass changes upstream
|
|
const components = paths.slice();
|
|
// Add compression method to cache version to restore
|
|
// compressed cache as per compression method
|
|
if (compressionMethod) {
|
|
components.push(compressionMethod);
|
|
}
|
|
// Only check for windows platforms if enableCrossOsArchive is false
|
|
if (process.platform === 'win32' && !enableCrossOsArchive) {
|
|
components.push('windows-only');
|
|
}
|
|
// Add salt to cache version to support breaking changes in cache entry
|
|
components.push(versionSalt);
|
|
return external_crypto_.createHash('sha256').update(components.join('|')).digest('hex');
|
|
}
|
|
function getRuntimeToken() {
|
|
const token = process.env['ACTIONS_RUNTIME_TOKEN'];
|
|
if (!token) {
|
|
throw new Error('Unable to get the ACTIONS_RUNTIME_TOKEN env variable');
|
|
}
|
|
return token;
|
|
}
|
|
//# sourceMappingURL=cacheUtils.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@actions/http-client/lib/index.js + 1 modules
|
|
var lib = __webpack_require__(4942);
|
|
// EXTERNAL MODULE: ./node_modules/@actions/http-client/lib/auth.js
|
|
var auth = __webpack_require__(2145);
|
|
// EXTERNAL MODULE: external "url"
|
|
var external_url_ = __webpack_require__(7016);
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/abort-controller/AbortError.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* This error is thrown when an asynchronous operation has been aborted.
|
|
* Check for this error by testing the `name` that the name property of the
|
|
* error matches `"AbortError"`.
|
|
*
|
|
* @example
|
|
* ```ts snippet:ReadmeSampleAbortError
|
|
* import { AbortError } from "@typespec/ts-http-runtime";
|
|
*
|
|
* async function doAsyncWork(options: { abortSignal: AbortSignal }): Promise<void> {
|
|
* if (options.abortSignal.aborted) {
|
|
* throw new AbortError();
|
|
* }
|
|
*
|
|
* // do async work
|
|
* }
|
|
*
|
|
* const controller = new AbortController();
|
|
* controller.abort();
|
|
*
|
|
* try {
|
|
* doAsyncWork({ abortSignal: controller.signal });
|
|
* } catch (e) {
|
|
* if (e instanceof Error && e.name === "AbortError") {
|
|
* // handle abort error here.
|
|
* }
|
|
* }
|
|
* ```
|
|
*/
|
|
class AbortError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "AbortError";
|
|
}
|
|
}
|
|
//# sourceMappingURL=AbortError.js.map
|
|
// EXTERNAL MODULE: external "node:os"
|
|
var external_node_os_ = __webpack_require__(8161);
|
|
// EXTERNAL MODULE: external "node:util"
|
|
var external_node_util_ = __webpack_require__(7975);
|
|
// EXTERNAL MODULE: external "node:process"
|
|
var external_node_process_ = __webpack_require__(1708);
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/logger/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
function log(message, ...args) {
|
|
external_node_process_.stderr.write(`${external_node_util_.format(message, ...args)}${external_node_os_.EOL}`);
|
|
}
|
|
//# sourceMappingURL=log.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/env.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Returns the value of the specified environment variable.
|
|
*
|
|
* @internal
|
|
*/
|
|
function getEnvironmentVariable(name) {
|
|
return external_node_process_.env[name];
|
|
}
|
|
/**
|
|
* Emits a Node.js process warning.
|
|
*
|
|
* @internal
|
|
*/
|
|
function env_emitNodeWarning(warning) {
|
|
process.emitWarning(warning);
|
|
}
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Web Browser.
|
|
*/
|
|
const isBrowser = false;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Web Worker.
|
|
*/
|
|
const isWebWorker = false;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Deno.
|
|
*/
|
|
const isDeno = typeof external_node_process_.versions.deno === "string" && external_node_process_.versions.deno.length > 0;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Bun.sh.
|
|
*/
|
|
const isBun = typeof external_node_process_.versions.bun === "string" && external_node_process_.versions.bun.length > 0;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Node.js compatible environment.
|
|
*/
|
|
const env_isNodeLike = true;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Node.JS.
|
|
*/
|
|
const isNodeRuntime = !isBun && !isDeno;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is in React-Native.
|
|
*/
|
|
const isReactNative = false;
|
|
//# sourceMappingURL=env.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/logger/debug.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
const debugEnvVariable = getEnvironmentVariable("DEBUG");
|
|
let enabledString;
|
|
let enabledNamespaces = [];
|
|
let skippedNamespaces = [];
|
|
const debuggers = [];
|
|
if (debugEnvVariable) {
|
|
enable(debugEnvVariable);
|
|
}
|
|
const debugObj = Object.assign((namespace) => {
|
|
return createDebugger(namespace);
|
|
}, {
|
|
enable,
|
|
enabled,
|
|
disable,
|
|
log: log,
|
|
});
|
|
function enable(namespaces) {
|
|
enabledString = namespaces;
|
|
enabledNamespaces = [];
|
|
skippedNamespaces = [];
|
|
const namespaceList = namespaces.split(",").map((ns) => ns.trim());
|
|
for (const ns of namespaceList) {
|
|
if (ns.startsWith("-")) {
|
|
skippedNamespaces.push(ns.substring(1));
|
|
}
|
|
else {
|
|
enabledNamespaces.push(ns);
|
|
}
|
|
}
|
|
for (const instance of debuggers) {
|
|
instance.enabled = enabled(instance.namespace);
|
|
}
|
|
}
|
|
function enabled(namespace) {
|
|
if (namespace.endsWith("*")) {
|
|
return true;
|
|
}
|
|
for (const skipped of skippedNamespaces) {
|
|
if (namespaceMatches(namespace, skipped)) {
|
|
return false;
|
|
}
|
|
}
|
|
for (const enabledNamespace of enabledNamespaces) {
|
|
if (namespaceMatches(namespace, enabledNamespace)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
/**
|
|
* Given a namespace, check if it matches a pattern.
|
|
* Patterns only have a single wildcard character which is *.
|
|
* The behavior of * is that it matches zero or more other characters.
|
|
*/
|
|
function namespaceMatches(namespace, patternToMatch) {
|
|
// simple case, no pattern matching required
|
|
if (patternToMatch.indexOf("*") === -1) {
|
|
return namespace === patternToMatch;
|
|
}
|
|
let pattern = patternToMatch;
|
|
// normalize successive * if needed
|
|
if (patternToMatch.indexOf("**") !== -1) {
|
|
const patternParts = [];
|
|
let lastCharacter = "";
|
|
for (const character of patternToMatch) {
|
|
if (character === "*" && lastCharacter === "*") {
|
|
continue;
|
|
}
|
|
else {
|
|
lastCharacter = character;
|
|
patternParts.push(character);
|
|
}
|
|
}
|
|
pattern = patternParts.join("");
|
|
}
|
|
let namespaceIndex = 0;
|
|
let patternIndex = 0;
|
|
const patternLength = pattern.length;
|
|
const namespaceLength = namespace.length;
|
|
let lastWildcard = -1;
|
|
let lastWildcardNamespace = -1;
|
|
while (namespaceIndex < namespaceLength && patternIndex < patternLength) {
|
|
if (pattern[patternIndex] === "*") {
|
|
lastWildcard = patternIndex;
|
|
patternIndex++;
|
|
if (patternIndex === patternLength) {
|
|
// if wildcard is the last character, it will match the remaining namespace string
|
|
return true;
|
|
}
|
|
// now we let the wildcard eat characters until we match the next literal in the pattern
|
|
while (namespace[namespaceIndex] !== pattern[patternIndex]) {
|
|
namespaceIndex++;
|
|
// reached the end of the namespace without a match
|
|
if (namespaceIndex === namespaceLength) {
|
|
return false;
|
|
}
|
|
}
|
|
// now that we have a match, let's try to continue on
|
|
// however, it's possible we could find a later match
|
|
// so keep a reference in case we have to backtrack
|
|
lastWildcardNamespace = namespaceIndex;
|
|
namespaceIndex++;
|
|
patternIndex++;
|
|
continue;
|
|
}
|
|
else if (pattern[patternIndex] === namespace[namespaceIndex]) {
|
|
// simple case: literal pattern matches so keep going
|
|
patternIndex++;
|
|
namespaceIndex++;
|
|
}
|
|
else if (lastWildcard >= 0) {
|
|
// special case: we don't have a literal match, but there is a previous wildcard
|
|
// which we can backtrack to and try having the wildcard eat the match instead
|
|
patternIndex = lastWildcard + 1;
|
|
namespaceIndex = lastWildcardNamespace + 1;
|
|
// we've reached the end of the namespace without a match
|
|
if (namespaceIndex === namespaceLength) {
|
|
return false;
|
|
}
|
|
// similar to the previous logic, let's keep going until we find the next literal match
|
|
while (namespace[namespaceIndex] !== pattern[patternIndex]) {
|
|
namespaceIndex++;
|
|
if (namespaceIndex === namespaceLength) {
|
|
return false;
|
|
}
|
|
}
|
|
lastWildcardNamespace = namespaceIndex;
|
|
namespaceIndex++;
|
|
patternIndex++;
|
|
continue;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
const namespaceDone = namespaceIndex === namespace.length;
|
|
const patternDone = patternIndex === pattern.length;
|
|
// this is to detect the case of an unneeded final wildcard
|
|
// e.g. the pattern `ab*` should match the string `ab`
|
|
const trailingWildCard = patternIndex === pattern.length - 1 && pattern[patternIndex] === "*";
|
|
return namespaceDone && (patternDone || trailingWildCard);
|
|
}
|
|
function disable() {
|
|
const result = enabledString || "";
|
|
enable("");
|
|
return result;
|
|
}
|
|
function createDebugger(namespace) {
|
|
const newDebugger = Object.assign(debug, {
|
|
enabled: enabled(namespace),
|
|
destroy,
|
|
log: debugObj.log,
|
|
namespace,
|
|
extend,
|
|
});
|
|
function debug(...args) {
|
|
if (!newDebugger.enabled) {
|
|
return;
|
|
}
|
|
if (args.length > 0) {
|
|
args[0] = `${namespace} ${args[0]}`;
|
|
}
|
|
newDebugger.log(...args);
|
|
}
|
|
debuggers.push(newDebugger);
|
|
return newDebugger;
|
|
}
|
|
function destroy() {
|
|
const index = debuggers.indexOf(this);
|
|
if (index >= 0) {
|
|
debuggers.splice(index, 1);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function extend(namespace) {
|
|
const newDebugger = createDebugger(`${this.namespace}:${namespace}`);
|
|
newDebugger.log = this.log;
|
|
return newDebugger;
|
|
}
|
|
/* harmony default export */ const debug = (debugObj);
|
|
//# sourceMappingURL=debug.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/logger/logger.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
const TYPESPEC_RUNTIME_LOG_LEVELS = ["verbose", "info", "warning", "error"];
|
|
const levelMap = {
|
|
verbose: 400,
|
|
info: 300,
|
|
warning: 200,
|
|
error: 100,
|
|
};
|
|
function patchLogMethod(parent, child) {
|
|
child.log = (...args) => {
|
|
parent.log(...args);
|
|
};
|
|
}
|
|
function isTypeSpecRuntimeLogLevel(level) {
|
|
return TYPESPEC_RUNTIME_LOG_LEVELS.includes(level);
|
|
}
|
|
/**
|
|
* Creates a logger context base on the provided options.
|
|
* @param options - The options for creating a logger context.
|
|
* @returns The logger context.
|
|
*/
|
|
function createLoggerContext(options) {
|
|
const registeredLoggers = new Set();
|
|
const logLevelFromEnv = getEnvironmentVariable(options.logLevelEnvVarName);
|
|
let logLevel;
|
|
const clientLogger = debug(options.namespace);
|
|
clientLogger.log = (...args) => {
|
|
debug.log(...args);
|
|
};
|
|
function contextSetLogLevel(level) {
|
|
if (level && !isTypeSpecRuntimeLogLevel(level)) {
|
|
throw new Error(`Unknown log level '${level}'. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(",")}`);
|
|
}
|
|
logLevel = level;
|
|
const enabledNamespaces = [];
|
|
for (const logger of registeredLoggers) {
|
|
if (shouldEnable(logger)) {
|
|
enabledNamespaces.push(logger.namespace);
|
|
}
|
|
}
|
|
debug.enable(enabledNamespaces.join(","));
|
|
}
|
|
if (logLevelFromEnv) {
|
|
// avoid calling setLogLevel because we don't want a mis-set environment variable to crash
|
|
if (isTypeSpecRuntimeLogLevel(logLevelFromEnv)) {
|
|
contextSetLogLevel(logLevelFromEnv);
|
|
}
|
|
else {
|
|
console.error(`${options.logLevelEnvVarName} set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(", ")}.`);
|
|
}
|
|
}
|
|
function shouldEnable(logger) {
|
|
return Boolean(logLevel && levelMap[logger.level] <= levelMap[logLevel]);
|
|
}
|
|
function createLogger(parent, level) {
|
|
const logger = Object.assign(parent.extend(level), {
|
|
level,
|
|
});
|
|
patchLogMethod(parent, logger);
|
|
if (shouldEnable(logger)) {
|
|
const enabledNamespaces = debug.disable();
|
|
debug.enable(enabledNamespaces + "," + logger.namespace);
|
|
}
|
|
registeredLoggers.add(logger);
|
|
return logger;
|
|
}
|
|
function contextGetLogLevel() {
|
|
return logLevel;
|
|
}
|
|
function contextCreateClientLogger(namespace) {
|
|
const clientRootLogger = clientLogger.extend(namespace);
|
|
patchLogMethod(clientLogger, clientRootLogger);
|
|
return {
|
|
error: createLogger(clientRootLogger, "error"),
|
|
warning: createLogger(clientRootLogger, "warning"),
|
|
info: createLogger(clientRootLogger, "info"),
|
|
verbose: createLogger(clientRootLogger, "verbose"),
|
|
};
|
|
}
|
|
return {
|
|
setLogLevel: contextSetLogLevel,
|
|
getLogLevel: contextGetLogLevel,
|
|
createClientLogger: contextCreateClientLogger,
|
|
logger: clientLogger,
|
|
};
|
|
}
|
|
const context = createLoggerContext({
|
|
logLevelEnvVarName: "TYPESPEC_RUNTIME_LOG_LEVEL",
|
|
namespace: "typeSpecRuntime",
|
|
});
|
|
/**
|
|
* Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
|
|
* @param level - The log level to enable for logging.
|
|
* Options from most verbose to least verbose are:
|
|
* - verbose
|
|
* - info
|
|
* - warning
|
|
* - error
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
const TypeSpecRuntimeLogger = context.logger;
|
|
/**
|
|
* Retrieves the currently specified log level.
|
|
*/
|
|
function setLogLevel(logLevel) {
|
|
context.setLogLevel(logLevel);
|
|
}
|
|
/**
|
|
* Retrieves the currently specified log level.
|
|
*/
|
|
function getLogLevel() {
|
|
return context.getLogLevel();
|
|
}
|
|
/**
|
|
* Creates a logger for use by the SDKs that inherits from `TypeSpecRuntimeLogger`.
|
|
* @param namespace - The name of the SDK package.
|
|
* @hidden
|
|
*/
|
|
function createClientLogger(namespace) {
|
|
return context.createClientLogger(namespace);
|
|
}
|
|
//# sourceMappingURL=logger.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/httpHeaders.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
function normalizeName(name) {
|
|
return name.toLowerCase();
|
|
}
|
|
/**
|
|
* Removes CR and LF characters from a header value to prevent obs-fold
|
|
* (line folding) sequences, as forbidden by RFC 7230 §3.2.4.
|
|
* @param value - The header value to sanitize.
|
|
*/
|
|
function normalizeValue(value) {
|
|
return String(value)
|
|
.trim()
|
|
.replace(/[\r\n]/g, "");
|
|
}
|
|
function* headerIterator(map) {
|
|
for (const entry of map.values()) {
|
|
yield [entry.name, entry.value];
|
|
}
|
|
}
|
|
class HttpHeadersImpl {
|
|
_headersMap;
|
|
constructor(rawHeaders) {
|
|
this._headersMap = new Map();
|
|
if (rawHeaders) {
|
|
for (const headerName of Object.keys(rawHeaders)) {
|
|
this.set(headerName, rawHeaders[headerName]);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Set a header in this collection with the provided name and value. The name is
|
|
* case-insensitive.
|
|
* @param name - The name of the header to set. This value is case-insensitive.
|
|
* @param value - The value of the header to set.
|
|
*/
|
|
set(name, value) {
|
|
this._headersMap.set(normalizeName(name), { name, value: normalizeValue(value) });
|
|
}
|
|
/**
|
|
* Get the header value for the provided header name, or undefined if no header exists in this
|
|
* collection with the provided name.
|
|
* @param name - The name of the header. This value is case-insensitive.
|
|
*/
|
|
get(name) {
|
|
return this._headersMap.get(normalizeName(name))?.value;
|
|
}
|
|
/**
|
|
* Get whether or not this header collection contains a header entry for the provided header name.
|
|
* @param name - The name of the header to set. This value is case-insensitive.
|
|
*/
|
|
has(name) {
|
|
return this._headersMap.has(normalizeName(name));
|
|
}
|
|
/**
|
|
* Remove the header with the provided headerName.
|
|
* @param name - The name of the header to remove.
|
|
*/
|
|
delete(name) {
|
|
this._headersMap.delete(normalizeName(name));
|
|
}
|
|
/**
|
|
* Get the JSON object representation of this HTTP header collection.
|
|
*/
|
|
toJSON(options = {}) {
|
|
const result = {};
|
|
if (options.preserveCase) {
|
|
for (const entry of this._headersMap.values()) {
|
|
result[entry.name] = entry.value;
|
|
}
|
|
}
|
|
else {
|
|
for (const [normalizedName, entry] of this._headersMap) {
|
|
result[normalizedName] = entry.value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Get the string representation of this HTTP header collection.
|
|
*/
|
|
toString() {
|
|
return JSON.stringify(this.toJSON({ preserveCase: true }));
|
|
}
|
|
/**
|
|
* Iterate over tuples of header [name, value] pairs.
|
|
*/
|
|
[Symbol.iterator]() {
|
|
return headerIterator(this._headersMap);
|
|
}
|
|
}
|
|
/**
|
|
* Creates an object that satisfies the `HttpHeaders` interface.
|
|
* @param rawHeaders - A simple object representing initial headers
|
|
*/
|
|
function httpHeaders_createHttpHeaders(rawHeaders) {
|
|
return new HttpHeadersImpl(rawHeaders);
|
|
}
|
|
//# sourceMappingURL=httpHeaders.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/uuidUtils.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Generated Universally Unique Identifier
|
|
*
|
|
* @returns RFC4122 v4 UUID.
|
|
*/
|
|
function randomUUID() {
|
|
return globalThis.crypto.randomUUID();
|
|
}
|
|
//# sourceMappingURL=uuidUtils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/pipelineRequest.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
class PipelineRequestImpl {
|
|
url;
|
|
method;
|
|
headers;
|
|
timeout;
|
|
withCredentials;
|
|
body;
|
|
multipartBody;
|
|
formData;
|
|
streamResponseStatusCodes;
|
|
enableBrowserStreams;
|
|
proxySettings;
|
|
disableKeepAlive;
|
|
abortSignal;
|
|
requestId;
|
|
allowInsecureConnection;
|
|
onUploadProgress;
|
|
onDownloadProgress;
|
|
requestOverrides;
|
|
authSchemes;
|
|
constructor(options) {
|
|
this.url = options.url;
|
|
this.body = options.body;
|
|
this.headers = options.headers ?? httpHeaders_createHttpHeaders();
|
|
this.method = options.method ?? "GET";
|
|
this.timeout = options.timeout ?? 0;
|
|
this.multipartBody = options.multipartBody;
|
|
this.formData = options.formData;
|
|
this.disableKeepAlive = options.disableKeepAlive ?? false;
|
|
this.proxySettings = options.proxySettings;
|
|
this.streamResponseStatusCodes = options.streamResponseStatusCodes;
|
|
this.withCredentials = options.withCredentials ?? false;
|
|
this.abortSignal = options.abortSignal;
|
|
this.onUploadProgress = options.onUploadProgress;
|
|
this.onDownloadProgress = options.onDownloadProgress;
|
|
this.requestId = options.requestId || randomUUID();
|
|
this.allowInsecureConnection = options.allowInsecureConnection ?? false;
|
|
this.enableBrowserStreams = options.enableBrowserStreams ?? false;
|
|
this.requestOverrides = options.requestOverrides;
|
|
this.authSchemes = options.authSchemes;
|
|
}
|
|
}
|
|
/**
|
|
* Creates a new pipeline request with the given options.
|
|
* This method is to allow for the easy setting of default values and not required.
|
|
* @param options - The options to create the request with.
|
|
*/
|
|
function pipelineRequest_createPipelineRequest(options) {
|
|
return new PipelineRequestImpl(options);
|
|
}
|
|
//# sourceMappingURL=pipelineRequest.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/pipeline.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]);
|
|
/**
|
|
* A private implementation of Pipeline.
|
|
* Do not export this class from the package.
|
|
* @internal
|
|
*/
|
|
class HttpPipeline {
|
|
_policies = [];
|
|
_orderedPolicies;
|
|
constructor(policies) {
|
|
this._policies = policies?.slice(0) ?? [];
|
|
this._orderedPolicies = undefined;
|
|
}
|
|
addPolicy(policy, options = {}) {
|
|
if (options.phase && options.afterPhase) {
|
|
throw new Error("Policies inside a phase cannot specify afterPhase.");
|
|
}
|
|
if (options.phase && !ValidPhaseNames.has(options.phase)) {
|
|
throw new Error(`Invalid phase name: ${options.phase}`);
|
|
}
|
|
if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) {
|
|
throw new Error(`Invalid afterPhase name: ${options.afterPhase}`);
|
|
}
|
|
this._policies.push({
|
|
policy,
|
|
options,
|
|
});
|
|
this._orderedPolicies = undefined;
|
|
}
|
|
removePolicy(options) {
|
|
const removedPolicies = [];
|
|
this._policies = this._policies.filter((policyDescriptor) => {
|
|
if ((options.name && policyDescriptor.policy.name === options.name) ||
|
|
(options.phase && policyDescriptor.options.phase === options.phase)) {
|
|
removedPolicies.push(policyDescriptor.policy);
|
|
return false;
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
});
|
|
this._orderedPolicies = undefined;
|
|
return removedPolicies;
|
|
}
|
|
sendRequest(httpClient, request) {
|
|
const policies = this.getOrderedPolicies();
|
|
const pipeline = policies.reduceRight((next, policy) => {
|
|
return (req) => {
|
|
return policy.sendRequest(req, next);
|
|
};
|
|
}, (req) => httpClient.sendRequest(req));
|
|
return pipeline(request);
|
|
}
|
|
getOrderedPolicies() {
|
|
if (!this._orderedPolicies) {
|
|
this._orderedPolicies = this.orderPolicies();
|
|
}
|
|
return this._orderedPolicies;
|
|
}
|
|
clone() {
|
|
return new HttpPipeline(this._policies);
|
|
}
|
|
static create() {
|
|
return new HttpPipeline();
|
|
}
|
|
orderPolicies() {
|
|
/**
|
|
* The goal of this method is to reliably order pipeline policies
|
|
* based on their declared requirements when they were added.
|
|
*
|
|
* Order is first determined by phase:
|
|
*
|
|
* 1. Serialize Phase
|
|
* 2. Policies not in a phase
|
|
* 3. Deserialize Phase
|
|
* 4. Retry Phase
|
|
* 5. Sign Phase
|
|
*
|
|
* Within each phase, policies are executed in the order
|
|
* they were added unless they were specified to execute
|
|
* before/after other policies or after a particular phase.
|
|
*
|
|
* To determine the final order, we will walk the policy list
|
|
* in phase order multiple times until all dependencies are
|
|
* satisfied.
|
|
*
|
|
* `afterPolicies` are the set of policies that must be
|
|
* executed before a given policy. This requirement is
|
|
* considered satisfied when each of the listed policies
|
|
* have been scheduled.
|
|
*
|
|
* `beforePolicies` are the set of policies that must be
|
|
* executed after a given policy. Since this dependency
|
|
* can be expressed by converting it into a equivalent
|
|
* `afterPolicies` declarations, they are normalized
|
|
* into that form for simplicity.
|
|
*
|
|
* An `afterPhase` dependency is considered satisfied when all
|
|
* policies in that phase have scheduled.
|
|
*
|
|
*/
|
|
const result = [];
|
|
// Track all policies we know about.
|
|
const policyMap = new Map();
|
|
function createPhase(name) {
|
|
return {
|
|
name,
|
|
policies: new Set(),
|
|
hasRun: false,
|
|
hasAfterPolicies: false,
|
|
};
|
|
}
|
|
// Track policies for each phase.
|
|
const serializePhase = createPhase("Serialize");
|
|
const noPhase = createPhase("None");
|
|
const deserializePhase = createPhase("Deserialize");
|
|
const retryPhase = createPhase("Retry");
|
|
const signPhase = createPhase("Sign");
|
|
// a list of phases in order
|
|
const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase];
|
|
// Small helper function to map phase name to each Phase
|
|
function getPhase(phase) {
|
|
if (phase === "Retry") {
|
|
return retryPhase;
|
|
}
|
|
else if (phase === "Serialize") {
|
|
return serializePhase;
|
|
}
|
|
else if (phase === "Deserialize") {
|
|
return deserializePhase;
|
|
}
|
|
else if (phase === "Sign") {
|
|
return signPhase;
|
|
}
|
|
else {
|
|
return noPhase;
|
|
}
|
|
}
|
|
// First walk each policy and create a node to track metadata.
|
|
for (const descriptor of this._policies) {
|
|
const policy = descriptor.policy;
|
|
const options = descriptor.options;
|
|
const policyName = policy.name;
|
|
if (policyMap.has(policyName)) {
|
|
throw new Error("Duplicate policy names not allowed in pipeline");
|
|
}
|
|
const node = {
|
|
policy,
|
|
dependsOn: new Set(),
|
|
dependants: new Set(),
|
|
};
|
|
if (options.afterPhase) {
|
|
node.afterPhase = getPhase(options.afterPhase);
|
|
node.afterPhase.hasAfterPolicies = true;
|
|
}
|
|
policyMap.set(policyName, node);
|
|
const phase = getPhase(options.phase);
|
|
phase.policies.add(node);
|
|
}
|
|
// Now that each policy has a node, connect dependency references.
|
|
for (const descriptor of this._policies) {
|
|
const { policy, options } = descriptor;
|
|
const policyName = policy.name;
|
|
const node = policyMap.get(policyName);
|
|
if (!node) {
|
|
throw new Error(`Missing node for policy ${policyName}`);
|
|
}
|
|
if (options.afterPolicies) {
|
|
for (const afterPolicyName of options.afterPolicies) {
|
|
const afterNode = policyMap.get(afterPolicyName);
|
|
if (afterNode) {
|
|
// Linking in both directions helps later
|
|
// when we want to notify dependants.
|
|
node.dependsOn.add(afterNode);
|
|
afterNode.dependants.add(node);
|
|
}
|
|
}
|
|
}
|
|
if (options.beforePolicies) {
|
|
for (const beforePolicyName of options.beforePolicies) {
|
|
const beforeNode = policyMap.get(beforePolicyName);
|
|
if (beforeNode) {
|
|
// To execute before another node, make it
|
|
// depend on the current node.
|
|
beforeNode.dependsOn.add(node);
|
|
node.dependants.add(beforeNode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function walkPhase(phase) {
|
|
phase.hasRun = true;
|
|
// Sets iterate in insertion order
|
|
for (const node of phase.policies) {
|
|
if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) {
|
|
// If this node is waiting on a phase to complete,
|
|
// we need to skip it for now.
|
|
// Even if the phase is empty, we should wait for it
|
|
// to be walked to avoid re-ordering policies.
|
|
continue;
|
|
}
|
|
if (node.dependsOn.size === 0) {
|
|
// If there's nothing else we're waiting for, we can
|
|
// add this policy to the result list.
|
|
result.push(node.policy);
|
|
// Notify anything that depends on this policy that
|
|
// the policy has been scheduled.
|
|
for (const dependant of node.dependants) {
|
|
dependant.dependsOn.delete(node);
|
|
}
|
|
policyMap.delete(node.policy.name);
|
|
phase.policies.delete(node);
|
|
}
|
|
}
|
|
}
|
|
function walkPhases() {
|
|
for (const phase of orderedPhases) {
|
|
walkPhase(phase);
|
|
// if the phase isn't complete
|
|
if (phase.policies.size > 0 && phase !== noPhase) {
|
|
if (!noPhase.hasRun) {
|
|
// Try running noPhase to see if that unblocks this phase next tick.
|
|
// This can happen if a phase that happens before noPhase
|
|
// is waiting on a noPhase policy to complete.
|
|
walkPhase(noPhase);
|
|
}
|
|
// Don't proceed to the next phase until this phase finishes.
|
|
return;
|
|
}
|
|
if (phase.hasAfterPolicies) {
|
|
// Run any policies unblocked by this phase
|
|
walkPhase(noPhase);
|
|
}
|
|
}
|
|
}
|
|
// Iterate until we've put every node in the result list.
|
|
let iteration = 0;
|
|
while (policyMap.size > 0) {
|
|
iteration++;
|
|
const initialResultLength = result.length;
|
|
// Keep walking each phase in order until we can order every node.
|
|
walkPhases();
|
|
// The result list *should* get at least one larger each time
|
|
// after the first full pass.
|
|
// Otherwise, we're going to loop forever.
|
|
if (result.length <= initialResultLength && iteration > 1) {
|
|
throw new Error("Cannot satisfy policy dependencies due to requirements cycle.");
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
/**
|
|
* Creates a totally empty pipeline.
|
|
* Useful for testing or creating a custom one.
|
|
*/
|
|
function pipeline_createEmptyPipeline() {
|
|
return HttpPipeline.create();
|
|
}
|
|
//# sourceMappingURL=pipeline.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/object.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Helper to determine when an input is a generic JS object.
|
|
* @returns true when input is an object type that is not null, Array, RegExp, or Date.
|
|
*/
|
|
function isObject(input) {
|
|
return (typeof input === "object" &&
|
|
input !== null &&
|
|
!Array.isArray(input) &&
|
|
!(input instanceof RegExp) &&
|
|
!(input instanceof Date));
|
|
}
|
|
//# sourceMappingURL=object.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/error.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Typeguard for an error object shape (has name and message)
|
|
* @param e - Something caught by a catch clause.
|
|
*/
|
|
function isError(e) {
|
|
if (isObject(e)) {
|
|
const hasName = typeof e.name === "string";
|
|
const hasMessage = typeof e.message === "string";
|
|
return hasName && hasMessage;
|
|
}
|
|
return false;
|
|
}
|
|
//# sourceMappingURL=error.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/inspect.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const custom = external_node_util_.inspect.custom;
|
|
//# sourceMappingURL=inspect.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/sanitizer.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const RedactedString = "REDACTED";
|
|
// Make sure this list is up-to-date with the one under core/logger/Readme#Keyconcepts
|
|
const defaultAllowedHeaderNames = [
|
|
"x-ms-client-request-id",
|
|
"x-ms-return-client-request-id",
|
|
"x-ms-useragent",
|
|
"x-ms-correlation-request-id",
|
|
"x-ms-request-id",
|
|
"client-request-id",
|
|
"ms-cv",
|
|
"return-client-request-id",
|
|
"traceparent",
|
|
"Access-Control-Allow-Credentials",
|
|
"Access-Control-Allow-Headers",
|
|
"Access-Control-Allow-Methods",
|
|
"Access-Control-Allow-Origin",
|
|
"Access-Control-Expose-Headers",
|
|
"Access-Control-Max-Age",
|
|
"Access-Control-Request-Headers",
|
|
"Access-Control-Request-Method",
|
|
"Origin",
|
|
"Accept",
|
|
"Accept-Encoding",
|
|
"Cache-Control",
|
|
"Connection",
|
|
"Content-Length",
|
|
"Content-Type",
|
|
"Date",
|
|
"ETag",
|
|
"Expires",
|
|
"If-Match",
|
|
"If-Modified-Since",
|
|
"If-None-Match",
|
|
"If-Unmodified-Since",
|
|
"Last-Modified",
|
|
"Pragma",
|
|
"Request-Id",
|
|
"Retry-After",
|
|
"Server",
|
|
"Transfer-Encoding",
|
|
"User-Agent",
|
|
"WWW-Authenticate",
|
|
];
|
|
const defaultAllowedQueryParameters = ["api-version"];
|
|
/**
|
|
* A utility class to sanitize objects for logging.
|
|
*/
|
|
class Sanitizer {
|
|
allowedHeaderNames;
|
|
allowedQueryParameters;
|
|
constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [], } = {}) {
|
|
allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames);
|
|
allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters);
|
|
this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
|
|
this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
|
|
}
|
|
/**
|
|
* Sanitizes an object for logging.
|
|
* @param obj - The object to sanitize
|
|
* @returns - The sanitized object as a string
|
|
*/
|
|
sanitize(obj) {
|
|
const seen = new Set();
|
|
return JSON.stringify(obj, (key, value) => {
|
|
// Ensure Errors include their interesting non-enumerable members
|
|
if (value instanceof Error) {
|
|
return {
|
|
...value,
|
|
name: value.name,
|
|
message: value.message,
|
|
};
|
|
}
|
|
if (key === "headers" && isObject(value)) {
|
|
return this.sanitizeHeaders(value);
|
|
}
|
|
else if (key === "url" && typeof value === "string") {
|
|
return this.sanitizeUrl(value);
|
|
}
|
|
else if (key === "query" && isObject(value)) {
|
|
return this.sanitizeQuery(value);
|
|
}
|
|
else if (key === "body") {
|
|
// Don't log the request body
|
|
return undefined;
|
|
}
|
|
else if (key === "response") {
|
|
// Don't log response again
|
|
return undefined;
|
|
}
|
|
else if (key === "operationSpec") {
|
|
// When using sendOperationRequest, the request carries a massive
|
|
// field with the autorest spec. No need to log it.
|
|
return undefined;
|
|
}
|
|
else if (Array.isArray(value) || isObject(value)) {
|
|
if (seen.has(value)) {
|
|
return "[Circular]";
|
|
}
|
|
seen.add(value);
|
|
}
|
|
return value;
|
|
}, 2);
|
|
}
|
|
/**
|
|
* Sanitizes a URL for logging.
|
|
* @param value - The URL to sanitize
|
|
* @returns - The sanitized URL as a string
|
|
*/
|
|
sanitizeUrl(value) {
|
|
if (typeof value !== "string" || value === null || value === "") {
|
|
return value;
|
|
}
|
|
const url = new URL(value);
|
|
if (!url.search) {
|
|
return value;
|
|
}
|
|
for (const [key] of url.searchParams) {
|
|
if (!this.allowedQueryParameters.has(key.toLowerCase())) {
|
|
url.searchParams.set(key, RedactedString);
|
|
}
|
|
}
|
|
return url.toString();
|
|
}
|
|
sanitizeHeaders(obj) {
|
|
const sanitized = {};
|
|
for (const key of Object.keys(obj)) {
|
|
if (this.allowedHeaderNames.has(key.toLowerCase())) {
|
|
sanitized[key] = obj[key];
|
|
}
|
|
else {
|
|
sanitized[key] = RedactedString;
|
|
}
|
|
}
|
|
return sanitized;
|
|
}
|
|
sanitizeQuery(value) {
|
|
if (typeof value !== "object" || value === null) {
|
|
return value;
|
|
}
|
|
const sanitized = {};
|
|
for (const k of Object.keys(value)) {
|
|
if (this.allowedQueryParameters.has(k.toLowerCase())) {
|
|
sanitized[k] = value[k];
|
|
}
|
|
else {
|
|
sanitized[k] = RedactedString;
|
|
}
|
|
}
|
|
return sanitized;
|
|
}
|
|
}
|
|
//# sourceMappingURL=sanitizer.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/restError.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
const errorSanitizer = new Sanitizer();
|
|
/**
|
|
* A custom error type for failed pipeline requests.
|
|
*/
|
|
class restError_RestError extends Error {
|
|
/**
|
|
* Something went wrong when making the request.
|
|
* This means the actual request failed for some reason,
|
|
* such as a DNS issue or the connection being lost.
|
|
*/
|
|
static REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
|
|
/**
|
|
* This means that parsing the response from the server failed.
|
|
* It may have been malformed.
|
|
*/
|
|
static PARSE_ERROR = "PARSE_ERROR";
|
|
/**
|
|
* The code of the error itself (use statics on RestError if possible.)
|
|
*/
|
|
code;
|
|
/**
|
|
* The HTTP status code of the request (if applicable.)
|
|
*/
|
|
statusCode;
|
|
/**
|
|
* The request that was made.
|
|
* This property is non-enumerable.
|
|
*/
|
|
request;
|
|
/**
|
|
* The response received (if any.)
|
|
* This property is non-enumerable.
|
|
*/
|
|
response;
|
|
/**
|
|
* Bonus property set by the throw site.
|
|
*/
|
|
details;
|
|
constructor(message, options = {}) {
|
|
super(message);
|
|
this.name = "RestError";
|
|
this.code = options.code;
|
|
this.statusCode = options.statusCode;
|
|
// The request and response may contain sensitive information in the headers or body.
|
|
// To help prevent this sensitive information being accidentally logged, the request and response
|
|
// properties are marked as non-enumerable here. This prevents them showing up in the output of
|
|
// JSON.stringify and console.log.
|
|
Object.defineProperty(this, "request", { value: options.request, enumerable: false });
|
|
Object.defineProperty(this, "response", { value: options.response, enumerable: false });
|
|
// Only include useful agent information in the request for logging, as the full agent object
|
|
// may contain large binary data.
|
|
const agent = this.request?.agent
|
|
? {
|
|
maxFreeSockets: this.request.agent.maxFreeSockets,
|
|
maxSockets: this.request.agent.maxSockets,
|
|
}
|
|
: undefined;
|
|
// Logging method for util.inspect in Node
|
|
Object.defineProperty(this, custom, {
|
|
value: () => {
|
|
// Extract non-enumerable properties and add them back. This is OK since in this output the request and
|
|
// response get sanitized.
|
|
return `RestError: ${this.message} \n ${errorSanitizer.sanitize({
|
|
...this,
|
|
request: { ...this.request, agent },
|
|
response: this.response,
|
|
})}`;
|
|
},
|
|
enumerable: false,
|
|
});
|
|
Object.setPrototypeOf(this, restError_RestError.prototype);
|
|
}
|
|
}
|
|
/**
|
|
* Typeguard for RestError
|
|
* @param e - Something caught by a catch clause.
|
|
*/
|
|
function restError_isRestError(e) {
|
|
if (e instanceof restError_RestError) {
|
|
return true;
|
|
}
|
|
return isError(e) && e.name === "RestError";
|
|
}
|
|
//# sourceMappingURL=restError.js.map
|
|
// EXTERNAL MODULE: external "node:http"
|
|
var external_node_http_ = __webpack_require__(7067);
|
|
// EXTERNAL MODULE: external "node:https"
|
|
var external_node_https_ = __webpack_require__(4708);
|
|
// EXTERNAL MODULE: external "node:zlib"
|
|
var external_node_zlib_ = __webpack_require__(8522);
|
|
// EXTERNAL MODULE: external "node:stream"
|
|
var external_node_stream_ = __webpack_require__(7075);
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const log_logger = createClientLogger("ts-http-runtime");
|
|
//# sourceMappingURL=log.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/nodeHttpClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const DEFAULT_TLS_SETTINGS = {};
|
|
function nodeHttpClient_isReadableStream(body) {
|
|
return body && typeof body.pipe === "function";
|
|
}
|
|
function isStreamComplete(stream) {
|
|
if (stream.readable === false) {
|
|
return Promise.resolve();
|
|
}
|
|
return new Promise((resolve) => {
|
|
const handler = () => {
|
|
resolve();
|
|
stream.removeListener("close", handler);
|
|
stream.removeListener("end", handler);
|
|
stream.removeListener("error", handler);
|
|
};
|
|
stream.on("close", handler);
|
|
stream.on("end", handler);
|
|
stream.on("error", handler);
|
|
});
|
|
}
|
|
function isArrayBuffer(body) {
|
|
return body && typeof body.byteLength === "number";
|
|
}
|
|
class ReportTransform extends external_node_stream_.Transform {
|
|
loadedBytes = 0;
|
|
progressCallback;
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
_transform(chunk, _encoding, callback) {
|
|
this.push(chunk);
|
|
this.loadedBytes += chunk.length;
|
|
try {
|
|
this.progressCallback({ loadedBytes: this.loadedBytes });
|
|
callback();
|
|
}
|
|
catch (e) {
|
|
callback(e);
|
|
}
|
|
}
|
|
constructor(progressCallback) {
|
|
super();
|
|
this.progressCallback = progressCallback;
|
|
}
|
|
}
|
|
/**
|
|
* A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
|
|
* @internal
|
|
*/
|
|
class NodeHttpClient {
|
|
cachedHttpAgent;
|
|
cachedHttpsAgents = new WeakMap();
|
|
/**
|
|
* Makes a request over an underlying transport layer and returns the response.
|
|
* @param request - The request to be made.
|
|
*/
|
|
async sendRequest(request) {
|
|
const abortController = new AbortController();
|
|
let abortListener;
|
|
if (request.abortSignal) {
|
|
if (request.abortSignal.aborted) {
|
|
throw new AbortError("The operation was aborted. Request has already been canceled.");
|
|
}
|
|
abortListener = (event) => {
|
|
if (event.type === "abort") {
|
|
abortController.abort();
|
|
}
|
|
};
|
|
request.abortSignal.addEventListener("abort", abortListener);
|
|
}
|
|
let timeoutId;
|
|
if (request.timeout > 0) {
|
|
timeoutId = setTimeout(() => {
|
|
const sanitizer = new Sanitizer();
|
|
log_logger.info(`request to '${sanitizer.sanitizeUrl(request.url)}' timed out. canceling...`);
|
|
abortController.abort();
|
|
}, request.timeout);
|
|
}
|
|
const acceptEncoding = request.headers.get("Accept-Encoding");
|
|
const shouldDecompress = acceptEncoding?.includes("gzip") || acceptEncoding?.includes("deflate");
|
|
let body = typeof request.body === "function" ? request.body() : request.body;
|
|
if (body && !request.headers.has("Content-Length")) {
|
|
const bodyLength = getBodyLength(body);
|
|
if (bodyLength !== null) {
|
|
request.headers.set("Content-Length", bodyLength);
|
|
}
|
|
}
|
|
let responseStream;
|
|
try {
|
|
if (body && request.onUploadProgress) {
|
|
const onUploadProgress = request.onUploadProgress;
|
|
const uploadReportStream = new ReportTransform(onUploadProgress);
|
|
uploadReportStream.on("error", (e) => {
|
|
log_logger.error("Error in upload progress", e);
|
|
});
|
|
if (nodeHttpClient_isReadableStream(body)) {
|
|
body.pipe(uploadReportStream);
|
|
}
|
|
else {
|
|
uploadReportStream.end(body);
|
|
}
|
|
body = uploadReportStream;
|
|
}
|
|
const res = await this.makeRequest(request, abortController, body);
|
|
if (timeoutId !== undefined) {
|
|
clearTimeout(timeoutId);
|
|
}
|
|
const headers = getResponseHeaders(res);
|
|
const status = res.statusCode ?? 0;
|
|
const response = {
|
|
status,
|
|
headers,
|
|
request,
|
|
};
|
|
// Responses to HEAD must not have a body.
|
|
// If they do return a body, that body must be ignored.
|
|
if (request.method === "HEAD") {
|
|
// call resume() and not destroy() to avoid closing the socket
|
|
// and losing keep alive
|
|
res.resume();
|
|
return response;
|
|
}
|
|
responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
|
|
const onDownloadProgress = request.onDownloadProgress;
|
|
if (onDownloadProgress) {
|
|
const downloadReportStream = new ReportTransform(onDownloadProgress);
|
|
downloadReportStream.on("error", (e) => {
|
|
log_logger.error("Error in download progress", e);
|
|
});
|
|
responseStream.pipe(downloadReportStream);
|
|
responseStream = downloadReportStream;
|
|
}
|
|
if (
|
|
// Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
|
|
request.streamResponseStatusCodes?.has(Number.POSITIVE_INFINITY) ||
|
|
request.streamResponseStatusCodes?.has(response.status)) {
|
|
response.readableStreamBody = responseStream;
|
|
}
|
|
else {
|
|
response.bodyAsText = await streamToText(responseStream);
|
|
}
|
|
return response;
|
|
}
|
|
finally {
|
|
// clean up event listener
|
|
if (request.abortSignal && abortListener) {
|
|
let uploadStreamDone = Promise.resolve();
|
|
if (nodeHttpClient_isReadableStream(body)) {
|
|
uploadStreamDone = isStreamComplete(body);
|
|
}
|
|
let downloadStreamDone = Promise.resolve();
|
|
if (nodeHttpClient_isReadableStream(responseStream)) {
|
|
downloadStreamDone = isStreamComplete(responseStream);
|
|
}
|
|
Promise.all([uploadStreamDone, downloadStreamDone])
|
|
.then(() => {
|
|
// eslint-disable-next-line promise/always-return
|
|
if (abortListener) {
|
|
request.abortSignal?.removeEventListener("abort", abortListener);
|
|
}
|
|
})
|
|
.catch((e) => {
|
|
log_logger.warning("Error when cleaning up abortListener on httpRequest", e);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
makeRequest(request, abortController, body) {
|
|
const url = new URL(request.url);
|
|
const isInsecure = url.protocol !== "https:";
|
|
if (isInsecure && !request.allowInsecureConnection) {
|
|
throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
|
|
}
|
|
const agent = request.agent ?? this.getOrCreateAgent(request, isInsecure);
|
|
const options = {
|
|
agent,
|
|
hostname: url.hostname,
|
|
path: `${url.pathname}${url.search}`,
|
|
port: url.port,
|
|
method: request.method,
|
|
headers: request.headers.toJSON({ preserveCase: true }),
|
|
...request.requestOverrides,
|
|
};
|
|
return new Promise((resolve, reject) => {
|
|
const req = isInsecure ? external_node_http_.request(options, resolve) : external_node_https_.request(options, resolve);
|
|
req.once("error", (err) => {
|
|
reject(new restError_RestError(err.message, { code: err.code ?? restError_RestError.REQUEST_SEND_ERROR, request }));
|
|
});
|
|
abortController.signal.addEventListener("abort", () => {
|
|
const abortError = new AbortError("The operation was aborted. Rejecting from abort signal callback while making request.");
|
|
req.destroy(abortError);
|
|
reject(abortError);
|
|
});
|
|
if (body && nodeHttpClient_isReadableStream(body)) {
|
|
body.pipe(req);
|
|
}
|
|
else if (body) {
|
|
if (typeof body === "string" || Buffer.isBuffer(body)) {
|
|
req.end(body);
|
|
}
|
|
else if (isArrayBuffer(body)) {
|
|
req.end(ArrayBuffer.isView(body)
|
|
? Buffer.from(body.buffer, body.byteOffset, body.byteLength)
|
|
: Buffer.from(body));
|
|
}
|
|
else {
|
|
log_logger.error("Unrecognized body type", body);
|
|
reject(new restError_RestError("Unrecognized body type"));
|
|
}
|
|
}
|
|
else {
|
|
// streams don't like "undefined" being passed as data
|
|
req.end();
|
|
}
|
|
});
|
|
}
|
|
getOrCreateAgent(request, isInsecure) {
|
|
const disableKeepAlive = request.disableKeepAlive;
|
|
// Handle Insecure requests first
|
|
if (isInsecure) {
|
|
if (disableKeepAlive) {
|
|
// keepAlive:false is the default so we don't need a custom Agent
|
|
return external_node_http_.globalAgent;
|
|
}
|
|
if (!this.cachedHttpAgent) {
|
|
// If there is no cached agent create a new one and cache it.
|
|
this.cachedHttpAgent = new external_node_http_.Agent({ keepAlive: true });
|
|
}
|
|
return this.cachedHttpAgent;
|
|
}
|
|
else {
|
|
if (disableKeepAlive && !request.tlsSettings) {
|
|
// When there are no tlsSettings and keepAlive is false
|
|
// we don't need a custom agent
|
|
return external_node_https_.globalAgent;
|
|
}
|
|
// We use the tlsSettings to index cached clients
|
|
const tlsSettings = request.tlsSettings ?? DEFAULT_TLS_SETTINGS;
|
|
// Get the cached agent or create a new one with the
|
|
// provided values for keepAlive and tlsSettings
|
|
let agent = this.cachedHttpsAgents.get(tlsSettings);
|
|
if (agent && agent.options.keepAlive === !disableKeepAlive) {
|
|
return agent;
|
|
}
|
|
log_logger.info("No cached TLS Agent exist, creating a new Agent");
|
|
agent = new external_node_https_.Agent({
|
|
// keepAlive is true if disableKeepAlive is false.
|
|
keepAlive: !disableKeepAlive,
|
|
// Since we are spreading, if no tslSettings were provided, nothing is added to the agent options.
|
|
...tlsSettings,
|
|
});
|
|
this.cachedHttpsAgents.set(tlsSettings, agent);
|
|
return agent;
|
|
}
|
|
}
|
|
}
|
|
function getResponseHeaders(res) {
|
|
const headers = httpHeaders_createHttpHeaders();
|
|
for (const header of Object.keys(res.headers)) {
|
|
const value = res.headers[header];
|
|
if (Array.isArray(value)) {
|
|
if (value.length > 0) {
|
|
headers.set(header, value[0]);
|
|
}
|
|
}
|
|
else if (value) {
|
|
headers.set(header, value);
|
|
}
|
|
}
|
|
return headers;
|
|
}
|
|
function getDecodedResponseStream(stream, headers) {
|
|
const contentEncoding = headers.get("Content-Encoding");
|
|
if (contentEncoding === "gzip") {
|
|
const unzip = external_node_zlib_.createGunzip();
|
|
stream.pipe(unzip);
|
|
return unzip;
|
|
}
|
|
else if (contentEncoding === "deflate") {
|
|
const inflate = external_node_zlib_.createInflate();
|
|
stream.pipe(inflate);
|
|
return inflate;
|
|
}
|
|
return stream;
|
|
}
|
|
function streamToText(stream) {
|
|
return new Promise((resolve, reject) => {
|
|
const buffer = [];
|
|
stream.on("data", (chunk) => {
|
|
if (Buffer.isBuffer(chunk)) {
|
|
buffer.push(chunk);
|
|
}
|
|
else {
|
|
buffer.push(Buffer.from(chunk));
|
|
}
|
|
});
|
|
stream.on("end", () => {
|
|
resolve(Buffer.concat(buffer).toString("utf8"));
|
|
});
|
|
stream.on("error", (e) => {
|
|
if (e && e?.name === "AbortError") {
|
|
reject(e);
|
|
}
|
|
else {
|
|
reject(new restError_RestError(`Error reading response as text: ${e.message}`, {
|
|
code: restError_RestError.PARSE_ERROR,
|
|
}));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
/** @internal */
|
|
function getBodyLength(body) {
|
|
if (!body) {
|
|
return 0;
|
|
}
|
|
else if (Buffer.isBuffer(body)) {
|
|
return body.length;
|
|
}
|
|
else if (nodeHttpClient_isReadableStream(body)) {
|
|
return null;
|
|
}
|
|
else if (isArrayBuffer(body)) {
|
|
return body.byteLength;
|
|
}
|
|
else if (typeof body === "string") {
|
|
return Buffer.from(body).length;
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
/**
|
|
* Create a new HttpClient instance for the NodeJS environment.
|
|
* @internal
|
|
*/
|
|
function createNodeHttpClient() {
|
|
return new NodeHttpClient();
|
|
}
|
|
//# sourceMappingURL=nodeHttpClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/defaultHttpClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Create the correct HttpClient for the current environment.
|
|
*/
|
|
function defaultHttpClient_createDefaultHttpClient() {
|
|
return createNodeHttpClient();
|
|
}
|
|
//# sourceMappingURL=defaultHttpClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/logPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the logPolicy.
|
|
*/
|
|
const logPolicyName = "logPolicy";
|
|
/**
|
|
* A policy that logs all requests and responses.
|
|
* @param options - Options to configure logPolicy.
|
|
*/
|
|
function logPolicy_logPolicy(options = {}) {
|
|
const logger = options.logger ?? log_logger.info;
|
|
const sanitizer = new Sanitizer({
|
|
additionalAllowedHeaderNames: options.additionalAllowedHeaderNames,
|
|
additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
|
|
});
|
|
return {
|
|
name: logPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!logger.enabled) {
|
|
return next(request);
|
|
}
|
|
logger(`Request: ${sanitizer.sanitize(request)}`);
|
|
const response = await next(request);
|
|
logger(`Response status code: ${response.status}`);
|
|
logger(`Headers: ${sanitizer.sanitize({ headers: response.headers })}`);
|
|
return response;
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=logPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/userAgentPlatform.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
function getHeaderName() {
|
|
return "User-Agent";
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
async function userAgentPlatform_setPlatformSpecificData(map) {
|
|
if (process && process.versions) {
|
|
const osInfo = `${os.type()} ${os.release()}; ${os.arch()}`;
|
|
if (process.versions.bun) {
|
|
map.set("Bun", `${process.versions.bun} (${osInfo})`);
|
|
}
|
|
else if (process.versions.deno) {
|
|
map.set("Deno", `${process.versions.deno} (${osInfo})`);
|
|
}
|
|
else if (process.versions.node) {
|
|
map.set("Node", `${process.versions.node} (${osInfo})`);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=userAgentPlatform.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/userAgent.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
function getUserAgentString(telemetryInfo) {
|
|
const parts = [];
|
|
for (const [key, value] of telemetryInfo) {
|
|
const token = value ? `${key}/${value}` : key;
|
|
parts.push(token);
|
|
}
|
|
return parts.join(" ");
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
function getUserAgentHeaderName() {
|
|
return getHeaderName();
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
async function userAgent_getUserAgentValue(prefix) {
|
|
const runtimeInfo = new Map();
|
|
runtimeInfo.set("ts-http-runtime", SDK_VERSION);
|
|
await setPlatformSpecificData(runtimeInfo);
|
|
const defaultAgent = getUserAgentString(runtimeInfo);
|
|
const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
|
|
return userAgentValue;
|
|
}
|
|
//# sourceMappingURL=userAgent.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/userAgentPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const UserAgentHeaderName = getUserAgentHeaderName();
|
|
/**
|
|
* The programmatic identifier of the userAgentPolicy.
|
|
*/
|
|
const userAgentPolicyName = "userAgentPolicy";
|
|
/**
|
|
* A policy that sets the User-Agent header (or equivalent) to reflect
|
|
* the library version.
|
|
* @param options - Options to customize the user agent value.
|
|
*/
|
|
function userAgentPolicy_userAgentPolicy(options = {}) {
|
|
const userAgentValue = getUserAgentValue(options.userAgentPrefix);
|
|
return {
|
|
name: userAgentPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.headers.has(UserAgentHeaderName)) {
|
|
request.headers.set(UserAgentHeaderName, await userAgentValue);
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=userAgentPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/random.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Returns a random integer value between a lower and upper bound,
|
|
* inclusive of both bounds.
|
|
* Note that this uses Math.random and isn't secure. If you need to use
|
|
* this for any kind of security purpose, find a better source of random.
|
|
* @param min - The smallest integer value allowed.
|
|
* @param max - The largest integer value allowed.
|
|
*/
|
|
function getRandomIntegerInclusive(min, max) {
|
|
// Make sure inputs are integers.
|
|
min = Math.ceil(min);
|
|
max = Math.floor(max);
|
|
// Pick a random offset from zero to the size of the range.
|
|
// Since Math.random() can never return 1, we have to make the range one larger
|
|
// in order to be inclusive of the maximum value after we take the floor.
|
|
const offset = Math.floor(Math.random() * (max - min + 1));
|
|
return offset + min;
|
|
}
|
|
//# sourceMappingURL=random.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/delay.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Calculates the delay interval for retry attempts using exponential delay with jitter.
|
|
* @param retryAttempt - The current retry attempt number.
|
|
* @param config - The exponential retry configuration.
|
|
* @returns An object containing the calculated retry delay.
|
|
*/
|
|
function calculateRetryDelay(retryAttempt, config) {
|
|
// Exponentially increase the delay each time
|
|
const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt);
|
|
// Don't let the delay exceed the maximum
|
|
const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay);
|
|
// Allow the final value to have some "jitter" (within 50% of the delay size) so
|
|
// that retries across multiple clients don't occur simultaneously.
|
|
const retryAfterInMs = clampedDelay / 2 + getRandomIntegerInclusive(0, clampedDelay / 2);
|
|
return { retryAfterInMs };
|
|
}
|
|
//# sourceMappingURL=delay.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/helpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const StandardAbortMessage = "The operation was aborted.";
|
|
/**
|
|
* A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
|
|
* @param delayInMs - The number of milliseconds to be delayed.
|
|
* @param value - The value to be resolved with after a timeout of t milliseconds.
|
|
* @param options - The options for delay - currently abort options
|
|
* - abortSignal - The abortSignal associated with containing operation.
|
|
* - abortErrorMsg - The abort error message associated with containing operation.
|
|
* @returns Resolved promise
|
|
*/
|
|
function helpers_delay(delayInMs, value, options) {
|
|
return new Promise((resolve, reject) => {
|
|
let timer = undefined;
|
|
let onAborted = undefined;
|
|
const rejectOnAbort = () => {
|
|
return reject(new AbortError(options?.abortErrorMsg ? options?.abortErrorMsg : StandardAbortMessage));
|
|
};
|
|
const removeListeners = () => {
|
|
if (options?.abortSignal && onAborted) {
|
|
options.abortSignal.removeEventListener("abort", onAborted);
|
|
}
|
|
};
|
|
onAborted = () => {
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
}
|
|
removeListeners();
|
|
return rejectOnAbort();
|
|
};
|
|
if (options?.abortSignal && options.abortSignal.aborted) {
|
|
return rejectOnAbort();
|
|
}
|
|
timer = setTimeout(() => {
|
|
removeListeners();
|
|
resolve(value);
|
|
}, delayInMs);
|
|
if (options?.abortSignal) {
|
|
options.abortSignal.addEventListener("abort", onAborted);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* @internal
|
|
* @returns the parsed value or undefined if the parsed value is invalid.
|
|
*/
|
|
function parseHeaderValueAsNumber(response, headerName) {
|
|
const value = response.headers.get(headerName);
|
|
if (!value)
|
|
return;
|
|
const valueAsNum = Number(value);
|
|
if (Number.isNaN(valueAsNum))
|
|
return;
|
|
return valueAsNum;
|
|
}
|
|
//# sourceMappingURL=helpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/retryStrategies/throttlingRetryStrategy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The header that comes back from services representing
|
|
* the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry).
|
|
*/
|
|
const RetryAfterHeader = "Retry-After";
|
|
/**
|
|
* The headers that come back from services representing
|
|
* the amount of time (minimum) to wait to retry.
|
|
*
|
|
* "retry-after-ms", "x-ms-retry-after-ms" : milliseconds
|
|
* "Retry-After" : seconds or timestamp
|
|
*/
|
|
const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader];
|
|
/**
|
|
* A response is a throttling retry response if it has a throttling status code (429 or 503),
|
|
* as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
|
|
*
|
|
* Returns the `retryAfterInMs` value if the response is a throttling retry response.
|
|
* If not throttling retry response, returns `undefined`.
|
|
*
|
|
* @internal
|
|
*/
|
|
function getRetryAfterInMs(response) {
|
|
if (!(response && [429, 503].includes(response.status)))
|
|
return undefined;
|
|
try {
|
|
// Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After"
|
|
for (const header of AllRetryAfterHeaders) {
|
|
const retryAfterValue = parseHeaderValueAsNumber(response, header);
|
|
if (retryAfterValue === 0 || retryAfterValue) {
|
|
// "Retry-After" header ==> seconds
|
|
// "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds
|
|
const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1;
|
|
return retryAfterValue * multiplyingFactor; // in milli-seconds
|
|
}
|
|
}
|
|
// RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds
|
|
const retryAfterHeader = response.headers.get(RetryAfterHeader);
|
|
if (!retryAfterHeader)
|
|
return;
|
|
const date = Date.parse(retryAfterHeader);
|
|
const diff = date - Date.now();
|
|
// negative diff would mean a date in the past, so retry asap with 0 milliseconds
|
|
return Number.isFinite(diff) ? Math.max(0, diff) : undefined;
|
|
}
|
|
catch {
|
|
return undefined;
|
|
}
|
|
}
|
|
/**
|
|
* A response is a retry response if it has a throttling status code (429 or 503),
|
|
* as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
|
|
*/
|
|
function isThrottlingRetryResponse(response) {
|
|
return Number.isFinite(getRetryAfterInMs(response));
|
|
}
|
|
function throttlingRetryStrategy_throttlingRetryStrategy() {
|
|
return {
|
|
name: "throttlingRetryStrategy",
|
|
retry({ response }) {
|
|
const retryAfterInMs = getRetryAfterInMs(response);
|
|
if (!Number.isFinite(retryAfterInMs)) {
|
|
return { skipStrategy: true };
|
|
}
|
|
return {
|
|
retryAfterInMs,
|
|
};
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=throttlingRetryStrategy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/retryStrategies/exponentialRetryStrategy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
// intervals are in milliseconds
|
|
const DEFAULT_CLIENT_RETRY_INTERVAL = 1000;
|
|
const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64;
|
|
/**
|
|
* A retry strategy that retries with an exponentially increasing delay in these two cases:
|
|
* - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
|
|
* - Or otherwise if the outgoing request fails (408, greater or equal than 500, except for 501 and 505).
|
|
*/
|
|
function exponentialRetryStrategy_exponentialRetryStrategy(options = {}) {
|
|
const retryInterval = options.retryDelayInMs ?? DEFAULT_CLIENT_RETRY_INTERVAL;
|
|
const maxRetryInterval = options.maxRetryDelayInMs ?? DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
|
|
return {
|
|
name: "exponentialRetryStrategy",
|
|
retry({ retryCount, response, responseError }) {
|
|
const matchedSystemError = isSystemError(responseError);
|
|
const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors;
|
|
const isExponential = isExponentialRetryResponse(response);
|
|
const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes;
|
|
const unknownResponse = response && (isThrottlingRetryResponse(response) || !isExponential);
|
|
if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) {
|
|
return { skipStrategy: true };
|
|
}
|
|
if (responseError && !matchedSystemError && !isExponential) {
|
|
return { errorToThrow: responseError };
|
|
}
|
|
return calculateRetryDelay(retryCount, {
|
|
retryDelayInMs: retryInterval,
|
|
maxRetryDelayInMs: maxRetryInterval,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* A response is a retry response if it has status codes:
|
|
* - 408, or
|
|
* - Greater or equal than 500, except for 501 and 505.
|
|
*/
|
|
function isExponentialRetryResponse(response) {
|
|
return Boolean(response &&
|
|
response.status !== undefined &&
|
|
(response.status >= 500 || response.status === 408) &&
|
|
response.status !== 501 &&
|
|
response.status !== 505);
|
|
}
|
|
/**
|
|
* Determines whether an error from a pipeline response was triggered in the network layer.
|
|
*/
|
|
function isSystemError(err) {
|
|
if (!err) {
|
|
return false;
|
|
}
|
|
return (err.code === "ETIMEDOUT" ||
|
|
err.code === "ESOCKETTIMEDOUT" ||
|
|
err.code === "ECONNREFUSED" ||
|
|
err.code === "ECONNRESET" ||
|
|
err.code === "ENOENT" ||
|
|
err.code === "ENOTFOUND");
|
|
}
|
|
//# sourceMappingURL=exponentialRetryStrategy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/constants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const constants_SDK_VERSION = "0.3.7";
|
|
const constants_DEFAULT_RETRY_POLICY_COUNT = 3;
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/retryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
const retryPolicyLogger = createClientLogger("ts-http-runtime retryPolicy");
|
|
/**
|
|
* The programmatic identifier of the retryPolicy.
|
|
*/
|
|
const retryPolicyName = "retryPolicy";
|
|
/**
|
|
* retryPolicy is a generic policy to enable retrying requests when certain conditions are met
|
|
*/
|
|
function retryPolicy_retryPolicy(strategies, options = { maxRetries: constants_DEFAULT_RETRY_POLICY_COUNT }) {
|
|
const logger = options.logger || retryPolicyLogger;
|
|
return {
|
|
name: retryPolicyName,
|
|
async sendRequest(request, next) {
|
|
let response;
|
|
let responseError;
|
|
let retryCount = -1;
|
|
retryRequest: while (true) {
|
|
retryCount += 1;
|
|
response = undefined;
|
|
responseError = undefined;
|
|
try {
|
|
logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
|
|
response = await next(request);
|
|
logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
|
|
}
|
|
catch (e) {
|
|
logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
|
|
// RestErrors are valid targets for the retry strategies.
|
|
// If none of the retry strategies can work with them, they will be thrown later in this policy.
|
|
// If the received error is not a RestError, it is immediately thrown.
|
|
if (!restError_isRestError(e)) {
|
|
throw e;
|
|
}
|
|
responseError = e;
|
|
response = e.response;
|
|
}
|
|
if (request.abortSignal?.aborted) {
|
|
logger.error(`Retry ${retryCount}: Request aborted.`);
|
|
const abortError = new AbortError();
|
|
throw abortError;
|
|
}
|
|
if (retryCount >= (options.maxRetries ?? constants_DEFAULT_RETRY_POLICY_COUNT)) {
|
|
logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`);
|
|
if (responseError) {
|
|
throw responseError;
|
|
}
|
|
else if (response) {
|
|
return response;
|
|
}
|
|
else {
|
|
throw new Error("Maximum retries reached with no response or error to throw");
|
|
}
|
|
}
|
|
logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
|
|
strategiesLoop: for (const strategy of strategies) {
|
|
const strategyLogger = strategy.logger || logger;
|
|
strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
|
|
const modifiers = strategy.retry({
|
|
retryCount,
|
|
response,
|
|
responseError,
|
|
});
|
|
if (modifiers.skipStrategy) {
|
|
strategyLogger.info(`Retry ${retryCount}: Skipped.`);
|
|
continue strategiesLoop;
|
|
}
|
|
const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
|
|
if (errorToThrow) {
|
|
strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow);
|
|
throw errorToThrow;
|
|
}
|
|
if (retryAfterInMs || retryAfterInMs === 0) {
|
|
strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`);
|
|
await helpers_delay(retryAfterInMs, undefined, { abortSignal: request.abortSignal });
|
|
continue retryRequest;
|
|
}
|
|
if (redirectTo) {
|
|
strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`);
|
|
request.url = redirectTo;
|
|
continue retryRequest;
|
|
}
|
|
}
|
|
if (responseError) {
|
|
logger.info(`None of the retry strategies could work with the received error. Throwing it.`);
|
|
throw responseError;
|
|
}
|
|
if (response) {
|
|
logger.info(`None of the retry strategies could work with the received response. Returning it.`);
|
|
return response;
|
|
}
|
|
// If all the retries skip and there's no response,
|
|
// we're still in the retry loop, so a new request will be sent
|
|
// until `maxRetries` is reached.
|
|
}
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=retryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/defaultRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Name of the {@link defaultRetryPolicy}
|
|
*/
|
|
const defaultRetryPolicyName = "defaultRetryPolicy";
|
|
/**
|
|
* A policy that retries according to three strategies:
|
|
* - When the server sends a 429 response with a Retry-After header.
|
|
* - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
|
|
* - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
|
|
*/
|
|
function defaultRetryPolicy_defaultRetryPolicy(options = {}) {
|
|
return {
|
|
name: defaultRetryPolicyName,
|
|
sendRequest: retryPolicy_retryPolicy([throttlingRetryStrategy_throttlingRetryStrategy(), exponentialRetryStrategy_exponentialRetryStrategy(options)], {
|
|
maxRetries: options.maxRetries ?? constants_DEFAULT_RETRY_POLICY_COUNT,
|
|
}).sendRequest,
|
|
};
|
|
}
|
|
//# sourceMappingURL=defaultRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/bytesEncoding.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The helper that transforms bytes with specific character encoding into string
|
|
* @param bytes - the uint8array bytes
|
|
* @param format - the format we use to encode the byte
|
|
* @returns a string of the encoded string
|
|
*/
|
|
function bytesEncoding_uint8ArrayToString(bytes, format) {
|
|
return Buffer.from(bytes).toString(format);
|
|
}
|
|
/**
|
|
* The helper that transforms string to specific character encoded bytes array.
|
|
* @param value - the string to be converted
|
|
* @param format - the format we use to decode the value
|
|
* @returns a uint8array
|
|
*/
|
|
function bytesEncoding_stringToUint8Array(value, format) {
|
|
return Buffer.from(value, format);
|
|
}
|
|
//# sourceMappingURL=bytesEncoding.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/formData.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* If the request body is a native FormData, convert it to our FormDataMap
|
|
* representation and clear the body. Node.js's HTTP stack doesn't handle
|
|
* FormData natively, so the pipeline must serialize it later.
|
|
*
|
|
* @internal
|
|
*/
|
|
function convertBodyToFormDataMap(body) {
|
|
if (typeof FormData !== "undefined" && body instanceof FormData) {
|
|
const formDataMap = {};
|
|
for (const [key, value] of body.entries()) {
|
|
const existing = formDataMap[key];
|
|
if (Array.isArray(existing)) {
|
|
existing.push(value);
|
|
}
|
|
else {
|
|
formDataMap[key] = existing !== undefined ? [existing, value] : [value];
|
|
}
|
|
}
|
|
return formDataMap;
|
|
}
|
|
return undefined;
|
|
}
|
|
//# sourceMappingURL=formData.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/formDataPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the formDataPolicy.
|
|
*/
|
|
const formDataPolicyName = "formDataPolicy";
|
|
/**
|
|
* A policy that encodes FormData on the request into the body.
|
|
*/
|
|
function formDataPolicy_formDataPolicy() {
|
|
return {
|
|
name: formDataPolicyName,
|
|
async sendRequest(request, next) {
|
|
const converted = convertBodyToFormDataMap(request.body);
|
|
if (converted) {
|
|
request.formData = converted;
|
|
request.body = undefined;
|
|
}
|
|
if (request.formData) {
|
|
const contentType = request.headers.get("Content-Type");
|
|
if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
|
|
request.body = wwwFormUrlEncode(request.formData);
|
|
}
|
|
else {
|
|
await prepareFormData(request.formData, request);
|
|
}
|
|
request.formData = undefined;
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
function wwwFormUrlEncode(formData) {
|
|
const urlSearchParams = new URLSearchParams();
|
|
for (const [key, value] of Object.entries(formData)) {
|
|
if (Array.isArray(value)) {
|
|
for (const subValue of value) {
|
|
urlSearchParams.append(key, subValue.toString());
|
|
}
|
|
}
|
|
else {
|
|
urlSearchParams.append(key, value.toString());
|
|
}
|
|
}
|
|
return urlSearchParams.toString();
|
|
}
|
|
async function prepareFormData(formData, request) {
|
|
// validate content type (multipart/form-data)
|
|
const contentType = request.headers.get("Content-Type");
|
|
if (contentType && !contentType.startsWith("multipart/form-data")) {
|
|
// content type is specified and is not multipart/form-data. Exit.
|
|
return;
|
|
}
|
|
request.headers.set("Content-Type", contentType ?? "multipart/form-data");
|
|
// set body to MultipartRequestBody using content from FormDataMap
|
|
const parts = [];
|
|
for (const [fieldName, values] of Object.entries(formData)) {
|
|
for (const value of Array.isArray(values) ? values : [values]) {
|
|
if (typeof value === "string") {
|
|
parts.push({
|
|
headers: httpHeaders_createHttpHeaders({
|
|
"Content-Disposition": `form-data; name="${fieldName}"`,
|
|
}),
|
|
body: bytesEncoding_stringToUint8Array(value, "utf-8"),
|
|
});
|
|
}
|
|
else if (value === undefined || value === null || typeof value !== "object") {
|
|
throw new Error(`Unexpected value for key ${fieldName}: ${value}. Value should be serialized to string first.`);
|
|
}
|
|
else {
|
|
// using || instead of ?? here since if value.name is empty we should create a file name
|
|
const fileName = value.name || "blob";
|
|
const headers = httpHeaders_createHttpHeaders();
|
|
headers.set("Content-Disposition", `form-data; name="${fieldName}"; filename="${fileName}"`);
|
|
// again, || is used since an empty value.type means the content type is unset
|
|
headers.set("Content-Type", value.type || "application/octet-stream");
|
|
parts.push({
|
|
headers,
|
|
body: value,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
request.multipartBody = { parts };
|
|
}
|
|
//# sourceMappingURL=formDataPolicy.js.map
|
|
// EXTERNAL MODULE: ./node_modules/https-proxy-agent/dist/index.js
|
|
var dist = __webpack_require__(3669);
|
|
// EXTERNAL MODULE: ./node_modules/http-proxy-agent/dist/index.js
|
|
var http_proxy_agent_dist = __webpack_require__(1970);
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/proxyPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
const HTTPS_PROXY = "HTTPS_PROXY";
|
|
const HTTP_PROXY = "HTTP_PROXY";
|
|
const ALL_PROXY = "ALL_PROXY";
|
|
const NO_PROXY = "NO_PROXY";
|
|
/**
|
|
* The programmatic identifier of the proxyPolicy.
|
|
*/
|
|
const proxyPolicyName = "proxyPolicy";
|
|
/**
|
|
* Stores the patterns specified in NO_PROXY environment variable.
|
|
* @internal
|
|
*/
|
|
const globalNoProxyList = [];
|
|
let noProxyListLoaded = false;
|
|
/** A cache of whether a host should bypass the proxy. */
|
|
const globalBypassedMap = new Map();
|
|
function getEnvironmentValue(name) {
|
|
if (process.env[name]) {
|
|
return process.env[name];
|
|
}
|
|
else if (process.env[name.toLowerCase()]) {
|
|
return process.env[name.toLowerCase()];
|
|
}
|
|
return undefined;
|
|
}
|
|
function loadEnvironmentProxyValue() {
|
|
if (!process) {
|
|
return undefined;
|
|
}
|
|
const httpsProxy = getEnvironmentValue(HTTPS_PROXY);
|
|
const allProxy = getEnvironmentValue(ALL_PROXY);
|
|
const httpProxy = getEnvironmentValue(HTTP_PROXY);
|
|
return httpsProxy || allProxy || httpProxy;
|
|
}
|
|
/**
|
|
* Check whether the host of a given `uri` matches any pattern in the no proxy list.
|
|
* If there's a match, any request sent to the same host shouldn't have the proxy settings set.
|
|
* This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
|
|
*/
|
|
function isBypassed(uri, noProxyList, bypassedMap) {
|
|
if (noProxyList.length === 0) {
|
|
return false;
|
|
}
|
|
const host = new URL(uri).hostname;
|
|
if (bypassedMap?.has(host)) {
|
|
return bypassedMap.get(host);
|
|
}
|
|
let isBypassedFlag = false;
|
|
for (const pattern of noProxyList) {
|
|
if (pattern[0] === ".") {
|
|
// This should match either domain it self or any subdomain or host
|
|
// .foo.com will match foo.com it self or *.foo.com
|
|
if (host.endsWith(pattern)) {
|
|
isBypassedFlag = true;
|
|
}
|
|
else {
|
|
if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
|
|
isBypassedFlag = true;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (host === pattern) {
|
|
isBypassedFlag = true;
|
|
}
|
|
}
|
|
}
|
|
bypassedMap?.set(host, isBypassedFlag);
|
|
return isBypassedFlag;
|
|
}
|
|
function loadNoProxy() {
|
|
const noProxy = getEnvironmentValue(NO_PROXY);
|
|
noProxyListLoaded = true;
|
|
if (noProxy) {
|
|
return noProxy
|
|
.split(",")
|
|
.map((item) => item.trim())
|
|
.filter((item) => item.length);
|
|
}
|
|
return [];
|
|
}
|
|
/**
|
|
* This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
|
|
* If no argument is given, it attempts to parse a proxy URL from the environment
|
|
* variables `HTTPS_PROXY` or `HTTP_PROXY`.
|
|
* @param proxyUrl - The url of the proxy to use. May contain authentication information.
|
|
* @deprecated - Internally this method is no longer necessary when setting proxy information.
|
|
*/
|
|
function getDefaultProxySettings(proxyUrl) {
|
|
if (!proxyUrl) {
|
|
proxyUrl = loadEnvironmentProxyValue();
|
|
if (!proxyUrl) {
|
|
return undefined;
|
|
}
|
|
}
|
|
const parsedUrl = new URL(proxyUrl);
|
|
const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : "";
|
|
return {
|
|
host: schema + parsedUrl.hostname,
|
|
port: Number.parseInt(parsedUrl.port || "80"),
|
|
username: parsedUrl.username,
|
|
password: parsedUrl.password,
|
|
};
|
|
}
|
|
/**
|
|
* This method attempts to parse a proxy URL from the environment
|
|
* variables `HTTPS_PROXY` or `HTTP_PROXY`.
|
|
*/
|
|
function getDefaultProxySettingsInternal() {
|
|
const envProxy = loadEnvironmentProxyValue();
|
|
return envProxy ? new URL(envProxy) : undefined;
|
|
}
|
|
function getUrlFromProxySettings(settings) {
|
|
let parsedProxyUrl;
|
|
try {
|
|
parsedProxyUrl = new URL(settings.host);
|
|
}
|
|
catch {
|
|
throw new Error(`Expecting a valid host string in proxy settings, but found "${settings.host}".`);
|
|
}
|
|
parsedProxyUrl.port = String(settings.port);
|
|
if (settings.username) {
|
|
parsedProxyUrl.username = settings.username;
|
|
}
|
|
if (settings.password) {
|
|
parsedProxyUrl.password = settings.password;
|
|
}
|
|
return parsedProxyUrl;
|
|
}
|
|
function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) {
|
|
// Custom Agent should take precedence so if one is present
|
|
// we should skip to avoid overwriting it.
|
|
if (request.agent) {
|
|
return;
|
|
}
|
|
const url = new URL(request.url);
|
|
const isInsecure = url.protocol !== "https:";
|
|
if (request.tlsSettings) {
|
|
log_logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored.");
|
|
}
|
|
if (isInsecure) {
|
|
if (!cachedAgents.httpProxyAgent) {
|
|
cachedAgents.httpProxyAgent = new http_proxy_agent_dist.HttpProxyAgent(proxyUrl);
|
|
}
|
|
request.agent = cachedAgents.httpProxyAgent;
|
|
}
|
|
else {
|
|
if (!cachedAgents.httpsProxyAgent) {
|
|
cachedAgents.httpsProxyAgent = new dist.HttpsProxyAgent(proxyUrl);
|
|
}
|
|
request.agent = cachedAgents.httpsProxyAgent;
|
|
}
|
|
}
|
|
/**
|
|
* A policy that allows one to apply proxy settings to all requests.
|
|
* If not passed static settings, they will be retrieved from the HTTPS_PROXY
|
|
* or HTTP_PROXY environment variables.
|
|
* @param proxySettings - ProxySettings to use on each request.
|
|
* @param options - additional settings, for example, custom NO_PROXY patterns
|
|
*/
|
|
function proxyPolicy_proxyPolicy(proxySettings, options) {
|
|
if (!noProxyListLoaded) {
|
|
globalNoProxyList.push(...loadNoProxy());
|
|
}
|
|
const defaultProxy = proxySettings
|
|
? getUrlFromProxySettings(proxySettings)
|
|
: getDefaultProxySettingsInternal();
|
|
const cachedAgents = {};
|
|
return {
|
|
name: proxyPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.proxySettings &&
|
|
defaultProxy &&
|
|
!isBypassed(request.url, options?.customNoProxyList ?? globalNoProxyList, options?.customNoProxyList ? undefined : globalBypassedMap)) {
|
|
setProxyAgentOnRequest(request, cachedAgents, defaultProxy);
|
|
}
|
|
else if (request.proxySettings) {
|
|
setProxyAgentOnRequest(request, cachedAgents, getUrlFromProxySettings(request.proxySettings));
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=proxyPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/redirectPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the redirectPolicy.
|
|
*/
|
|
const redirectPolicyName = "redirectPolicy";
|
|
/**
|
|
* Methods that are allowed to follow redirects 301 and 302
|
|
*/
|
|
const allowedRedirect = ["GET", "HEAD"];
|
|
/**
|
|
* A policy to follow Location headers from the server in order
|
|
* to support server-side redirection.
|
|
* In the browser, this policy is not used.
|
|
* @param options - Options to control policy behavior.
|
|
*/
|
|
function redirectPolicy_redirectPolicy(options = {}) {
|
|
const { maxRetries = 20, allowCrossOriginRedirects = false } = options;
|
|
return {
|
|
name: redirectPolicyName,
|
|
async sendRequest(request, next) {
|
|
const response = await next(request);
|
|
return handleRedirect(next, response, maxRetries, allowCrossOriginRedirects);
|
|
},
|
|
};
|
|
}
|
|
async function handleRedirect(next, response, maxRetries, allowCrossOriginRedirects, currentRetries = 0) {
|
|
const { request, status, headers } = response;
|
|
const locationHeader = headers.get("location");
|
|
if (locationHeader &&
|
|
(status === 300 ||
|
|
(status === 301 && allowedRedirect.includes(request.method)) ||
|
|
(status === 302 && allowedRedirect.includes(request.method)) ||
|
|
(status === 303 && request.method === "POST") ||
|
|
status === 307) &&
|
|
currentRetries < maxRetries) {
|
|
const url = new URL(locationHeader, request.url);
|
|
// Only follow redirects to the same origin by default.
|
|
if (!allowCrossOriginRedirects) {
|
|
const originalUrl = new URL(request.url);
|
|
if (url.origin !== originalUrl.origin) {
|
|
log_logger.verbose(`Skipping cross-origin redirect from ${originalUrl.origin} to ${url.origin}.`);
|
|
return response;
|
|
}
|
|
}
|
|
request.url = url.toString();
|
|
// POST request with Status code 303 should be converted into a
|
|
// redirected GET request if the redirect url is present in the location header
|
|
if (status === 303) {
|
|
request.method = "GET";
|
|
request.headers.delete("Content-Length");
|
|
delete request.body;
|
|
}
|
|
request.headers.delete("Authorization");
|
|
const res = await next(request);
|
|
return handleRedirect(next, res, maxRetries, allowCrossOriginRedirects, currentRetries + 1);
|
|
}
|
|
return response;
|
|
}
|
|
//# sourceMappingURL=redirectPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/platformPolicies.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Add platform-specific policies to the pipeline.
|
|
*
|
|
* On Node.js, this adds agent, TLS, proxy, decompression, and redirect
|
|
* policies. On browser and React Native these concerns are handled
|
|
* natively by the runtime, so this is a no-op.
|
|
*
|
|
* @internal
|
|
*/
|
|
function platformPolicies_addPlatformPolicies(pipeline, options) {
|
|
if (options.agent) {
|
|
pipeline.addPolicy(agentPolicy(options.agent));
|
|
}
|
|
if (options.tlsOptions) {
|
|
pipeline.addPolicy(tlsPolicy(options.tlsOptions));
|
|
}
|
|
pipeline.addPolicy(proxyPolicy(options.proxyOptions));
|
|
pipeline.addPolicy(decompressResponsePolicy());
|
|
// Both XHR and Fetch expect to handle redirects automatically,
|
|
// so this only takes effect on Node.
|
|
pipeline.addPolicy(redirectPolicy(options.redirectOptions), { afterPhase: "Retry" });
|
|
}
|
|
//# sourceMappingURL=platformPolicies.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/typeGuards-node.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Checks if the given value is a Node.js readable stream.
|
|
*
|
|
* @internal
|
|
*/
|
|
function typeGuards_node_isNodeReadableStream(x) {
|
|
return x instanceof Readable;
|
|
}
|
|
/**
|
|
* Checks if the given value is a web ReadableStream.
|
|
*
|
|
* @internal
|
|
*/
|
|
function typeGuards_node_isWebReadableStream(x) {
|
|
return x instanceof ReadableStream;
|
|
}
|
|
//# sourceMappingURL=typeGuards-node.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/typeGuards.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
function typeGuards_isBinaryBody(body) {
|
|
return (body !== undefined &&
|
|
(body instanceof Uint8Array ||
|
|
typeGuards_isReadableStream(body) ||
|
|
typeof body === "function" ||
|
|
body instanceof Blob));
|
|
}
|
|
function typeGuards_isReadableStream(x) {
|
|
return isNodeReadableStream(x) || isWebReadableStream(x);
|
|
}
|
|
function typeGuards_isBlob(x) {
|
|
return x instanceof Blob;
|
|
}
|
|
//# sourceMappingURL=typeGuards.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/concat.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
async function* streamAsyncIterator() {
|
|
const reader = this.getReader();
|
|
try {
|
|
while (true) {
|
|
const { done, value } = await reader.read();
|
|
if (done) {
|
|
return;
|
|
}
|
|
yield value;
|
|
}
|
|
}
|
|
finally {
|
|
reader.releaseLock();
|
|
}
|
|
}
|
|
function makeAsyncIterable(webStream) {
|
|
if (!webStream[Symbol.asyncIterator]) {
|
|
webStream[Symbol.asyncIterator] = streamAsyncIterator.bind(webStream);
|
|
}
|
|
if (!webStream.values) {
|
|
webStream.values = streamAsyncIterator.bind(webStream);
|
|
}
|
|
}
|
|
function ensureNodeStream(stream) {
|
|
if (stream instanceof ReadableStream) {
|
|
makeAsyncIterable(stream);
|
|
return external_stream_.Readable.fromWeb(stream);
|
|
}
|
|
else {
|
|
return stream;
|
|
}
|
|
}
|
|
function toStream(source) {
|
|
if (source instanceof Uint8Array) {
|
|
return external_stream_.Readable.from(Buffer.from(source));
|
|
}
|
|
else if (typeGuards_isBlob(source)) {
|
|
return ensureNodeStream(source.stream());
|
|
}
|
|
else {
|
|
return ensureNodeStream(source);
|
|
}
|
|
}
|
|
/**
|
|
* Utility function that concatenates a set of binary inputs into one combined output.
|
|
*
|
|
* @param sources - array of sources for the concatenation
|
|
* @returns - in Node, a (() =\> NodeJS.ReadableStream) which, when read, produces a concatenation of all the inputs.
|
|
* In browser, returns a `Blob` representing all the concatenated inputs.
|
|
*
|
|
* @internal
|
|
*/
|
|
async function concat(sources) {
|
|
return function () {
|
|
const streams = sources.map((x) => (typeof x === "function" ? x() : x)).map(toStream);
|
|
return external_stream_.Readable.from((async function* () {
|
|
for (const stream of streams) {
|
|
for await (const chunk of stream) {
|
|
yield chunk;
|
|
}
|
|
}
|
|
})());
|
|
};
|
|
}
|
|
//# sourceMappingURL=concat.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/multipartPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
function generateBoundary() {
|
|
return `----AzSDKFormBoundary${randomUUID()}`;
|
|
}
|
|
function encodeHeaders(headers) {
|
|
let result = "";
|
|
for (const [key, value] of headers) {
|
|
result += `${key}: ${value}\r\n`;
|
|
}
|
|
return result;
|
|
}
|
|
function getLength(source) {
|
|
if (source instanceof Uint8Array) {
|
|
return source.byteLength;
|
|
}
|
|
else if (typeGuards_isBlob(source)) {
|
|
// if was created using createFile then -1 means we have an unknown size
|
|
return source.size === -1 ? undefined : source.size;
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
function getTotalLength(sources) {
|
|
let total = 0;
|
|
for (const source of sources) {
|
|
const partLength = getLength(source);
|
|
if (partLength === undefined) {
|
|
return undefined;
|
|
}
|
|
else {
|
|
total += partLength;
|
|
}
|
|
}
|
|
return total;
|
|
}
|
|
async function buildRequestBody(request, parts, boundary) {
|
|
const sources = [
|
|
bytesEncoding_stringToUint8Array(`--${boundary}`, "utf-8"),
|
|
...parts.flatMap((part) => [
|
|
bytesEncoding_stringToUint8Array("\r\n", "utf-8"),
|
|
bytesEncoding_stringToUint8Array(encodeHeaders(part.headers), "utf-8"),
|
|
bytesEncoding_stringToUint8Array("\r\n", "utf-8"),
|
|
part.body,
|
|
bytesEncoding_stringToUint8Array(`\r\n--${boundary}`, "utf-8"),
|
|
]),
|
|
bytesEncoding_stringToUint8Array("--\r\n\r\n", "utf-8"),
|
|
];
|
|
const contentLength = getTotalLength(sources);
|
|
if (contentLength) {
|
|
request.headers.set("Content-Length", contentLength);
|
|
}
|
|
// The public BodyPart.body type uses Uint8Array (= Uint8Array<ArrayBufferLike>) for
|
|
// backward compatibility. Internally, concat requires Uint8Array<ArrayBuffer> to ensure
|
|
// SharedArrayBuffer-backed arrays don't flow into Blob construction. In practice, HTTP
|
|
// request bodies are always ArrayBuffer-backed, so this narrowing is safe.
|
|
request.body = await concat(sources);
|
|
}
|
|
/**
|
|
* Name of multipart policy
|
|
*/
|
|
const multipartPolicy_multipartPolicyName = "multipartPolicy";
|
|
const maxBoundaryLength = 70;
|
|
const validBoundaryCharacters = new Set(`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'()+,-./:=?`);
|
|
function assertValidBoundary(boundary) {
|
|
if (boundary.length > maxBoundaryLength) {
|
|
throw new Error(`Multipart boundary "${boundary}" exceeds maximum length of 70 characters`);
|
|
}
|
|
if (Array.from(boundary).some((x) => !validBoundaryCharacters.has(x))) {
|
|
throw new Error(`Multipart boundary "${boundary}" contains invalid characters`);
|
|
}
|
|
}
|
|
/**
|
|
* Pipeline policy for multipart requests
|
|
*/
|
|
function multipartPolicy_multipartPolicy() {
|
|
return {
|
|
name: multipartPolicy_multipartPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.multipartBody) {
|
|
return next(request);
|
|
}
|
|
if (request.body) {
|
|
throw new Error("multipartBody and regular body cannot be set at the same time");
|
|
}
|
|
let boundary = request.multipartBody.boundary;
|
|
const contentTypeHeader = request.headers.get("Content-Type") ?? "multipart/mixed";
|
|
const parsedHeader = contentTypeHeader.match(/^(multipart\/[^ ;]+)(?:; *boundary=(.+))?$/);
|
|
if (!parsedHeader) {
|
|
throw new Error(`Got multipart request body, but content-type header was not multipart: ${contentTypeHeader}`);
|
|
}
|
|
const [, contentType, parsedBoundary] = parsedHeader;
|
|
if (parsedBoundary && boundary && parsedBoundary !== boundary) {
|
|
throw new Error(`Multipart boundary was specified as ${parsedBoundary} in the header, but got ${boundary} in the request body`);
|
|
}
|
|
boundary ??= parsedBoundary;
|
|
if (boundary) {
|
|
assertValidBoundary(boundary);
|
|
}
|
|
else {
|
|
boundary = generateBoundary();
|
|
}
|
|
request.headers.set("Content-Type", `${contentType}; boundary=${boundary}`);
|
|
await buildRequestBody(request, request.multipartBody.parts, boundary);
|
|
request.multipartBody = undefined;
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=multipartPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/createPipelineFromOptions.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Create a new pipeline with a default set of customizable policies.
|
|
* @param options - Options to configure a custom pipeline.
|
|
*/
|
|
function createPipelineFromOptions_createPipelineFromOptions(options) {
|
|
const pipeline = createEmptyPipeline();
|
|
addPlatformPolicies(pipeline, options);
|
|
pipeline.addPolicy(formDataPolicy(), { beforePolicies: [multipartPolicyName] });
|
|
pipeline.addPolicy(userAgentPolicy(options.userAgentOptions));
|
|
// The multipart policy is added after policies with no phase, so that
|
|
// policies can be added between it and formDataPolicy to modify
|
|
// properties (e.g., making the boundary constant in recorded tests).
|
|
pipeline.addPolicy(multipartPolicy(), { afterPhase: "Deserialize" });
|
|
pipeline.addPolicy(defaultRetryPolicy(options.retryOptions), { phase: "Retry" });
|
|
pipeline.addPolicy(logPolicy(options.loggingOptions), { afterPhase: "Sign" });
|
|
return pipeline;
|
|
}
|
|
//# sourceMappingURL=createPipelineFromOptions.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/auth/checkInsecureConnection.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
// Ensure the warining is only emitted once
|
|
let insecureConnectionWarningEmmitted = false;
|
|
/**
|
|
* Checks if the request is allowed to be sent over an insecure connection.
|
|
*
|
|
* A request is allowed to be sent over an insecure connection when:
|
|
* - The `allowInsecureConnection` option is set to `true`.
|
|
* - The request has the `allowInsecureConnection` property set to `true`.
|
|
* - The request is being sent to `localhost` or `127.0.0.1`
|
|
*/
|
|
function allowInsecureConnection(request, options) {
|
|
if (options.allowInsecureConnection && request.allowInsecureConnection) {
|
|
const url = new URL(request.url);
|
|
if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
/**
|
|
* Logs a warning about sending a token over an insecure connection.
|
|
*
|
|
* This function will emit a node warning once, but log the warning every time.
|
|
*/
|
|
function emitInsecureConnectionWarning() {
|
|
const warning = "Sending token over insecure transport. Assume any token issued is compromised.";
|
|
logger.warning(warning);
|
|
if (!insecureConnectionWarningEmmitted) {
|
|
insecureConnectionWarningEmmitted = true;
|
|
emitNodeWarning(warning);
|
|
}
|
|
}
|
|
/**
|
|
* Ensures that authentication is only allowed over HTTPS unless explicitly allowed.
|
|
* Throws an error if the connection is not secure and not explicitly allowed.
|
|
*/
|
|
function checkInsecureConnection_ensureSecureConnection(request, options) {
|
|
if (!request.url.toLowerCase().startsWith("https://")) {
|
|
if (allowInsecureConnection(request, options)) {
|
|
emitInsecureConnectionWarning();
|
|
}
|
|
else {
|
|
throw new Error("Authentication is not permitted for non-TLS protected (non-https) URLs when allowInsecureConnection is false.");
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=checkInsecureConnection.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/auth/apiKeyAuthenticationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the API Key Authentication Policy
|
|
*/
|
|
const apiKeyAuthenticationPolicyName = "apiKeyAuthenticationPolicy";
|
|
/**
|
|
* Gets a pipeline policy that adds API key authentication to requests
|
|
*/
|
|
function apiKeyAuthenticationPolicy_apiKeyAuthenticationPolicy(options) {
|
|
return {
|
|
name: apiKeyAuthenticationPolicyName,
|
|
async sendRequest(request, next) {
|
|
// Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
|
|
ensureSecureConnection(request, options);
|
|
const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "apiKey");
|
|
// Skip adding authentication header if no API key authentication scheme is found
|
|
if (!scheme) {
|
|
return next(request);
|
|
}
|
|
if (scheme.apiKeyLocation !== "header") {
|
|
throw new Error(`Unsupported API key location: ${scheme.apiKeyLocation}`);
|
|
}
|
|
request.headers.set(scheme.name, options.credential.key);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=apiKeyAuthenticationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/auth/basicAuthenticationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Name of the Basic Authentication Policy
|
|
*/
|
|
const basicAuthenticationPolicyName = "bearerAuthenticationPolicy";
|
|
/**
|
|
* Gets a pipeline policy that adds basic authentication to requests
|
|
*/
|
|
function basicAuthenticationPolicy_basicAuthenticationPolicy(options) {
|
|
return {
|
|
name: basicAuthenticationPolicyName,
|
|
async sendRequest(request, next) {
|
|
// Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
|
|
ensureSecureConnection(request, options);
|
|
const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "basic");
|
|
// Skip adding authentication header if no basic authentication scheme is found
|
|
if (!scheme) {
|
|
return next(request);
|
|
}
|
|
const { username, password } = options.credential;
|
|
const headerValue = uint8ArrayToString(stringToUint8Array(`${username}:${password}`, "utf-8"), "base64");
|
|
request.headers.set("Authorization", `Basic ${headerValue}`);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=basicAuthenticationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/auth/bearerAuthenticationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the Bearer Authentication Policy
|
|
*/
|
|
const bearerAuthenticationPolicyName = "bearerAuthenticationPolicy";
|
|
/**
|
|
* Gets a pipeline policy that adds bearer token authentication to requests
|
|
*/
|
|
function bearerAuthenticationPolicy_bearerAuthenticationPolicy(options) {
|
|
return {
|
|
name: bearerAuthenticationPolicyName,
|
|
async sendRequest(request, next) {
|
|
// Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
|
|
ensureSecureConnection(request, options);
|
|
const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "http" && x.scheme === "bearer");
|
|
// Skip adding authentication header if no bearer authentication scheme is found
|
|
if (!scheme) {
|
|
return next(request);
|
|
}
|
|
const token = await options.credential.getBearerToken({
|
|
abortSignal: request.abortSignal,
|
|
});
|
|
request.headers.set("Authorization", `Bearer ${token}`);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=bearerAuthenticationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/auth/oauth2AuthenticationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the OAuth2 Authentication Policy
|
|
*/
|
|
const oauth2AuthenticationPolicyName = "oauth2AuthenticationPolicy";
|
|
/**
|
|
* Gets a pipeline policy that adds authorization header from OAuth2 schemes
|
|
*/
|
|
function oauth2AuthenticationPolicy_oauth2AuthenticationPolicy(options) {
|
|
return {
|
|
name: oauth2AuthenticationPolicyName,
|
|
async sendRequest(request, next) {
|
|
// Ensure allowInsecureConnection is explicitly set when sending request to non-https URLs
|
|
ensureSecureConnection(request, options);
|
|
const scheme = (request.authSchemes ?? options.authSchemes)?.find((x) => x.kind === "oauth2");
|
|
// Skip adding authentication header if no OAuth2 authentication scheme is found
|
|
if (!scheme) {
|
|
return next(request);
|
|
}
|
|
const token = await options.credential.getOAuth2Token(scheme.flows, {
|
|
abortSignal: request.abortSignal,
|
|
});
|
|
request.headers.set("Authorization", `Bearer ${token}`);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=oauth2AuthenticationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/client/clientHelpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cachedHttpClient;
|
|
/**
|
|
* Creates a default rest pipeline to re-use accross Rest Level Clients
|
|
*/
|
|
function clientHelpers_createDefaultPipeline(options = {}) {
|
|
const pipeline = createPipelineFromOptions(options);
|
|
pipeline.addPolicy(apiVersionPolicy(options));
|
|
const { credential, authSchemes, allowInsecureConnection } = options;
|
|
if (credential) {
|
|
if (isApiKeyCredential(credential)) {
|
|
pipeline.addPolicy(apiKeyAuthenticationPolicy({ authSchemes, credential, allowInsecureConnection }));
|
|
}
|
|
else if (isBasicCredential(credential)) {
|
|
pipeline.addPolicy(basicAuthenticationPolicy({ authSchemes, credential, allowInsecureConnection }));
|
|
}
|
|
else if (isBearerTokenCredential(credential)) {
|
|
pipeline.addPolicy(bearerAuthenticationPolicy({ authSchemes, credential, allowInsecureConnection }));
|
|
}
|
|
else if (isOAuth2TokenCredential(credential)) {
|
|
pipeline.addPolicy(oauth2AuthenticationPolicy({ authSchemes, credential, allowInsecureConnection }));
|
|
}
|
|
}
|
|
return pipeline;
|
|
}
|
|
function clientHelpers_getCachedDefaultHttpsClient() {
|
|
if (!cachedHttpClient) {
|
|
cachedHttpClient = createDefaultHttpClient();
|
|
}
|
|
return cachedHttpClient;
|
|
}
|
|
//# sourceMappingURL=clientHelpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/client/multipart.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Get value of a header in the part descriptor ignoring case
|
|
*/
|
|
function getHeaderValue(descriptor, headerName) {
|
|
if (descriptor.headers) {
|
|
const actualHeaderName = Object.keys(descriptor.headers).find((x) => x.toLowerCase() === headerName.toLowerCase());
|
|
if (actualHeaderName) {
|
|
return descriptor.headers[actualHeaderName];
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getPartContentType(descriptor) {
|
|
const contentTypeHeader = getHeaderValue(descriptor, "content-type");
|
|
if (contentTypeHeader) {
|
|
return contentTypeHeader;
|
|
}
|
|
// Special value of null means content type is to be omitted
|
|
if (descriptor.contentType === null) {
|
|
return undefined;
|
|
}
|
|
if (descriptor.contentType) {
|
|
return descriptor.contentType;
|
|
}
|
|
const { body } = descriptor;
|
|
if (body === null || body === undefined) {
|
|
return undefined;
|
|
}
|
|
if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
|
|
return "text/plain; charset=UTF-8";
|
|
}
|
|
if (body instanceof Blob) {
|
|
return body.type || "application/octet-stream";
|
|
}
|
|
if (isBinaryBody(body)) {
|
|
return "application/octet-stream";
|
|
}
|
|
// arbitrary non-text object -> generic JSON content type by default. We will try to JSON.stringify the body.
|
|
return "application/json";
|
|
}
|
|
/**
|
|
* Enclose value in quotes and escape special characters, for use in the Content-Disposition header
|
|
*/
|
|
function escapeDispositionField(value) {
|
|
return JSON.stringify(value);
|
|
}
|
|
function getContentDisposition(descriptor) {
|
|
const contentDispositionHeader = getHeaderValue(descriptor, "content-disposition");
|
|
if (contentDispositionHeader) {
|
|
return contentDispositionHeader;
|
|
}
|
|
if (descriptor.dispositionType === undefined &&
|
|
descriptor.name === undefined &&
|
|
descriptor.filename === undefined) {
|
|
return undefined;
|
|
}
|
|
const dispositionType = descriptor.dispositionType ?? "form-data";
|
|
let disposition = dispositionType;
|
|
if (descriptor.name) {
|
|
disposition += `; name=${escapeDispositionField(descriptor.name)}`;
|
|
}
|
|
let filename = undefined;
|
|
if (descriptor.filename) {
|
|
filename = descriptor.filename;
|
|
}
|
|
else if (typeof File !== "undefined" && descriptor.body instanceof File) {
|
|
const filenameFromFile = descriptor.body.name;
|
|
if (filenameFromFile !== "") {
|
|
filename = filenameFromFile;
|
|
}
|
|
}
|
|
if (filename) {
|
|
disposition += `; filename=${escapeDispositionField(filename)}`;
|
|
}
|
|
return disposition;
|
|
}
|
|
function normalizeBody(body, contentType) {
|
|
if (body === undefined) {
|
|
// zero-length body
|
|
return new Uint8Array([]);
|
|
}
|
|
// binary and primitives should go straight on the wire regardless of content type
|
|
if (isBinaryBody(body)) {
|
|
return body;
|
|
}
|
|
if (typeof body === "string" || typeof body === "number" || typeof body === "boolean") {
|
|
return stringToUint8Array(String(body), "utf-8");
|
|
}
|
|
// stringify objects for JSON-ish content types e.g. application/json, application/merge-patch+json, application/vnd.oci.manifest.v1+json, application.json; charset=UTF-8
|
|
if (contentType && /application\/(.+\+)?json(;.+)?/i.test(String(contentType))) {
|
|
return stringToUint8Array(JSON.stringify(body), "utf-8");
|
|
}
|
|
throw new RestError(`Unsupported body/content-type combination: ${body}, ${contentType}`);
|
|
}
|
|
function buildBodyPart(descriptor) {
|
|
const contentType = getPartContentType(descriptor);
|
|
const contentDisposition = getContentDisposition(descriptor);
|
|
const headers = createHttpHeaders(descriptor.headers ?? {});
|
|
if (contentType) {
|
|
headers.set("content-type", contentType);
|
|
}
|
|
if (contentDisposition) {
|
|
headers.set("content-disposition", contentDisposition);
|
|
}
|
|
const body = normalizeBody(descriptor.body, contentType);
|
|
return {
|
|
headers,
|
|
body,
|
|
};
|
|
}
|
|
function multipart_buildMultipartBody(parts) {
|
|
return { parts: parts.map(buildBodyPart) };
|
|
}
|
|
//# sourceMappingURL=multipart.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/client/sendRequest.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Helper function to send request used by the client
|
|
* @param method - method to use to send the request
|
|
* @param url - url to send the request to
|
|
* @param pipeline - pipeline with the policies to run when sending the request
|
|
* @param options - request options
|
|
* @param customHttpClient - a custom HttpClient to use when making the request
|
|
* @returns returns and HttpResponse
|
|
*/
|
|
async function sendRequest_sendRequest(method, url, pipeline, options = {}, customHttpClient) {
|
|
const httpClient = customHttpClient ?? getCachedDefaultHttpsClient();
|
|
const request = buildPipelineRequest(method, url, options);
|
|
try {
|
|
const response = await pipeline.sendRequest(httpClient, request);
|
|
const headers = response.headers.toJSON();
|
|
const stream = response.readableStreamBody ?? response.browserStreamBody;
|
|
const parsedBody = options.responseAsStream || stream !== undefined ? undefined : getResponseBody(response);
|
|
const body = stream ?? parsedBody;
|
|
if (options?.onResponse) {
|
|
options.onResponse({ ...response, request, rawHeaders: headers, parsedBody });
|
|
}
|
|
return {
|
|
request,
|
|
headers,
|
|
status: `${response.status}`,
|
|
body,
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (isRestError(e) && e.response && options.onResponse) {
|
|
const { response } = e;
|
|
const rawHeaders = response.headers.toJSON();
|
|
// UNBRANDED DIFFERENCE: onResponse callback does not have a second __legacyError property
|
|
options?.onResponse({ ...response, request, rawHeaders }, e);
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
/**
|
|
* Function to determine the request content type
|
|
* @param options - request options InternalRequestParameters
|
|
* @returns returns the content-type
|
|
*/
|
|
function getRequestContentType(options = {}) {
|
|
if (options.contentType) {
|
|
return options.contentType;
|
|
}
|
|
const headerContentType = options.headers?.["content-type"];
|
|
if (typeof headerContentType === "string") {
|
|
return headerContentType;
|
|
}
|
|
return getContentType(options.body);
|
|
}
|
|
/**
|
|
* Function to determine the content-type of a body
|
|
* this is used if an explicit content-type is not provided
|
|
* @param body - body in the request
|
|
* @returns returns the content-type
|
|
*/
|
|
function getContentType(body) {
|
|
if (body === undefined) {
|
|
return undefined;
|
|
}
|
|
if (ArrayBuffer.isView(body)) {
|
|
return "application/octet-stream";
|
|
}
|
|
if (isBlob(body) && body.type) {
|
|
return body.type;
|
|
}
|
|
if (typeof body === "string") {
|
|
try {
|
|
JSON.parse(body);
|
|
return "application/json";
|
|
}
|
|
catch (error) {
|
|
// If we fail to parse the body, it is not json
|
|
return undefined;
|
|
}
|
|
}
|
|
// By default return json
|
|
return "application/json";
|
|
}
|
|
function buildPipelineRequest(method, url, options = {}) {
|
|
const requestContentType = getRequestContentType(options);
|
|
const { body, multipartBody } = getRequestBody(options.body, requestContentType);
|
|
const headers = createHttpHeaders({
|
|
...(options.headers ? options.headers : {}),
|
|
accept: options.accept ?? options.headers?.accept ?? "application/json",
|
|
...(requestContentType && {
|
|
"content-type": requestContentType,
|
|
}),
|
|
});
|
|
const { allowInsecureConnection, abortSignal, onUploadProgress, onDownloadProgress, timeout, responseAsStream, url: _url, method: _method, body: _body, multipartBody: _multiBody, headers: _headers, ...rest } = options;
|
|
const request = createPipelineRequest({
|
|
url,
|
|
method,
|
|
body,
|
|
multipartBody,
|
|
headers,
|
|
allowInsecureConnection,
|
|
abortSignal,
|
|
onUploadProgress,
|
|
onDownloadProgress,
|
|
timeout,
|
|
enableBrowserStreams: true,
|
|
streamResponseStatusCodes: responseAsStream ? new Set([Number.POSITIVE_INFINITY]) : undefined,
|
|
});
|
|
Object.assign(request, rest);
|
|
return request;
|
|
}
|
|
/**
|
|
* Prepares the body before sending the request
|
|
*/
|
|
function getRequestBody(body, contentType = "") {
|
|
if (body === undefined) {
|
|
return { body: undefined };
|
|
}
|
|
if (typeof FormData !== "undefined" && body instanceof FormData) {
|
|
return { body };
|
|
}
|
|
if (isBlob(body)) {
|
|
return { body };
|
|
}
|
|
if (isReadableStream(body)) {
|
|
return { body };
|
|
}
|
|
if (typeof body === "function") {
|
|
return { body: body };
|
|
}
|
|
if (ArrayBuffer.isView(body)) {
|
|
return {
|
|
body: body instanceof Uint8Array ? body : JSON.stringify(body),
|
|
};
|
|
}
|
|
const firstType = contentType.split(";")[0];
|
|
switch (firstType) {
|
|
case "application/json":
|
|
return { body: JSON.stringify(body) };
|
|
case "multipart/form-data":
|
|
if (Array.isArray(body)) {
|
|
return { multipartBody: buildMultipartBody(body) };
|
|
}
|
|
return { body: JSON.stringify(body) };
|
|
case "text/plain":
|
|
return { body: String(body) };
|
|
default:
|
|
if (typeof body === "string") {
|
|
return { body };
|
|
}
|
|
return { body: JSON.stringify(body) };
|
|
}
|
|
}
|
|
/**
|
|
* Prepares the response body
|
|
*/
|
|
function getResponseBody(response) {
|
|
// Set the default response type
|
|
const contentType = response.headers.get("content-type") ?? "";
|
|
const firstType = contentType.split(";")[0];
|
|
const bodyToParse = response.bodyAsText ?? "";
|
|
if (firstType === "text/plain") {
|
|
return String(bodyToParse);
|
|
}
|
|
// Default to "application/json" and fallback to string;
|
|
try {
|
|
return bodyToParse ? JSON.parse(bodyToParse) : undefined;
|
|
}
|
|
catch (error) {
|
|
// If we were supposed to get a JSON object and failed to
|
|
// parse, throw a parse error
|
|
if (firstType === "application/json") {
|
|
throw createParseError(response, error);
|
|
}
|
|
// We are not sure how to handle the response so we return it as
|
|
// plain text.
|
|
return String(bodyToParse);
|
|
}
|
|
}
|
|
function createParseError(response, err) {
|
|
const msg = `Error "${err}" occurred while parsing the response body - ${response.bodyAsText}.`;
|
|
const errCode = err.code ?? RestError.PARSE_ERROR;
|
|
return new RestError(msg, {
|
|
code: errCode,
|
|
statusCode: response.status,
|
|
request: response.request,
|
|
response: response,
|
|
});
|
|
}
|
|
//# sourceMappingURL=sendRequest.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/client/getClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Creates a client with a default pipeline
|
|
* @param endpoint - Base endpoint for the client
|
|
* @param credentials - Credentials to authenticate the requests
|
|
* @param options - Client options
|
|
*/
|
|
function getClient(endpoint, clientOptions = {}) {
|
|
const pipeline = clientOptions.pipeline ?? createDefaultPipeline(clientOptions);
|
|
if (clientOptions.additionalPolicies?.length) {
|
|
for (const { policy, position } of clientOptions.additionalPolicies) {
|
|
// Sign happens after Retry and is commonly needed to occur
|
|
// before policies that intercept post-retry.
|
|
const afterPhase = position === "perRetry" ? "Sign" : undefined;
|
|
pipeline.addPolicy(policy, {
|
|
afterPhase,
|
|
});
|
|
}
|
|
}
|
|
const { allowInsecureConnection, httpClient } = clientOptions;
|
|
const endpointUrl = clientOptions.endpoint ?? endpoint;
|
|
const client = (path, ...args) => {
|
|
const getUrl = (requestOptions) => buildRequestUrl(endpointUrl, path, args, { allowInsecureConnection, ...requestOptions });
|
|
return {
|
|
get: (requestOptions = {}) => {
|
|
return buildOperation("GET", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
post: (requestOptions = {}) => {
|
|
return buildOperation("POST", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
put: (requestOptions = {}) => {
|
|
return buildOperation("PUT", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
patch: (requestOptions = {}) => {
|
|
return buildOperation("PATCH", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
delete: (requestOptions = {}) => {
|
|
return buildOperation("DELETE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
head: (requestOptions = {}) => {
|
|
return buildOperation("HEAD", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
options: (requestOptions = {}) => {
|
|
return buildOperation("OPTIONS", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
trace: (requestOptions = {}) => {
|
|
return buildOperation("TRACE", getUrl(requestOptions), pipeline, requestOptions, allowInsecureConnection, httpClient);
|
|
},
|
|
};
|
|
};
|
|
return {
|
|
path: client,
|
|
pathUnchecked: client,
|
|
pipeline,
|
|
};
|
|
}
|
|
function buildOperation(method, url, pipeline, options, allowInsecureConnection, httpClient) {
|
|
allowInsecureConnection = options.allowInsecureConnection ?? allowInsecureConnection;
|
|
return {
|
|
then: function (onFulfilled, onrejected) {
|
|
return sendRequest(method, url, pipeline, { ...options, allowInsecureConnection }, httpClient).then(onFulfilled, onrejected);
|
|
},
|
|
async asBrowserStream() {
|
|
if (isNodeLike) {
|
|
throw new Error("`asBrowserStream` is supported only in the browser environment. Use `asNodeStream` instead to obtain the response body stream. If you require a Web stream of the response in Node, consider using `Readable.toWeb` on the result of `asNodeStream`.");
|
|
}
|
|
else {
|
|
return sendRequest(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
|
|
}
|
|
},
|
|
async asNodeStream() {
|
|
if (isNodeLike) {
|
|
return sendRequest(method, url, pipeline, { ...options, allowInsecureConnection, responseAsStream: true }, httpClient);
|
|
}
|
|
else {
|
|
throw new Error("`isNodeStream` is not supported in the browser environment. Use `asBrowserStream` to obtain the response body stream.");
|
|
}
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=getClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/client/restError.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
function createRestError(messageOrResponse, response) {
|
|
const resp = typeof messageOrResponse === "string" ? response : messageOrResponse;
|
|
const internalError = resp.body?.error ?? resp.body;
|
|
const message = typeof messageOrResponse === "string"
|
|
? messageOrResponse
|
|
: (internalError?.message ?? `Unexpected status code: ${resp.status}`);
|
|
return new RestError(message, {
|
|
statusCode: statusCodeToNumber(resp.status),
|
|
code: internalError?.code,
|
|
request: resp.request,
|
|
response: toPipelineResponse(resp),
|
|
});
|
|
}
|
|
function toPipelineResponse(errorResponse) {
|
|
return {
|
|
headers: createHttpHeaders(errorResponse.headers),
|
|
request: errorResponse.request,
|
|
status: statusCodeToNumber(errorResponse.status) ?? -1,
|
|
...(typeof errorResponse.body === "string" ? { bodyAsText: errorResponse.body } : {}),
|
|
};
|
|
}
|
|
function statusCodeToNumber(statusCode) {
|
|
const status = Number.parseInt(statusCode);
|
|
return Number.isNaN(status) ? undefined : status;
|
|
}
|
|
//# sourceMappingURL=restError.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/pipeline.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Creates a totally empty pipeline.
|
|
* Useful for testing or creating a custom one.
|
|
*/
|
|
function esm_pipeline_createEmptyPipeline() {
|
|
return pipeline_createEmptyPipeline();
|
|
}
|
|
//# sourceMappingURL=pipeline.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/logger/internal.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
//# sourceMappingURL=internal.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/logger/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const esm_context = createLoggerContext({
|
|
logLevelEnvVarName: "AZURE_LOG_LEVEL",
|
|
namespace: "azure",
|
|
});
|
|
/**
|
|
* The AzureLogger provides a mechanism for overriding where logs are output to.
|
|
* By default, logs are sent to stderr.
|
|
* Override the `log` method to redirect logs to another location.
|
|
*/
|
|
const AzureLogger = esm_context.logger;
|
|
/**
|
|
* Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
|
|
* @param level - The log level to enable for logging.
|
|
* Options from most verbose to least verbose are:
|
|
* - verbose
|
|
* - info
|
|
* - warning
|
|
* - error
|
|
*/
|
|
function esm_setLogLevel(level) {
|
|
esm_context.setLogLevel(level);
|
|
}
|
|
/**
|
|
* Retrieves the currently specified log level.
|
|
*/
|
|
function esm_getLogLevel() {
|
|
return esm_context.getLogLevel();
|
|
}
|
|
/**
|
|
* Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.
|
|
* @param namespace - The name of the SDK package.
|
|
* @hidden
|
|
*/
|
|
function esm_createClientLogger(namespace) {
|
|
return esm_context.createClientLogger(namespace);
|
|
}
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const esm_log_logger = esm_createClientLogger("core-rest-pipeline");
|
|
//# sourceMappingURL=log.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/agentPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Name of the Agent Policy
|
|
*/
|
|
const agentPolicyName = "agentPolicy";
|
|
/**
|
|
* Gets a pipeline policy that sets http.agent
|
|
*/
|
|
function agentPolicy_agentPolicy(agent) {
|
|
return {
|
|
name: agentPolicyName,
|
|
sendRequest: async (req, next) => {
|
|
// Users may define an agent on the request, honor it over the client level one
|
|
if (!req.agent) {
|
|
req.agent = agent;
|
|
}
|
|
return next(req);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=agentPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/decompressResponsePolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The programmatic identifier of the decompressResponsePolicy.
|
|
*/
|
|
const decompressResponsePolicyName = "decompressResponsePolicy";
|
|
/**
|
|
* A policy to enable response decompression according to Accept-Encoding header
|
|
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
|
|
*/
|
|
function decompressResponsePolicy_decompressResponsePolicy() {
|
|
return {
|
|
name: decompressResponsePolicyName,
|
|
async sendRequest(request, next) {
|
|
// HEAD requests have no body
|
|
if (request.method !== "HEAD") {
|
|
request.headers.set("Accept-Encoding", "gzip,deflate");
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=decompressResponsePolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/exponentialRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the exponentialRetryPolicy.
|
|
*/
|
|
const exponentialRetryPolicyName = "exponentialRetryPolicy";
|
|
/**
|
|
* A policy that attempts to retry requests while introducing an exponentially increasing delay.
|
|
* @param options - Options that configure retry logic.
|
|
*/
|
|
function exponentialRetryPolicy(options = {}) {
|
|
return retryPolicy([
|
|
exponentialRetryStrategy({
|
|
...options,
|
|
ignoreSystemErrors: true,
|
|
}),
|
|
], {
|
|
maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY_COUNT,
|
|
});
|
|
}
|
|
//# sourceMappingURL=exponentialRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/systemErrorRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* Name of the {@link systemErrorRetryPolicy}
|
|
*/
|
|
const systemErrorRetryPolicyName = "systemErrorRetryPolicy";
|
|
/**
|
|
* A retry policy that specifically seeks to handle errors in the
|
|
* underlying transport layer (e.g. DNS lookup failures) rather than
|
|
* retryable error codes from the server itself.
|
|
* @param options - Options that customize the policy.
|
|
*/
|
|
function systemErrorRetryPolicy(options = {}) {
|
|
return {
|
|
name: systemErrorRetryPolicyName,
|
|
sendRequest: retryPolicy([
|
|
exponentialRetryStrategy({
|
|
...options,
|
|
ignoreHttpStatusCodes: true,
|
|
}),
|
|
], {
|
|
maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY_COUNT,
|
|
}).sendRequest,
|
|
};
|
|
}
|
|
//# sourceMappingURL=systemErrorRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/throttlingRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* Name of the {@link throttlingRetryPolicy}
|
|
*/
|
|
const throttlingRetryPolicyName = "throttlingRetryPolicy";
|
|
/**
|
|
* A policy that retries when the server sends a 429 response with a Retry-After header.
|
|
*
|
|
* To learn more, please refer to
|
|
* https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
|
|
* https://learn.microsoft.com/azure/azure-subscription-service-limits and
|
|
* https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
|
|
*
|
|
* @param options - Options that configure retry logic.
|
|
*/
|
|
function throttlingRetryPolicy(options = {}) {
|
|
return {
|
|
name: throttlingRetryPolicyName,
|
|
sendRequest: retryPolicy([throttlingRetryStrategy()], {
|
|
maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY_COUNT,
|
|
}).sendRequest,
|
|
};
|
|
}
|
|
//# sourceMappingURL=throttlingRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/tlsPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Name of the TLS Policy
|
|
*/
|
|
const tlsPolicyName = "tlsPolicy";
|
|
/**
|
|
* Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
|
|
*/
|
|
function tlsPolicy_tlsPolicy(tlsSettings) {
|
|
return {
|
|
name: tlsPolicyName,
|
|
sendRequest: async (req, next) => {
|
|
// Users may define a request tlsSettings, honor those over the client level one
|
|
if (!req.tlsSettings) {
|
|
req.tlsSettings = tlsSettings;
|
|
}
|
|
return next(req);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=tlsPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/internal.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=internal.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/logPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the logPolicy.
|
|
*/
|
|
const logPolicy_logPolicyName = (/* unused pure expression or super */ null && (tspLogPolicyName));
|
|
/**
|
|
* A policy that logs all requests and responses.
|
|
* @param options - Options to configure logPolicy.
|
|
*/
|
|
function policies_logPolicy_logPolicy(options = {}) {
|
|
return logPolicy_logPolicy({
|
|
logger: esm_log_logger.info,
|
|
...options,
|
|
});
|
|
}
|
|
//# sourceMappingURL=logPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/redirectPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the redirectPolicy.
|
|
*/
|
|
const redirectPolicy_redirectPolicyName = redirectPolicyName;
|
|
/**
|
|
* A policy to follow Location headers from the server in order
|
|
* to support server-side redirection.
|
|
* In the browser, this policy is not used.
|
|
* @param options - Options to control policy behavior.
|
|
*/
|
|
function policies_redirectPolicy_redirectPolicy(options = {}) {
|
|
return redirectPolicy_redirectPolicy(options);
|
|
}
|
|
//# sourceMappingURL=redirectPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/userAgentPlatform.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
function userAgentPlatform_getHeaderName() {
|
|
return "User-Agent";
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
async function util_userAgentPlatform_setPlatformSpecificData(map) {
|
|
if (external_node_process_ && external_node_process_.versions) {
|
|
const osInfo = `${external_node_os_.type()} ${external_node_os_.release()}; ${external_node_os_.arch()}`;
|
|
if (external_node_process_.versions.bun) {
|
|
map.set("Bun", `${external_node_process_.versions.bun} (${osInfo})`);
|
|
}
|
|
else if (external_node_process_.versions.deno) {
|
|
map.set("Deno", `${external_node_process_.versions.deno} (${osInfo})`);
|
|
}
|
|
else if (external_node_process_.versions.node) {
|
|
map.set("Node", `${external_node_process_.versions.node} (${osInfo})`);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=userAgentPlatform.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/constants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const esm_constants_SDK_VERSION = "1.25.0";
|
|
const esm_constants_DEFAULT_RETRY_POLICY_COUNT = 3;
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/userAgent.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
function userAgent_getUserAgentString(telemetryInfo) {
|
|
const parts = [];
|
|
for (const [key, value] of telemetryInfo) {
|
|
const token = value ? `${key}/${value}` : key;
|
|
parts.push(token);
|
|
}
|
|
return parts.join(" ");
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
function userAgent_getUserAgentHeaderName() {
|
|
return userAgentPlatform_getHeaderName();
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
async function util_userAgent_getUserAgentValue(prefix) {
|
|
const runtimeInfo = new Map();
|
|
runtimeInfo.set("core-rest-pipeline", esm_constants_SDK_VERSION);
|
|
await util_userAgentPlatform_setPlatformSpecificData(runtimeInfo);
|
|
const defaultAgent = userAgent_getUserAgentString(runtimeInfo);
|
|
const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
|
|
return userAgentValue;
|
|
}
|
|
//# sourceMappingURL=userAgent.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/userAgentPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const userAgentPolicy_UserAgentHeaderName = userAgent_getUserAgentHeaderName();
|
|
/**
|
|
* The programmatic identifier of the userAgentPolicy.
|
|
*/
|
|
const userAgentPolicy_userAgentPolicyName = "userAgentPolicy";
|
|
/**
|
|
* A policy that sets the User-Agent header (or equivalent) to reflect
|
|
* the library version.
|
|
* @param options - Options to customize the user agent value.
|
|
*/
|
|
function policies_userAgentPolicy_userAgentPolicy(options = {}) {
|
|
const userAgentValue = util_userAgent_getUserAgentValue(options.userAgentPrefix);
|
|
return {
|
|
name: userAgentPolicy_userAgentPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.headers.has(userAgentPolicy_UserAgentHeaderName)) {
|
|
request.headers.set(userAgentPolicy_UserAgentHeaderName, await userAgentValue);
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=userAgentPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/createFile.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Create an object that implements the File interface. This object is intended to be
|
|
* passed into RequestBodyType.formData, and is not guaranteed to work as expected in
|
|
* other situations.
|
|
*
|
|
* Use this function to create a File object for use in RequestBodyType.formData in environments
|
|
* where the global File object is unavailable.
|
|
*
|
|
* @param content - the content of the file as a Uint8Array in memory.
|
|
* @param name - the name of the file.
|
|
* @param options - optional metadata about the file, e.g. file name, file size, MIME type.
|
|
*/
|
|
function createFile(content, name, options = {}) {
|
|
return createRawFile(content, name, options);
|
|
}
|
|
//# sourceMappingURL=createFile.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/file.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
function file_isNodeReadableStream(x) {
|
|
return typeof x === "object" && x !== null && "pipe" in x && typeof x.pipe === "function";
|
|
}
|
|
const unimplementedMethods = {
|
|
arrayBuffer: () => {
|
|
throw new Error("Not implemented");
|
|
},
|
|
bytes: () => {
|
|
throw new Error("Not implemented");
|
|
},
|
|
slice: () => {
|
|
throw new Error("Not implemented");
|
|
},
|
|
text: () => {
|
|
throw new Error("Not implemented");
|
|
},
|
|
};
|
|
/**
|
|
* Private symbol used as key on objects created using createFile containing the
|
|
* original source of the file object.
|
|
*
|
|
* This is used in Node to access the original Node stream without using Blob#stream, which
|
|
* returns a web stream. This is done to avoid a couple of bugs to do with Blob#stream and
|
|
* Readable#to/fromWeb in Node versions we support:
|
|
* - https://github.com/nodejs/node/issues/42694 (fixed in Node 18.14)
|
|
* - https://github.com/nodejs/node/issues/48916 (fixed in Node 20.6)
|
|
*
|
|
* Once these versions are no longer supported, we may be able to stop doing this.
|
|
*
|
|
* @internal
|
|
*/
|
|
const rawContent = Symbol("rawContent");
|
|
/**
|
|
* Type guard to check if a given object is a blob-like object with a raw content property.
|
|
*/
|
|
function hasRawContent(x) {
|
|
return typeof x[rawContent] === "function";
|
|
}
|
|
/**
|
|
* Extract the raw content from a given blob-like object. If the input was created using createFile
|
|
* or createFileFromStream, the exact content passed into createFile/createFileFromStream will be used.
|
|
* For true instances of Blob and File, returns the actual blob.
|
|
*
|
|
* @internal
|
|
*/
|
|
function getRawContent(blob) {
|
|
if (hasRawContent(blob)) {
|
|
return blob[rawContent]();
|
|
}
|
|
else {
|
|
return blob;
|
|
}
|
|
}
|
|
/**
|
|
* @internal
|
|
*
|
|
* Creates a File-like object tagged with rawContent for efficient streaming access.
|
|
* Used by the Node createFile to avoid Blob#stream() bugs.
|
|
*/
|
|
function file_createRawFile(content, name, options = {}) {
|
|
return {
|
|
...unimplementedMethods,
|
|
type: options.type ?? "",
|
|
lastModified: options.lastModified ?? new Date().getTime(),
|
|
webkitRelativePath: options.webkitRelativePath ?? "",
|
|
size: content.byteLength,
|
|
name,
|
|
arrayBuffer: async () => toArrayBuffer(content).buffer,
|
|
stream: () => new Blob([toArrayBuffer(content)]).stream(),
|
|
[rawContent]: () => content,
|
|
};
|
|
}
|
|
/**
|
|
* Create an object that implements the File interface. This object is intended to be
|
|
* passed into RequestBodyType.formData, and is not guaranteed to work as expected in
|
|
* other situations.
|
|
*
|
|
* Use this function to:
|
|
* - Create a File object for use in RequestBodyType.formData in environments where the
|
|
* global File object is unavailable.
|
|
* - Create a File-like object from a readable stream without reading the stream into memory.
|
|
*
|
|
* @param stream - the content of the file as a callback returning a stream. When a File object made using createFile is
|
|
* passed in a request's form data map, the stream will not be read into memory
|
|
* and instead will be streamed when the request is made. In the event of a retry, the
|
|
* stream needs to be read again, so this callback SHOULD return a fresh stream if possible.
|
|
* @param name - the name of the file.
|
|
* @param options - optional metadata about the file, e.g. file name, file size, MIME type.
|
|
*/
|
|
function createFileFromStream(stream, name, options = {}) {
|
|
return {
|
|
...unimplementedMethods,
|
|
type: options.type ?? "",
|
|
lastModified: options.lastModified ?? new Date().getTime(),
|
|
webkitRelativePath: options.webkitRelativePath ?? "",
|
|
size: options.size ?? -1,
|
|
name,
|
|
stream: () => {
|
|
const s = stream();
|
|
if (file_isNodeReadableStream(s)) {
|
|
throw new Error("Not supported: a Node stream was provided as input to createFileFromStream.");
|
|
}
|
|
return s;
|
|
},
|
|
[rawContent]: stream,
|
|
};
|
|
}
|
|
|
|
function hasArrayBuffer(source) {
|
|
return "resize" in source.buffer;
|
|
}
|
|
function toArrayBuffer(source) {
|
|
if (hasArrayBuffer(source)) {
|
|
// ArrayBuffer — return a copy if the view is a subarray of a larger buffer
|
|
if (source.byteOffset !== 0 || source.byteLength !== source.buffer.byteLength) {
|
|
return new Uint8Array(source);
|
|
}
|
|
return source;
|
|
}
|
|
// SharedArrayBuffer
|
|
return source.map((x) => x);
|
|
}
|
|
//# sourceMappingURL=file.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/multipartPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Name of multipart policy
|
|
*/
|
|
const policies_multipartPolicy_multipartPolicyName = multipartPolicy_multipartPolicyName;
|
|
/**
|
|
* Pipeline policy for multipart requests
|
|
*/
|
|
function policies_multipartPolicy_multipartPolicy() {
|
|
const tspPolicy = multipartPolicy_multipartPolicy();
|
|
return {
|
|
name: policies_multipartPolicy_multipartPolicyName,
|
|
sendRequest: async (request, next) => {
|
|
if (request.multipartBody) {
|
|
for (const part of request.multipartBody.parts) {
|
|
if (hasRawContent(part.body)) {
|
|
part.body = getRawContent(part.body);
|
|
}
|
|
}
|
|
}
|
|
return tspPolicy.sendRequest(request, next);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=multipartPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/decompressResponsePolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the decompressResponsePolicy.
|
|
*/
|
|
const decompressResponsePolicy_decompressResponsePolicyName = decompressResponsePolicyName;
|
|
/**
|
|
* A policy to enable response decompression according to Accept-Encoding header
|
|
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
|
|
*/
|
|
function policies_decompressResponsePolicy_decompressResponsePolicy() {
|
|
return decompressResponsePolicy_decompressResponsePolicy();
|
|
}
|
|
//# sourceMappingURL=decompressResponsePolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/defaultRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the {@link defaultRetryPolicy}
|
|
*/
|
|
const defaultRetryPolicy_defaultRetryPolicyName = (/* unused pure expression or super */ null && (tspDefaultRetryPolicyName));
|
|
/**
|
|
* A policy that retries according to three strategies:
|
|
* - When the server sends a 429 response with a Retry-After header.
|
|
* - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
|
|
* - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
|
|
*/
|
|
function policies_defaultRetryPolicy_defaultRetryPolicy(options = {}) {
|
|
return defaultRetryPolicy_defaultRetryPolicy(options);
|
|
}
|
|
//# sourceMappingURL=defaultRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/formDataPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the formDataPolicy.
|
|
*/
|
|
const formDataPolicy_formDataPolicyName = (/* unused pure expression or super */ null && (tspFormDataPolicyName));
|
|
/**
|
|
* A policy that encodes FormData on the request into the body.
|
|
*/
|
|
function policies_formDataPolicy_formDataPolicy() {
|
|
return formDataPolicy_formDataPolicy();
|
|
}
|
|
//# sourceMappingURL=formDataPolicy.js.map
|
|
// EXTERNAL MODULE: external "node:crypto"
|
|
var external_node_crypto_ = __webpack_require__(7598);
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/sha256.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Generates a SHA-256 HMAC signature.
|
|
* @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
|
|
* @param stringToSign - The data to be signed.
|
|
* @param encoding - The textual encoding to use for the returned HMAC digest.
|
|
*/
|
|
async function computeSha256Hmac(key, stringToSign, encoding) {
|
|
const decodedKey = Buffer.from(key, "base64");
|
|
return createHmac("sha256", decodedKey).update(stringToSign).digest(encoding);
|
|
}
|
|
/**
|
|
* Generates a SHA-256 hash.
|
|
* @param content - The data to be included in the hash.
|
|
* @param encoding - The textual encoding to use for the returned hash.
|
|
*/
|
|
async function computeSha256Hash(content, encoding) {
|
|
return createHash("sha256").update(content).digest(encoding);
|
|
}
|
|
//# sourceMappingURL=sha256.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/internal.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=internal.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist/esm/AbortError.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* This error is thrown when an asynchronous operation has been aborted.
|
|
* Check for this error by testing the `name` that the name property of the
|
|
* error matches `"AbortError"`.
|
|
*
|
|
* @example
|
|
* ```ts snippet:AbortErrorSample
|
|
* import { AbortError } from "@azure/abort-controller";
|
|
*
|
|
* async function doAsyncWork(options: { abortSignal: AbortSignal }): Promise<void> {
|
|
* if (options.abortSignal.aborted) {
|
|
* throw new AbortError();
|
|
* }
|
|
*
|
|
* // do async work
|
|
* }
|
|
*
|
|
* const controller = new AbortController();
|
|
* controller.abort();
|
|
* try {
|
|
* doAsyncWork({ abortSignal: controller.signal });
|
|
* } catch (e) {
|
|
* if (e instanceof Error && e.name === "AbortError") {
|
|
* // handle abort error here.
|
|
* }
|
|
* }
|
|
* ```
|
|
*/
|
|
class AbortError_AbortError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "AbortError";
|
|
}
|
|
}
|
|
//# sourceMappingURL=AbortError.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/createAbortablePromise.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Creates an abortable promise.
|
|
* @param buildPromise - A function that takes the resolve and reject functions as parameters.
|
|
* @param options - The options for the abortable promise.
|
|
* @returns A promise that can be aborted.
|
|
*/
|
|
function createAbortablePromise(buildPromise, options) {
|
|
const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options ?? {};
|
|
return new Promise((resolve, reject) => {
|
|
function rejectOnAbort() {
|
|
reject(new AbortError_AbortError(abortErrorMsg ?? "The operation was aborted."));
|
|
}
|
|
function removeListeners() {
|
|
abortSignal?.removeEventListener("abort", onAbort);
|
|
}
|
|
function onAbort() {
|
|
cleanupBeforeAbort?.();
|
|
removeListeners();
|
|
rejectOnAbort();
|
|
}
|
|
if (abortSignal?.aborted) {
|
|
return rejectOnAbort();
|
|
}
|
|
try {
|
|
buildPromise((x) => {
|
|
removeListeners();
|
|
resolve(x);
|
|
}, (x) => {
|
|
removeListeners();
|
|
reject(x);
|
|
});
|
|
}
|
|
catch (err) {
|
|
reject(err);
|
|
}
|
|
abortSignal?.addEventListener("abort", onAbort);
|
|
});
|
|
}
|
|
//# sourceMappingURL=createAbortablePromise.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/delay.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const delay_StandardAbortMessage = "The delay was aborted.";
|
|
/**
|
|
* A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.
|
|
* @param timeInMs - The number of milliseconds to be delayed.
|
|
* @param options - The options for delay - currently abort options
|
|
* @returns Promise that is resolved after timeInMs
|
|
*/
|
|
function delay_delay(timeInMs, options) {
|
|
let token;
|
|
const { abortSignal, abortErrorMsg } = options ?? {};
|
|
return createAbortablePromise((resolve) => {
|
|
token = setTimeout(resolve, timeInMs);
|
|
}, {
|
|
cleanupBeforeAbort: () => clearTimeout(token),
|
|
abortSignal,
|
|
abortErrorMsg: abortErrorMsg ?? delay_StandardAbortMessage,
|
|
});
|
|
}
|
|
//# sourceMappingURL=delay.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/error.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Given what is thought to be an error object, return the message if possible.
|
|
* If the message is missing, returns a stringified version of the input.
|
|
* @param e - Something thrown from a try block
|
|
* @returns The error message or a string of the input
|
|
*/
|
|
function getErrorMessage(e) {
|
|
if (isError(e)) {
|
|
return e.message;
|
|
}
|
|
else {
|
|
let stringified;
|
|
try {
|
|
if (typeof e === "object" && e) {
|
|
stringified = JSON.stringify(e);
|
|
}
|
|
else {
|
|
stringified = String(e);
|
|
}
|
|
}
|
|
catch (err) {
|
|
stringified = "[unable to stringify input]";
|
|
}
|
|
return `Unknown error ${stringified}`;
|
|
}
|
|
}
|
|
//# sourceMappingURL=error.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Calculates the delay interval for retry attempts using exponential delay with jitter.
|
|
*
|
|
* @param retryAttempt - The current retry attempt number.
|
|
*
|
|
* @param config - The exponential retry configuration.
|
|
*
|
|
* @returns An object containing the calculated retry delay.
|
|
*/
|
|
function esm_calculateRetryDelay(retryAttempt, config) {
|
|
return tspRuntime.calculateRetryDelay(retryAttempt, config);
|
|
}
|
|
/**
|
|
* Generates a SHA-256 hash.
|
|
*
|
|
* @param content - The data to be included in the hash.
|
|
*
|
|
* @param encoding - The textual encoding to use for the returned hash.
|
|
*/
|
|
function esm_computeSha256Hash(content, encoding) {
|
|
return tspRuntime.computeSha256Hash(content, encoding);
|
|
}
|
|
/**
|
|
* Generates a SHA-256 HMAC signature.
|
|
*
|
|
* @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
|
|
*
|
|
* @param stringToSign - The data to be signed.
|
|
*
|
|
* @param encoding - The textual encoding to use for the returned HMAC digest.
|
|
*/
|
|
function esm_computeSha256Hmac(key, stringToSign, encoding) {
|
|
return tspRuntime.computeSha256Hmac(key, stringToSign, encoding);
|
|
}
|
|
/**
|
|
* Returns a random integer value between a lower and upper bound, inclusive of both bounds. Note that this uses Math.random and isn't secure. If you need to use this for any kind of security purpose, find a better source of random.
|
|
*
|
|
* @param min - The smallest integer value allowed.
|
|
*
|
|
* @param max - The largest integer value allowed.
|
|
*/
|
|
function esm_getRandomIntegerInclusive(min, max) {
|
|
return tspRuntime.getRandomIntegerInclusive(min, max);
|
|
}
|
|
/**
|
|
* Typeguard for an error object shape (has name and message)
|
|
*
|
|
* @param e - Something caught by a catch clause.
|
|
*/
|
|
function esm_isError(e) {
|
|
return isError(e);
|
|
}
|
|
/**
|
|
* Helper to determine when an input is a generic JS object.
|
|
*
|
|
* @returns true when input is an object type that is not null, Array, RegExp, or Date.
|
|
*/
|
|
function esm_isObject(input) {
|
|
return tspRuntime.isObject(input);
|
|
}
|
|
/**
|
|
* Generated Universally Unique Identifier
|
|
*
|
|
* @returns RFC4122 v4 UUID.
|
|
*/
|
|
function esm_randomUUID() {
|
|
return randomUUID();
|
|
}
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Web Browser.
|
|
*/
|
|
const esm_isBrowser = isBrowser;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Bun.sh.
|
|
*/
|
|
const esm_isBun = isBun;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Deno.
|
|
*/
|
|
const esm_isDeno = isDeno;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Node.js compatible environment.
|
|
*
|
|
* @deprecated
|
|
*
|
|
* Use `isNodeLike` instead.
|
|
*/
|
|
const isNode = env_isNodeLike;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Node.js compatible environment.
|
|
*/
|
|
const esm_isNodeLike = env_isNodeLike;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is Node.JS.
|
|
*/
|
|
const esm_isNodeRuntime = isNodeRuntime;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is in React-Native.
|
|
*/
|
|
const esm_isReactNative = isReactNative;
|
|
/**
|
|
* A constant that indicates whether the environment the code is running is a Web Worker.
|
|
*/
|
|
const esm_isWebWorker = isWebWorker;
|
|
/**
|
|
* The helper that transforms bytes with specific character encoding into string
|
|
* @param bytes - the uint8array bytes
|
|
* @param format - the format we use to encode the byte
|
|
* @returns a string of the encoded string
|
|
*/
|
|
function esm_uint8ArrayToString(bytes, format) {
|
|
return bytesEncoding_uint8ArrayToString(bytes, format);
|
|
}
|
|
/**
|
|
* The helper that transforms string to specific character encoded bytes array.
|
|
* @param value - the string to be converted
|
|
* @param format - the format we use to decode the value
|
|
* @returns a uint8array
|
|
*/
|
|
function esm_stringToUint8Array(value, format) {
|
|
return bytesEncoding_stringToUint8Array(value, format);
|
|
}
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/proxyPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the proxyPolicy.
|
|
*/
|
|
const proxyPolicy_proxyPolicyName = (/* unused pure expression or super */ null && (tspProxyPolicyName));
|
|
/**
|
|
* This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
|
|
* If no argument is given, it attempts to parse a proxy URL from the environment
|
|
* variables `HTTPS_PROXY` or `HTTP_PROXY`.
|
|
* @param proxyUrl - The url of the proxy to use. May contain authentication information.
|
|
* @deprecated - Internally this method is no longer necessary when setting proxy information.
|
|
*/
|
|
function proxyPolicy_getDefaultProxySettings(proxyUrl) {
|
|
return getDefaultProxySettings(proxyUrl);
|
|
}
|
|
/**
|
|
* A policy that allows one to apply proxy settings to all requests.
|
|
* If not passed static settings, they will be retrieved from the HTTPS_PROXY
|
|
* or HTTP_PROXY environment variables.
|
|
* @param proxySettings - ProxySettings to use on each request.
|
|
* @param options - additional settings, for example, custom NO_PROXY patterns
|
|
*/
|
|
function policies_proxyPolicy_proxyPolicy(proxySettings, options) {
|
|
return proxyPolicy_proxyPolicy(proxySettings, options);
|
|
}
|
|
//# sourceMappingURL=proxyPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/setClientRequestIdPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The programmatic identifier of the setClientRequestIdPolicy.
|
|
*/
|
|
const setClientRequestIdPolicyName = "setClientRequestIdPolicy";
|
|
/**
|
|
* Each PipelineRequest gets a unique id upon creation.
|
|
* This policy passes that unique id along via an HTTP header to enable better
|
|
* telemetry and tracing.
|
|
* @param requestIdHeaderName - The name of the header to pass the request ID to.
|
|
*/
|
|
function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
|
|
return {
|
|
name: setClientRequestIdPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.headers.has(requestIdHeaderName)) {
|
|
request.headers.set(requestIdHeaderName, request.requestId);
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=setClientRequestIdPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/agentPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the Agent Policy
|
|
*/
|
|
const agentPolicy_agentPolicyName = (/* unused pure expression or super */ null && (tspAgentPolicyName));
|
|
/**
|
|
* Gets a pipeline policy that sets http.agent
|
|
*/
|
|
function policies_agentPolicy_agentPolicy(agent) {
|
|
return agentPolicy_agentPolicy(agent);
|
|
}
|
|
//# sourceMappingURL=agentPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/tlsPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the TLS Policy
|
|
*/
|
|
const tlsPolicy_tlsPolicyName = (/* unused pure expression or super */ null && (tspTlsPolicyName));
|
|
/**
|
|
* Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
|
|
*/
|
|
function policies_tlsPolicy_tlsPolicy(tlsSettings) {
|
|
return tlsPolicy_tlsPolicy(tlsSettings);
|
|
}
|
|
//# sourceMappingURL=tlsPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/tracingContext.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/** @internal */
|
|
const knownContextKeys = {
|
|
span: Symbol.for("@azure/core-tracing span"),
|
|
namespace: Symbol.for("@azure/core-tracing namespace"),
|
|
};
|
|
/**
|
|
* Creates a new {@link TracingContext} with the given options.
|
|
* @param options - A set of known keys that may be set on the context.
|
|
* @returns A new {@link TracingContext} with the given options.
|
|
*
|
|
* @internal
|
|
*/
|
|
function createTracingContext(options = {}) {
|
|
let context = new TracingContextImpl(options.parentContext);
|
|
if (options.span) {
|
|
context = context.setValue(knownContextKeys.span, options.span);
|
|
}
|
|
if (options.namespace) {
|
|
context = context.setValue(knownContextKeys.namespace, options.namespace);
|
|
}
|
|
return context;
|
|
}
|
|
/** @internal */
|
|
class TracingContextImpl {
|
|
_contextMap;
|
|
constructor(initialContext) {
|
|
this._contextMap =
|
|
initialContext instanceof TracingContextImpl
|
|
? new Map(initialContext._contextMap)
|
|
: new Map();
|
|
}
|
|
setValue(key, value) {
|
|
const newContext = new TracingContextImpl(this);
|
|
newContext._contextMap.set(key, value);
|
|
return newContext;
|
|
}
|
|
getValue(key) {
|
|
return this._contextMap.get(key);
|
|
}
|
|
deleteValue(key) {
|
|
const newContext = new TracingContextImpl(this);
|
|
newContext._contextMap.delete(key);
|
|
return newContext;
|
|
}
|
|
}
|
|
//# sourceMappingURL=tracingContext.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@azure/core-tracing/dist/commonjs/state-cjs.js
|
|
var state_cjs = __webpack_require__(9437);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/state.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
// @ts-expect-error The recommended approach to sharing module state between ESM and CJS.
|
|
// See https://github.com/isaacs/tshy/blob/main/README.md#module-local-state for additional information.
|
|
|
|
/**
|
|
* Defines the shared state between CJS and ESM by re-exporting the CJS state.
|
|
*/
|
|
const state_state = state_cjs/* state */.w;
|
|
//# sourceMappingURL=state.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/instrumenter.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
function createDefaultTracingSpan() {
|
|
return {
|
|
end: () => {
|
|
// noop
|
|
},
|
|
isRecording: () => false,
|
|
recordException: () => {
|
|
// noop
|
|
},
|
|
setAttribute: () => {
|
|
// noop
|
|
},
|
|
setStatus: () => {
|
|
// noop
|
|
},
|
|
addEvent: () => {
|
|
// noop
|
|
},
|
|
};
|
|
}
|
|
function createDefaultInstrumenter() {
|
|
return {
|
|
createRequestHeaders: () => {
|
|
return {};
|
|
},
|
|
parseTraceparentHeader: () => {
|
|
return undefined;
|
|
},
|
|
startSpan: (_name, spanOptions) => {
|
|
return {
|
|
span: createDefaultTracingSpan(),
|
|
tracingContext: createTracingContext({ parentContext: spanOptions.tracingContext }),
|
|
};
|
|
},
|
|
withContext(_context, callback, ...callbackArgs) {
|
|
return callback(...callbackArgs);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Extends the Azure SDK with support for a given instrumenter implementation.
|
|
*
|
|
* @param instrumenter - The instrumenter implementation to use.
|
|
*/
|
|
function useInstrumenter(instrumenter) {
|
|
state.instrumenterImplementation = instrumenter;
|
|
}
|
|
/**
|
|
* Gets the currently set instrumenter, a No-Op instrumenter by default.
|
|
*
|
|
* @returns The currently set instrumenter
|
|
*/
|
|
function getInstrumenter() {
|
|
if (!state_state.instrumenterImplementation) {
|
|
state_state.instrumenterImplementation = createDefaultInstrumenter();
|
|
}
|
|
return state_state.instrumenterImplementation;
|
|
}
|
|
//# sourceMappingURL=instrumenter.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/tracingClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Creates a new tracing client.
|
|
*
|
|
* @param options - Options used to configure the tracing client.
|
|
* @returns - An instance of {@link TracingClient}.
|
|
*/
|
|
function createTracingClient(options) {
|
|
const { namespace, packageName, packageVersion } = options;
|
|
function startSpan(name, operationOptions, spanOptions) {
|
|
const startSpanResult = getInstrumenter().startSpan(name, {
|
|
...spanOptions,
|
|
packageName,
|
|
packageVersion,
|
|
tracingContext: operationOptions?.tracingOptions?.tracingContext,
|
|
});
|
|
let tracingContext = startSpanResult.tracingContext;
|
|
const span = startSpanResult.span;
|
|
if (!tracingContext.getValue(knownContextKeys.namespace)) {
|
|
tracingContext = tracingContext.setValue(knownContextKeys.namespace, namespace);
|
|
}
|
|
span.setAttribute("az.namespace", tracingContext.getValue(knownContextKeys.namespace));
|
|
const updatedOptions = Object.assign({}, operationOptions, {
|
|
tracingOptions: { ...operationOptions?.tracingOptions, tracingContext },
|
|
});
|
|
return {
|
|
span,
|
|
updatedOptions,
|
|
};
|
|
}
|
|
async function withSpan(name, operationOptions, callback, spanOptions) {
|
|
const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions);
|
|
try {
|
|
const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => callback(updatedOptions, span));
|
|
span.setStatus({ status: "success" });
|
|
return result;
|
|
}
|
|
catch (err) {
|
|
span.setStatus({ status: "error", error: err });
|
|
throw err;
|
|
}
|
|
finally {
|
|
span.end();
|
|
}
|
|
}
|
|
function withContext(context, callback, ...callbackArgs) {
|
|
return getInstrumenter().withContext(context, callback, ...callbackArgs);
|
|
}
|
|
/**
|
|
* Parses a traceparent header value into a span identifier.
|
|
*
|
|
* @param traceparentHeader - The traceparent header to parse.
|
|
* @returns An implementation-specific identifier for the span.
|
|
*/
|
|
function parseTraceparentHeader(traceparentHeader) {
|
|
return getInstrumenter().parseTraceparentHeader(traceparentHeader);
|
|
}
|
|
/**
|
|
* Creates a set of request headers to propagate tracing information to a backend.
|
|
*
|
|
* @param tracingContext - The context containing the span to serialize.
|
|
* @returns The set of headers to add to a request.
|
|
*/
|
|
function createRequestHeaders(tracingContext) {
|
|
return getInstrumenter().createRequestHeaders(tracingContext);
|
|
}
|
|
return {
|
|
startSpan,
|
|
withSpan,
|
|
withContext,
|
|
parseTraceparentHeader,
|
|
createRequestHeaders,
|
|
};
|
|
}
|
|
//# sourceMappingURL=tracingClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/restError.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* A custom error type for failed pipeline requests.
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
const esm_restError_RestError = restError_RestError;
|
|
/**
|
|
* Typeguard for RestError
|
|
* @param e - Something caught by a catch clause.
|
|
*/
|
|
function esm_restError_isRestError(e) {
|
|
return restError_isRestError(e);
|
|
}
|
|
//# sourceMappingURL=restError.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/tracingPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the tracingPolicy.
|
|
*/
|
|
const tracingPolicyName = "tracingPolicy";
|
|
/**
|
|
* A simple policy to create OpenTelemetry Spans for each request made by the pipeline
|
|
* that has SpanOptions with a parent.
|
|
* Requests made without a parent Span will not be recorded.
|
|
* @param options - Options to configure the telemetry logged by the tracing policy.
|
|
*/
|
|
function tracingPolicy(options = {}) {
|
|
const userAgentPromise = util_userAgent_getUserAgentValue(options.userAgentPrefix);
|
|
const sanitizer = new Sanitizer({
|
|
additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
|
|
});
|
|
const tracingClient = tryCreateTracingClient();
|
|
return {
|
|
name: tracingPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!tracingClient) {
|
|
return next(request);
|
|
}
|
|
const userAgent = await userAgentPromise;
|
|
const spanAttributes = {
|
|
"http.url": sanitizer.sanitizeUrl(request.url),
|
|
"http.method": request.method,
|
|
"http.user_agent": userAgent,
|
|
requestId: request.requestId,
|
|
};
|
|
if (userAgent) {
|
|
spanAttributes["http.user_agent"] = userAgent;
|
|
}
|
|
const { span, tracingContext } = tryCreateSpan(tracingClient, request, spanAttributes) ?? {};
|
|
if (!span || !tracingContext) {
|
|
return next(request);
|
|
}
|
|
try {
|
|
const response = await tracingClient.withContext(tracingContext, next, request);
|
|
tryProcessResponse(span, response);
|
|
return response;
|
|
}
|
|
catch (err) {
|
|
tryProcessError(span, err);
|
|
throw err;
|
|
}
|
|
},
|
|
};
|
|
}
|
|
function tryCreateTracingClient() {
|
|
try {
|
|
return createTracingClient({
|
|
namespace: "",
|
|
packageName: "@azure/core-rest-pipeline",
|
|
packageVersion: esm_constants_SDK_VERSION,
|
|
});
|
|
}
|
|
catch (e) {
|
|
esm_log_logger.warning(`Error when creating the TracingClient: ${getErrorMessage(e)}`);
|
|
return undefined;
|
|
}
|
|
}
|
|
function tryCreateSpan(tracingClient, request, spanAttributes) {
|
|
try {
|
|
// As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
|
|
const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, {
|
|
spanKind: "client",
|
|
spanAttributes,
|
|
});
|
|
// If the span is not recording, don't do any more work.
|
|
if (!span.isRecording()) {
|
|
span.end();
|
|
return undefined;
|
|
}
|
|
// set headers
|
|
const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext);
|
|
for (const [key, value] of Object.entries(headers)) {
|
|
request.headers.set(key, value);
|
|
}
|
|
return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
|
|
}
|
|
catch (e) {
|
|
esm_log_logger.warning(`Skipping creating a tracing span due to an error: ${getErrorMessage(e)}`);
|
|
return undefined;
|
|
}
|
|
}
|
|
function tryProcessError(span, error) {
|
|
try {
|
|
span.setStatus({
|
|
status: "error",
|
|
error: esm_isError(error) ? error : undefined,
|
|
});
|
|
if (esm_restError_isRestError(error) && error.statusCode) {
|
|
span.setAttribute("http.status_code", error.statusCode);
|
|
}
|
|
span.end();
|
|
}
|
|
catch (e) {
|
|
esm_log_logger.warning(`Skipping tracing span processing due to an error: ${getErrorMessage(e)}`);
|
|
}
|
|
}
|
|
function tryProcessResponse(span, response) {
|
|
try {
|
|
span.setAttribute("http.status_code", response.status);
|
|
const serviceRequestId = response.headers.get("x-ms-request-id");
|
|
if (serviceRequestId) {
|
|
span.setAttribute("serviceRequestId", serviceRequestId);
|
|
}
|
|
// Per semantic conventions, only set the status to error if the status code is 4xx or 5xx.
|
|
// Otherwise, the status MUST remain unset.
|
|
// https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
|
|
if (response.status >= 400) {
|
|
span.setStatus({
|
|
status: "error",
|
|
});
|
|
}
|
|
span.end();
|
|
}
|
|
catch (e) {
|
|
esm_log_logger.warning(`Skipping tracing span processing due to an error: ${getErrorMessage(e)}`);
|
|
}
|
|
}
|
|
//# sourceMappingURL=tracingPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/wrapAbortSignal.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Creates a native AbortSignal which reflects the state of the provided AbortSignalLike.
|
|
* If the AbortSignalLike is already a native AbortSignal, it is returned as is.
|
|
* @param abortSignalLike - The AbortSignalLike to wrap.
|
|
* @returns - An object containing the native AbortSignal and an optional cleanup function. The cleanup function should be called when the AbortSignal is no longer needed.
|
|
*/
|
|
function wrapAbortSignalLike(abortSignalLike) {
|
|
if (abortSignalLike instanceof AbortSignal) {
|
|
return { abortSignal: abortSignalLike };
|
|
}
|
|
if (abortSignalLike.aborted) {
|
|
return {
|
|
abortSignal: AbortSignal.abort("reason" in abortSignalLike ? abortSignalLike.reason : undefined),
|
|
};
|
|
}
|
|
const controller = new AbortController();
|
|
let needsCleanup = true;
|
|
function cleanup() {
|
|
if (needsCleanup) {
|
|
abortSignalLike.removeEventListener("abort", listener);
|
|
needsCleanup = false;
|
|
}
|
|
}
|
|
function listener() {
|
|
controller.abort("reason" in abortSignalLike ? abortSignalLike.reason : undefined);
|
|
cleanup();
|
|
}
|
|
abortSignalLike.addEventListener("abort", listener);
|
|
return { abortSignal: controller.signal, cleanup };
|
|
}
|
|
//# sourceMappingURL=wrapAbortSignal.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/wrapAbortSignalLikePolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const wrapAbortSignalLikePolicyName = "wrapAbortSignalLikePolicy";
|
|
/**
|
|
* Policy that ensure that any AbortSignalLike is wrapped in a native AbortSignal for processing by the pipeline.
|
|
* Since the ts-http-runtime expects a native AbortSignal, this policy is used to ensure that any AbortSignalLike is wrapped in a native AbortSignal.
|
|
*
|
|
* @returns - created policy
|
|
*/
|
|
function wrapAbortSignalLikePolicy() {
|
|
return {
|
|
name: wrapAbortSignalLikePolicyName,
|
|
sendRequest: async (request, next) => {
|
|
if (!request.abortSignal) {
|
|
return next(request);
|
|
}
|
|
const { abortSignal, cleanup } = wrapAbortSignalLike(request.abortSignal);
|
|
request.abortSignal = abortSignal;
|
|
try {
|
|
return await next(request);
|
|
}
|
|
finally {
|
|
cleanup?.();
|
|
}
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=wrapAbortSignalLikePolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/createPipelineFromOptions.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Create a new pipeline with a default set of customizable policies.
|
|
* @param options - Options to configure a custom pipeline.
|
|
*/
|
|
function esm_createPipelineFromOptions_createPipelineFromOptions(options) {
|
|
const pipeline = esm_pipeline_createEmptyPipeline();
|
|
if (esm_isNodeLike) {
|
|
if (options.agent) {
|
|
pipeline.addPolicy(policies_agentPolicy_agentPolicy(options.agent));
|
|
}
|
|
if (options.tlsOptions) {
|
|
pipeline.addPolicy(policies_tlsPolicy_tlsPolicy(options.tlsOptions));
|
|
}
|
|
pipeline.addPolicy(policies_proxyPolicy_proxyPolicy(options.proxyOptions));
|
|
pipeline.addPolicy(policies_decompressResponsePolicy_decompressResponsePolicy());
|
|
}
|
|
pipeline.addPolicy(wrapAbortSignalLikePolicy());
|
|
pipeline.addPolicy(policies_formDataPolicy_formDataPolicy(), { beforePolicies: [policies_multipartPolicy_multipartPolicyName] });
|
|
pipeline.addPolicy(policies_userAgentPolicy_userAgentPolicy(options.userAgentOptions));
|
|
pipeline.addPolicy(setClientRequestIdPolicy(options.telemetryOptions?.clientRequestIdHeaderName));
|
|
// The multipart policy is added after policies with no phase, so that
|
|
// policies can be added between it and formDataPolicy to modify
|
|
// properties (e.g., making the boundary constant in recorded tests).
|
|
pipeline.addPolicy(policies_multipartPolicy_multipartPolicy(), { afterPhase: "Deserialize" });
|
|
pipeline.addPolicy(policies_defaultRetryPolicy_defaultRetryPolicy(options.retryOptions), { phase: "Retry" });
|
|
pipeline.addPolicy(tracingPolicy({ ...options.userAgentOptions, ...options.loggingOptions }), {
|
|
afterPhase: "Retry",
|
|
});
|
|
if (esm_isNodeLike) {
|
|
// Both XHR and Fetch expect to handle redirects automatically,
|
|
// so only include this policy when we're in Node.
|
|
pipeline.addPolicy(policies_redirectPolicy_redirectPolicy(options.redirectOptions), { afterPhase: "Retry" });
|
|
}
|
|
pipeline.addPolicy(policies_logPolicy_logPolicy(options.loggingOptions), { afterPhase: "Sign" });
|
|
return pipeline;
|
|
}
|
|
//# sourceMappingURL=createPipelineFromOptions.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/defaultHttpClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Create the correct HttpClient for the current environment.
|
|
*/
|
|
function esm_defaultHttpClient_createDefaultHttpClient() {
|
|
const client = defaultHttpClient_createDefaultHttpClient();
|
|
return {
|
|
async sendRequest(request) {
|
|
// we wrap any AbortSignalLike here since the TypeSpec runtime expects a native AbortSignal.
|
|
// 99% of the time, this should be a no-op since a native AbortSignal is passed in.
|
|
const { abortSignal, cleanup } = request.abortSignal
|
|
? wrapAbortSignalLike(request.abortSignal)
|
|
: {};
|
|
try {
|
|
request.abortSignal = abortSignal;
|
|
return await client.sendRequest(request);
|
|
}
|
|
finally {
|
|
cleanup?.();
|
|
}
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=defaultHttpClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/httpHeaders.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Creates an object that satisfies the `HttpHeaders` interface.
|
|
* @param rawHeaders - A simple object representing initial headers
|
|
*/
|
|
function esm_httpHeaders_createHttpHeaders(rawHeaders) {
|
|
return httpHeaders_createHttpHeaders(rawHeaders);
|
|
}
|
|
//# sourceMappingURL=httpHeaders.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/pipelineRequest.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Creates a new pipeline request with the given options.
|
|
* This method is to allow for the easy setting of default values and not required.
|
|
* @param options - The options to create the request with.
|
|
*/
|
|
function esm_pipelineRequest_createPipelineRequest(options) {
|
|
// Cast required due to difference between ts-http-runtime requiring AbortSignal while core-rest-pipeline allows
|
|
// the more generic AbortSignalLike. The wrapAbortSignalLike pipeline policy will take care of ensuring that any AbortSignalLike in the request
|
|
// is converted into a true AbortSignal.
|
|
return pipelineRequest_createPipelineRequest(options);
|
|
}
|
|
//# sourceMappingURL=pipelineRequest.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/exponentialRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the exponentialRetryPolicy.
|
|
*/
|
|
const exponentialRetryPolicy_exponentialRetryPolicyName = (/* unused pure expression or super */ null && (tspExponentialRetryPolicyName));
|
|
/**
|
|
* A policy that attempts to retry requests while introducing an exponentially increasing delay.
|
|
* @param options - Options that configure retry logic.
|
|
*/
|
|
function exponentialRetryPolicy_exponentialRetryPolicy(options = {}) {
|
|
return tspExponentialRetryPolicy(options);
|
|
}
|
|
//# sourceMappingURL=exponentialRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/systemErrorRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the {@link systemErrorRetryPolicy}
|
|
*/
|
|
const systemErrorRetryPolicy_systemErrorRetryPolicyName = (/* unused pure expression or super */ null && (tspSystemErrorRetryPolicyName));
|
|
/**
|
|
* A retry policy that specifically seeks to handle errors in the
|
|
* underlying transport layer (e.g. DNS lookup failures) rather than
|
|
* retryable error codes from the server itself.
|
|
* @param options - Options that customize the policy.
|
|
*/
|
|
function systemErrorRetryPolicy_systemErrorRetryPolicy(options = {}) {
|
|
return tspSystemErrorRetryPolicy(options);
|
|
}
|
|
//# sourceMappingURL=systemErrorRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/throttlingRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Name of the {@link throttlingRetryPolicy}
|
|
*/
|
|
const throttlingRetryPolicy_throttlingRetryPolicyName = (/* unused pure expression or super */ null && (tspThrottlingRetryPolicyName));
|
|
/**
|
|
* A policy that retries when the server sends a 429 response with a Retry-After header.
|
|
*
|
|
* To learn more, please refer to
|
|
* https://learn.microsoft.com/azure/azure-resource-manager/resource-manager-request-limits,
|
|
* https://learn.microsoft.com/azure/azure-subscription-service-limits and
|
|
* https://learn.microsoft.com/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
|
|
*
|
|
* @param options - Options that configure retry logic.
|
|
*/
|
|
function throttlingRetryPolicy_throttlingRetryPolicy(options = {}) {
|
|
return tspThrottlingRetryPolicy(options);
|
|
}
|
|
//# sourceMappingURL=throttlingRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/retryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
const retryPolicy_retryPolicyLogger = esm_createClientLogger("core-rest-pipeline retryPolicy");
|
|
/**
|
|
* retryPolicy is a generic policy to enable retrying requests when certain conditions are met
|
|
*/
|
|
function policies_retryPolicy_retryPolicy(strategies, options = { maxRetries: DEFAULT_RETRY_POLICY_COUNT }) {
|
|
// Cast is required since the TSP runtime retry strategy type is slightly different
|
|
// very deep down (using real AbortSignal vs. AbortSignalLike in RestError).
|
|
// In practice the difference doesn't actually matter.
|
|
return tspRetryPolicy(strategies, {
|
|
logger: retryPolicy_retryPolicyLogger,
|
|
...options,
|
|
});
|
|
}
|
|
//# sourceMappingURL=retryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/tokenCycler.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
// Default options for the cycler if none are provided
|
|
const DEFAULT_CYCLER_OPTIONS = {
|
|
forcedRefreshWindowInMs: 1000, // Force waiting for a refresh 1s before the token expires
|
|
retryIntervalInMs: 3000, // Allow refresh attempts every 3s
|
|
refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
|
|
};
|
|
/**
|
|
* Converts an an unreliable access token getter (which may resolve with null)
|
|
* into an AccessTokenGetter by retrying the unreliable getter in a regular
|
|
* interval.
|
|
*
|
|
* @param getAccessToken - A function that produces a promise of an access token that may fail by returning null.
|
|
* @param retryIntervalInMs - The time (in milliseconds) to wait between retry attempts.
|
|
* @param refreshTimeout - The timestamp after which the refresh attempt will fail, throwing an exception.
|
|
* @returns - A promise that, if it resolves, will resolve with an access token.
|
|
*/
|
|
async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) {
|
|
// This wrapper handles exceptions gracefully as long as we haven't exceeded
|
|
// the timeout.
|
|
async function tryGetAccessToken() {
|
|
if (Date.now() < refreshTimeout) {
|
|
try {
|
|
return await getAccessToken();
|
|
}
|
|
catch {
|
|
return null;
|
|
}
|
|
}
|
|
else {
|
|
const finalToken = await getAccessToken();
|
|
// Timeout is up, so throw if it's still null
|
|
if (finalToken === null) {
|
|
throw new Error("Failed to refresh access token.");
|
|
}
|
|
return finalToken;
|
|
}
|
|
}
|
|
let token = await tryGetAccessToken();
|
|
while (token === null) {
|
|
await delay_delay(retryIntervalInMs);
|
|
token = await tryGetAccessToken();
|
|
}
|
|
return token;
|
|
}
|
|
/**
|
|
* Creates a token cycler from a credential, scopes, and optional settings.
|
|
*
|
|
* A token cycler represents a way to reliably retrieve a valid access token
|
|
* from a TokenCredential. It will handle initializing the token, refreshing it
|
|
* when it nears expiration, and synchronizes refresh attempts to avoid
|
|
* concurrency hazards.
|
|
*
|
|
* @param credential - the underlying TokenCredential that provides the access
|
|
* token
|
|
* @param tokenCyclerOptions - optionally override default settings for the cycler
|
|
*
|
|
* @returns - a function that reliably produces a valid access token
|
|
*/
|
|
function tokenCycler_createTokenCycler(credential, tokenCyclerOptions) {
|
|
let refreshWorker = null;
|
|
let token = null;
|
|
let tenantId;
|
|
const options = {
|
|
...DEFAULT_CYCLER_OPTIONS,
|
|
...tokenCyclerOptions,
|
|
};
|
|
/**
|
|
* This little holder defines several predicates that we use to construct
|
|
* the rules of refreshing the token.
|
|
*/
|
|
const cycler = {
|
|
/**
|
|
* Produces true if a refresh job is currently in progress.
|
|
*/
|
|
get isRefreshing() {
|
|
return refreshWorker !== null;
|
|
},
|
|
/**
|
|
* Produces true if the cycler SHOULD refresh (we are within the refresh
|
|
* window and not already refreshing)
|
|
*/
|
|
get shouldRefresh() {
|
|
if (token === null) {
|
|
return true;
|
|
}
|
|
if (cycler.isRefreshing) {
|
|
return false;
|
|
}
|
|
if (token.refreshAfterTimestamp && token.refreshAfterTimestamp < Date.now()) {
|
|
return true;
|
|
}
|
|
return token.expiresOnTimestamp - options.refreshWindowInMs < Date.now();
|
|
},
|
|
/**
|
|
* Produces true if the cycler MUST refresh (null or nearly-expired
|
|
* token).
|
|
*/
|
|
get mustRefresh() {
|
|
return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
|
|
},
|
|
};
|
|
/**
|
|
* Starts a refresh job or returns the existing job if one is already
|
|
* running.
|
|
*/
|
|
function refresh(scopes, getTokenOptions) {
|
|
if (!cycler.isRefreshing) {
|
|
// We bind `scopes` here to avoid passing it around a lot
|
|
const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
|
|
// Take advantage of promise chaining to insert an assignment to `token`
|
|
// before the refresh can be considered done.
|
|
refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs,
|
|
// If we don't have a token, then we should timeout immediately
|
|
token?.expiresOnTimestamp ?? Date.now())
|
|
.then((_token) => {
|
|
refreshWorker = null;
|
|
token = _token;
|
|
tenantId = getTokenOptions.tenantId;
|
|
return token;
|
|
})
|
|
.catch((reason) => {
|
|
// We also should reset the refresher if we enter a failed state. All
|
|
// existing awaiters will throw, but subsequent requests will start a
|
|
// new retry chain.
|
|
refreshWorker = null;
|
|
token = null;
|
|
tenantId = undefined;
|
|
throw reason;
|
|
});
|
|
}
|
|
return refreshWorker;
|
|
}
|
|
return async (scopes, tokenOptions) => {
|
|
//
|
|
// Simple rules:
|
|
// - If we MUST refresh, then return the refresh task, blocking
|
|
// the pipeline until a token is available.
|
|
// - If we SHOULD refresh, then run refresh but don't return it
|
|
// (we can still use the cached token).
|
|
// - Return the token, since it's fine if we didn't return in
|
|
// step 1.
|
|
//
|
|
const hasClaimChallenge = Boolean(tokenOptions.claims);
|
|
const tenantIdChanged = tenantId !== tokenOptions.tenantId;
|
|
if (hasClaimChallenge) {
|
|
// If we've received a claim, we know the existing token isn't valid
|
|
// We want to clear it so that that refresh worker won't use the old expiration time as a timeout
|
|
token = null;
|
|
}
|
|
// If the tenantId passed in token options is different to the one we have
|
|
// Or if we are in claim challenge and the token was rejected and a new access token need to be issued, we need to
|
|
// refresh the token with the new tenantId or token.
|
|
const mustRefresh = tenantIdChanged || hasClaimChallenge || cycler.mustRefresh;
|
|
if (mustRefresh) {
|
|
return refresh(scopes, tokenOptions);
|
|
}
|
|
if (cycler.shouldRefresh) {
|
|
refresh(scopes, tokenOptions);
|
|
}
|
|
return token;
|
|
};
|
|
}
|
|
//# sourceMappingURL=tokenCycler.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/bearerTokenAuthenticationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the bearerTokenAuthenticationPolicy.
|
|
*/
|
|
const bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy";
|
|
/**
|
|
* Try to send the given request.
|
|
*
|
|
* When a response is received, returns a tuple of the response received and, if the response was received
|
|
* inside a thrown RestError, the RestError that was thrown.
|
|
*
|
|
* Otherwise, if an error was thrown while sending the request that did not provide an underlying response, it
|
|
* will be rethrown.
|
|
*/
|
|
async function trySendRequest(request, next) {
|
|
try {
|
|
return [await next(request), undefined];
|
|
}
|
|
catch (e) {
|
|
if (esm_restError_isRestError(e) && e.response) {
|
|
return [e.response, e];
|
|
}
|
|
else {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Default authorize request handler
|
|
*/
|
|
async function defaultAuthorizeRequest(options) {
|
|
const { scopes, getAccessToken, request } = options;
|
|
// Enable CAE true by default
|
|
const getTokenOptions = {
|
|
abortSignal: request.abortSignal,
|
|
tracingOptions: request.tracingOptions,
|
|
enableCae: true,
|
|
};
|
|
const accessToken = await getAccessToken(scopes, getTokenOptions);
|
|
if (accessToken) {
|
|
options.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
|
|
}
|
|
}
|
|
/**
|
|
* We will retrieve the challenge only if the response status code was 401,
|
|
* and if the response contained the header "WWW-Authenticate" with a non-empty value.
|
|
*/
|
|
function isChallengeResponse(response) {
|
|
return response.status === 401 && response.headers.has("WWW-Authenticate");
|
|
}
|
|
/**
|
|
* Re-authorize the request for CAE challenge.
|
|
* The response containing the challenge is `options.response`.
|
|
* If this method returns true, the underlying request will be sent once again.
|
|
*/
|
|
async function authorizeRequestOnCaeChallenge(onChallengeOptions, caeClaims) {
|
|
const { scopes } = onChallengeOptions;
|
|
const accessToken = await onChallengeOptions.getAccessToken(scopes, {
|
|
enableCae: true,
|
|
claims: caeClaims,
|
|
});
|
|
if (!accessToken) {
|
|
return false;
|
|
}
|
|
onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
|
|
return true;
|
|
}
|
|
/**
|
|
* A policy that can request a token from a TokenCredential implementation and
|
|
* then apply it to the Authorization header of a request as a Bearer token.
|
|
*/
|
|
function bearerTokenAuthenticationPolicy(options) {
|
|
const { credential, scopes, challengeCallbacks } = options;
|
|
const logger = options.logger || esm_log_logger;
|
|
const callbacks = {
|
|
authorizeRequest: challengeCallbacks?.authorizeRequest?.bind(challengeCallbacks) ?? defaultAuthorizeRequest,
|
|
authorizeRequestOnChallenge: challengeCallbacks?.authorizeRequestOnChallenge?.bind(challengeCallbacks),
|
|
};
|
|
// This function encapsulates the entire process of reliably retrieving the token
|
|
// The options are left out of the public API until there's demand to configure this.
|
|
// Remember to extend `BearerTokenAuthenticationPolicyOptions` with `TokenCyclerOptions`
|
|
// in order to pass through the `options` object.
|
|
const getAccessToken = credential
|
|
? tokenCycler_createTokenCycler(credential /* , options */)
|
|
: () => Promise.resolve(null);
|
|
return {
|
|
name: bearerTokenAuthenticationPolicyName,
|
|
/**
|
|
* If there's no challenge parameter:
|
|
* - It will try to retrieve the token using the cache, or the credential's getToken.
|
|
* - Then it will try the next policy with or without the retrieved token.
|
|
*
|
|
* It uses the challenge parameters to:
|
|
* - Skip a first attempt to get the token from the credential if there's no cached token,
|
|
* since it expects the token to be retrievable only after the challenge.
|
|
* - Prepare the outgoing request if the `prepareRequest` method has been provided.
|
|
* - Send an initial request to receive the challenge if it fails.
|
|
* - Process a challenge if the response contains it.
|
|
* - Retrieve a token with the challenge information, then re-send the request.
|
|
*/
|
|
async sendRequest(request, next) {
|
|
if (!request.url.toLowerCase().startsWith("https://")) {
|
|
throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
|
|
}
|
|
await callbacks.authorizeRequest({
|
|
scopes: Array.isArray(scopes) ? scopes : [scopes],
|
|
request,
|
|
getAccessToken,
|
|
logger,
|
|
});
|
|
let response;
|
|
let error;
|
|
let shouldSendRequest;
|
|
[response, error] = await trySendRequest(request, next);
|
|
if (isChallengeResponse(response)) {
|
|
let claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate"));
|
|
// Handle CAE by default when receive CAE claim
|
|
if (claims) {
|
|
let parsedClaim;
|
|
// Return the response immediately if claims is not a valid base64 encoded string
|
|
try {
|
|
parsedClaim = atob(claims);
|
|
}
|
|
catch (e) {
|
|
logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
|
|
return response;
|
|
}
|
|
shouldSendRequest = await authorizeRequestOnCaeChallenge({
|
|
scopes: Array.isArray(scopes) ? scopes : [scopes],
|
|
response,
|
|
request,
|
|
getAccessToken,
|
|
logger,
|
|
}, parsedClaim);
|
|
// Send updated request and handle response for RestError
|
|
if (shouldSendRequest) {
|
|
[response, error] = await trySendRequest(request, next);
|
|
}
|
|
}
|
|
else if (callbacks.authorizeRequestOnChallenge) {
|
|
// Handle custom challenges when client provides custom callback
|
|
shouldSendRequest = await callbacks.authorizeRequestOnChallenge({
|
|
scopes: Array.isArray(scopes) ? scopes : [scopes],
|
|
request,
|
|
response,
|
|
getAccessToken,
|
|
logger,
|
|
});
|
|
// Send updated request and handle response for RestError
|
|
if (shouldSendRequest) {
|
|
[response, error] = await trySendRequest(request, next);
|
|
}
|
|
// If we get another CAE Claim, we will handle it by default and return whatever value we receive for this
|
|
if (isChallengeResponse(response)) {
|
|
claims = getCaeChallengeClaims(response.headers.get("WWW-Authenticate") ?? "");
|
|
if (claims) {
|
|
let parsedClaim;
|
|
try {
|
|
parsedClaim = atob(claims);
|
|
}
|
|
catch (e) {
|
|
logger.warning(`The WWW-Authenticate header contains "claims" that cannot be parsed. Unable to perform the Continuous Access Evaluation authentication flow. Unparsable claims: ${claims}`);
|
|
return response;
|
|
}
|
|
shouldSendRequest = await authorizeRequestOnCaeChallenge({
|
|
scopes: Array.isArray(scopes) ? scopes : [scopes],
|
|
response,
|
|
request,
|
|
getAccessToken,
|
|
logger,
|
|
}, parsedClaim);
|
|
// Send updated request and handle response for RestError
|
|
if (shouldSendRequest) {
|
|
[response, error] = await trySendRequest(request, next);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
else {
|
|
return response;
|
|
}
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Converts: `Bearer a="b", c="d", Pop e="f", g="h"`.
|
|
* Into: `[ { scheme: 'Bearer', params: { a: 'b', c: 'd' } }, { scheme: 'Pop', params: { e: 'f', g: 'h' } } ]`.
|
|
*
|
|
* @internal
|
|
*/
|
|
function parseChallenges(challenges) {
|
|
// Challenge regex seperates the string to individual challenges with different schemes in the format `Scheme a="b", c=d`
|
|
// The challenge regex captures parameteres with either quotes values or unquoted values
|
|
const challengeRegex = /(\w+)\s+((?:\w+=(?:"[^"]*"|[^,]*),?\s*)+)/g;
|
|
// Parameter regex captures the claims group removed from the scheme in the format `a="b"` and `c="d"`
|
|
// CAE challenge always have quoted parameters. For more reference, https://learn.microsoft.com/entra/identity-platform/claims-challenge
|
|
const paramRegex = /(\w+)="([^"]*)"/g;
|
|
const parsedChallenges = [];
|
|
let match;
|
|
// Iterate over each challenge match
|
|
while ((match = challengeRegex.exec(challenges)) !== null) {
|
|
const scheme = match[1];
|
|
const paramsString = match[2];
|
|
const params = {};
|
|
let paramMatch;
|
|
// Iterate over each parameter match
|
|
while ((paramMatch = paramRegex.exec(paramsString)) !== null) {
|
|
params[paramMatch[1]] = paramMatch[2];
|
|
}
|
|
parsedChallenges.push({ scheme, params });
|
|
}
|
|
return parsedChallenges;
|
|
}
|
|
/**
|
|
* Parse a pipeline response and look for a CAE challenge with "Bearer" scheme
|
|
* Return the value in the header without parsing the challenge
|
|
* @internal
|
|
*/
|
|
function getCaeChallengeClaims(challenges) {
|
|
if (!challenges) {
|
|
return;
|
|
}
|
|
// Find all challenges present in the header
|
|
const parsedChallenges = parseChallenges(challenges);
|
|
return parsedChallenges.find((x) => x.scheme === "Bearer" && x.params.claims && x.params.error === "insufficient_claims")?.params.claims;
|
|
}
|
|
//# sourceMappingURL=bearerTokenAuthenticationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/policies/auxiliaryAuthenticationHeaderPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the auxiliaryAuthenticationHeaderPolicy.
|
|
*/
|
|
const auxiliaryAuthenticationHeaderPolicyName = "auxiliaryAuthenticationHeaderPolicy";
|
|
const AUTHORIZATION_AUXILIARY_HEADER = "x-ms-authorization-auxiliary";
|
|
async function sendAuthorizeRequest(options) {
|
|
const { scopes, getAccessToken, request } = options;
|
|
const getTokenOptions = {
|
|
abortSignal: request.abortSignal,
|
|
tracingOptions: request.tracingOptions,
|
|
};
|
|
return (await getAccessToken(scopes, getTokenOptions))?.token ?? "";
|
|
}
|
|
/**
|
|
* A policy for external tokens to `x-ms-authorization-auxiliary` header.
|
|
* This header will be used when creating a cross-tenant application we may need to handle authentication requests
|
|
* for resources that are in different tenants.
|
|
* You could see [ARM docs](https://learn.microsoft.com/azure/azure-resource-manager/management/authenticate-multi-tenant) for a rundown of how this feature works
|
|
*/
|
|
function auxiliaryAuthenticationHeaderPolicy(options) {
|
|
const { credentials, scopes } = options;
|
|
const logger = options.logger || coreLogger;
|
|
const tokenCyclerMap = new WeakMap();
|
|
return {
|
|
name: auxiliaryAuthenticationHeaderPolicyName,
|
|
async sendRequest(request, next) {
|
|
if (!request.url.toLowerCase().startsWith("https://")) {
|
|
throw new Error("Bearer token authentication for auxiliary header is not permitted for non-TLS protected (non-https) URLs.");
|
|
}
|
|
if (!credentials || credentials.length === 0) {
|
|
logger.info(`${auxiliaryAuthenticationHeaderPolicyName} header will not be set due to empty credentials.`);
|
|
return next(request);
|
|
}
|
|
const tokenPromises = [];
|
|
for (const credential of credentials) {
|
|
let getAccessToken = tokenCyclerMap.get(credential);
|
|
if (!getAccessToken) {
|
|
getAccessToken = createTokenCycler(credential);
|
|
tokenCyclerMap.set(credential, getAccessToken);
|
|
}
|
|
tokenPromises.push(sendAuthorizeRequest({
|
|
scopes: Array.isArray(scopes) ? scopes : [scopes],
|
|
request,
|
|
getAccessToken,
|
|
logger,
|
|
}));
|
|
}
|
|
const auxiliaryTokens = (await Promise.all(tokenPromises)).filter((token) => Boolean(token));
|
|
if (auxiliaryTokens.length === 0) {
|
|
logger.warning(`None of the auxiliary tokens are valid. ${AUTHORIZATION_AUXILIARY_HEADER} header will not be set.`);
|
|
return next(request);
|
|
}
|
|
request.headers.set(AUTHORIZATION_AUXILIARY_HEADER, auxiliaryTokens.map((token) => `Bearer ${token}`).join(", "));
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=auxiliaryAuthenticationHeaderPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/keyCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Tests an object to determine whether it implements KeyCredential.
|
|
*
|
|
* @param credential - The assumed KeyCredential to be tested.
|
|
*/
|
|
function isKeyCredential(credential) {
|
|
return isObjectWithProperties(credential, ["key"]) && typeof credential.key === "string";
|
|
}
|
|
//# sourceMappingURL=keyCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/azureNamedKeyCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* A static name/key-based credential that supports updating
|
|
* the underlying name and key values.
|
|
*/
|
|
class AzureNamedKeyCredential {
|
|
_key;
|
|
_name;
|
|
/**
|
|
* The value of the key to be used in authentication.
|
|
*/
|
|
get key() {
|
|
return this._key;
|
|
}
|
|
/**
|
|
* The value of the name to be used in authentication.
|
|
*/
|
|
get name() {
|
|
return this._name;
|
|
}
|
|
/**
|
|
* Create an instance of an AzureNamedKeyCredential for use
|
|
* with a service client.
|
|
*
|
|
* @param name - The initial value of the name to use in authentication.
|
|
* @param key - The initial value of the key to use in authentication.
|
|
*/
|
|
constructor(name, key) {
|
|
if (!name || !key) {
|
|
throw new TypeError("name and key must be non-empty strings");
|
|
}
|
|
this._name = name;
|
|
this._key = key;
|
|
}
|
|
/**
|
|
* Change the value of the key.
|
|
*
|
|
* Updates will take effect upon the next request after
|
|
* updating the key value.
|
|
*
|
|
* @param newName - The new name value to be used.
|
|
* @param newKey - The new key value to be used.
|
|
*/
|
|
update(newName, newKey) {
|
|
if (!newName || !newKey) {
|
|
throw new TypeError("newName and newKey must be non-empty strings");
|
|
}
|
|
this._name = newName;
|
|
this._key = newKey;
|
|
}
|
|
}
|
|
/**
|
|
* Tests an object to determine whether it implements NamedKeyCredential.
|
|
*
|
|
* @param credential - The assumed NamedKeyCredential to be tested.
|
|
*/
|
|
function isNamedKeyCredential(credential) {
|
|
return (isObjectWithProperties(credential, ["name", "key"]) &&
|
|
typeof credential.key === "string" &&
|
|
typeof credential.name === "string");
|
|
}
|
|
//# sourceMappingURL=azureNamedKeyCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/azureSASCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* A static-signature-based credential that supports updating
|
|
* the underlying signature value.
|
|
*/
|
|
class AzureSASCredential {
|
|
_signature;
|
|
/**
|
|
* The value of the shared access signature to be used in authentication
|
|
*/
|
|
get signature() {
|
|
return this._signature;
|
|
}
|
|
/**
|
|
* Create an instance of an AzureSASCredential for use
|
|
* with a service client.
|
|
*
|
|
* @param signature - The initial value of the shared access signature to use in authentication
|
|
*/
|
|
constructor(signature) {
|
|
if (!signature) {
|
|
throw new Error("shared access signature must be a non-empty string");
|
|
}
|
|
this._signature = signature;
|
|
}
|
|
/**
|
|
* Change the value of the signature.
|
|
*
|
|
* Updates will take effect upon the next request after
|
|
* updating the signature value.
|
|
*
|
|
* @param newSignature - The new shared access signature value to be used
|
|
*/
|
|
update(newSignature) {
|
|
if (!newSignature) {
|
|
throw new Error("shared access signature must be a non-empty string");
|
|
}
|
|
this._signature = newSignature;
|
|
}
|
|
}
|
|
/**
|
|
* Tests an object to determine whether it implements SASCredential.
|
|
*
|
|
* @param credential - The assumed SASCredential to be tested.
|
|
*/
|
|
function isSASCredential(credential) {
|
|
return (isObjectWithProperties(credential, ["signature"]) && typeof credential.signature === "string");
|
|
}
|
|
//# sourceMappingURL=azureSASCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/tokenCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Tests an object to determine whether it implements TokenCredential.
|
|
*
|
|
* @param credential - The assumed TokenCredential to be tested.
|
|
*/
|
|
function isTokenCredential(credential) {
|
|
// Check for an object with a 'getToken' function and possibly with
|
|
// a 'signRequest' function. We do this check to make sure that
|
|
// a ServiceClientCredentials implementor (like TokenClientCredentials
|
|
// in ms-rest-nodeauth) doesn't get mistaken for a TokenCredential if
|
|
// it doesn't actually implement TokenCredential also.
|
|
const castCredential = credential;
|
|
return (castCredential &&
|
|
typeof castCredential.getToken === "function" &&
|
|
(castCredential.signRequest === undefined || castCredential.getToken.length > 0));
|
|
}
|
|
//# sourceMappingURL=tokenCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/index.js
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/policies/disableKeepAlivePolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const disableKeepAlivePolicyName = "DisableKeepAlivePolicy";
|
|
function createDisableKeepAlivePolicy() {
|
|
return {
|
|
name: disableKeepAlivePolicyName,
|
|
sendRequest(request, next) {
|
|
request.disableKeepAlive = true;
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
function pipelineContainsDisableKeepAlivePolicy(pipeline) {
|
|
return pipeline.getOrderedPolicies().some((policy) => policy.name === disableKeepAlivePolicyName);
|
|
}
|
|
//# sourceMappingURL=disableKeepAlivePolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/base64.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Encodes a string in base64 format.
|
|
* @param value - the string to encode
|
|
* @internal
|
|
*/
|
|
function encodeString(value) {
|
|
return uint8ArrayToString(stringToUint8Array(value, "utf-8"), "base64");
|
|
}
|
|
/**
|
|
* Encodes a byte array in base64 format.
|
|
* @param value - the Uint8Array to encode
|
|
* @internal
|
|
*/
|
|
function encodeByteArray(value) {
|
|
return esm_uint8ArrayToString(value, "base64");
|
|
}
|
|
/**
|
|
* Decodes a base64 string into a byte array.
|
|
* @param value - the base64 string to decode
|
|
* @internal
|
|
*/
|
|
function decodeString(value) {
|
|
return esm_stringToUint8Array(value, "base64");
|
|
}
|
|
/**
|
|
* Decodes a base64 string into a string.
|
|
* @param value - the base64 string to decode
|
|
* @internal
|
|
*/
|
|
function base64_decodeStringToString(value) {
|
|
return uint8ArrayToString(stringToUint8Array(value, "base64"), "utf-8");
|
|
}
|
|
//# sourceMappingURL=base64.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/interfaces.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Default key used to access the XML attributes.
|
|
*/
|
|
const XML_ATTRKEY = "$";
|
|
/**
|
|
* Default key used to access the XML value content.
|
|
*/
|
|
const XML_CHARKEY = "_";
|
|
//# sourceMappingURL=interfaces.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/utils.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* A type guard for a primitive response body.
|
|
* @param value - Value to test
|
|
*
|
|
* @internal
|
|
*/
|
|
function isPrimitiveBody(value, mapperTypeName) {
|
|
return (mapperTypeName !== "Composite" &&
|
|
mapperTypeName !== "Dictionary" &&
|
|
(typeof value === "string" ||
|
|
typeof value === "number" ||
|
|
typeof value === "boolean" ||
|
|
mapperTypeName?.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i) !==
|
|
null ||
|
|
value === undefined ||
|
|
value === null));
|
|
}
|
|
const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
|
/**
|
|
* Returns true if the given string is in ISO 8601 format.
|
|
* @param value - The value to be validated for ISO 8601 duration format.
|
|
* @internal
|
|
*/
|
|
function isDuration(value) {
|
|
return validateISODuration.test(value);
|
|
}
|
|
const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
|
|
/**
|
|
* Returns true if the provided uuid is valid.
|
|
*
|
|
* @param uuid - The uuid that needs to be validated.
|
|
*
|
|
* @internal
|
|
*/
|
|
function isValidUuid(uuid) {
|
|
return validUuidRegex.test(uuid);
|
|
}
|
|
/**
|
|
* Maps the response as follows:
|
|
* - wraps the response body if needed (typically if its type is primitive).
|
|
* - returns null if the combination of the headers and the body is empty.
|
|
* - otherwise, returns the combination of the headers and the body.
|
|
*
|
|
* @param responseObject - a representation of the parsed response
|
|
* @returns the response that will be returned to the user which can be null and/or wrapped
|
|
*
|
|
* @internal
|
|
*/
|
|
function handleNullableResponseAndWrappableBody(responseObject) {
|
|
const combinedHeadersAndBody = {
|
|
...responseObject.headers,
|
|
...responseObject.body,
|
|
};
|
|
if (responseObject.hasNullableType &&
|
|
Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) {
|
|
return responseObject.shouldWrapBody ? { body: null } : null;
|
|
}
|
|
else {
|
|
return responseObject.shouldWrapBody
|
|
? {
|
|
...responseObject.headers,
|
|
body: responseObject.body,
|
|
}
|
|
: combinedHeadersAndBody;
|
|
}
|
|
}
|
|
/**
|
|
* Take a `FullOperationResponse` and turn it into a flat
|
|
* response object to hand back to the consumer.
|
|
* @param fullResponse - The processed response from the operation request
|
|
* @param responseSpec - The response map from the OperationSpec
|
|
*
|
|
* @internal
|
|
*/
|
|
function flattenResponse(fullResponse, responseSpec) {
|
|
const parsedHeaders = fullResponse.parsedHeaders;
|
|
// head methods never have a body, but we return a boolean set to body property
|
|
// to indicate presence/absence of the resource
|
|
if (fullResponse.request.method === "HEAD") {
|
|
return {
|
|
...parsedHeaders,
|
|
body: fullResponse.parsedBody,
|
|
};
|
|
}
|
|
const bodyMapper = responseSpec && responseSpec.bodyMapper;
|
|
const isNullable = Boolean(bodyMapper?.nullable);
|
|
const expectedBodyTypeName = bodyMapper?.type.name;
|
|
/** If the body is asked for, we look at the expected body type to handle it */
|
|
if (expectedBodyTypeName === "Stream") {
|
|
return {
|
|
...parsedHeaders,
|
|
blobBody: fullResponse.blobBody,
|
|
readableStreamBody: fullResponse.readableStreamBody,
|
|
};
|
|
}
|
|
const modelProperties = (expectedBodyTypeName === "Composite" &&
|
|
bodyMapper.type.modelProperties) ||
|
|
{};
|
|
const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
|
|
if (expectedBodyTypeName === "Sequence" || isPageableResponse) {
|
|
const arrayResponse = fullResponse.parsedBody ?? [];
|
|
for (const key of Object.keys(modelProperties)) {
|
|
if (modelProperties[key].serializedName) {
|
|
arrayResponse[key] = fullResponse.parsedBody?.[key];
|
|
}
|
|
}
|
|
if (parsedHeaders) {
|
|
for (const key of Object.keys(parsedHeaders)) {
|
|
arrayResponse[key] = parsedHeaders[key];
|
|
}
|
|
}
|
|
return isNullable &&
|
|
!fullResponse.parsedBody &&
|
|
!parsedHeaders &&
|
|
Object.getOwnPropertyNames(modelProperties).length === 0
|
|
? null
|
|
: arrayResponse;
|
|
}
|
|
return handleNullableResponseAndWrappableBody({
|
|
body: fullResponse.parsedBody,
|
|
headers: parsedHeaders,
|
|
hasNullableType: isNullable,
|
|
shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName),
|
|
});
|
|
}
|
|
//# sourceMappingURL=utils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/serializer.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
class SerializerImpl {
|
|
modelMappers;
|
|
isXML;
|
|
constructor(modelMappers = {}, isXML = false) {
|
|
this.modelMappers = modelMappers;
|
|
this.isXML = isXML;
|
|
}
|
|
/**
|
|
* @deprecated Removing the constraints validation on client side.
|
|
*/
|
|
validateConstraints(mapper, value, objectName) {
|
|
const failValidation = (constraintName, constraintValue) => {
|
|
throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
|
|
};
|
|
if (mapper.constraints && value !== undefined && value !== null) {
|
|
const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
|
|
if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) {
|
|
failValidation("ExclusiveMaximum", ExclusiveMaximum);
|
|
}
|
|
if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) {
|
|
failValidation("ExclusiveMinimum", ExclusiveMinimum);
|
|
}
|
|
if (InclusiveMaximum !== undefined && value > InclusiveMaximum) {
|
|
failValidation("InclusiveMaximum", InclusiveMaximum);
|
|
}
|
|
if (InclusiveMinimum !== undefined && value < InclusiveMinimum) {
|
|
failValidation("InclusiveMinimum", InclusiveMinimum);
|
|
}
|
|
if (MaxItems !== undefined && value.length > MaxItems) {
|
|
failValidation("MaxItems", MaxItems);
|
|
}
|
|
if (MaxLength !== undefined && value.length > MaxLength) {
|
|
failValidation("MaxLength", MaxLength);
|
|
}
|
|
if (MinItems !== undefined && value.length < MinItems) {
|
|
failValidation("MinItems", MinItems);
|
|
}
|
|
if (MinLength !== undefined && value.length < MinLength) {
|
|
failValidation("MinLength", MinLength);
|
|
}
|
|
if (MultipleOf !== undefined && value % MultipleOf !== 0) {
|
|
failValidation("MultipleOf", MultipleOf);
|
|
}
|
|
if (Pattern) {
|
|
const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
|
|
if (typeof value !== "string" || value.match(pattern) === null) {
|
|
failValidation("Pattern", Pattern);
|
|
}
|
|
}
|
|
if (UniqueItems &&
|
|
value.some((item, i, ar) => ar.indexOf(item) !== i)) {
|
|
failValidation("UniqueItems", UniqueItems);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Serialize the given object based on its metadata defined in the mapper
|
|
*
|
|
* @param mapper - The mapper which defines the metadata of the serializable object
|
|
*
|
|
* @param object - A valid Javascript object to be serialized
|
|
*
|
|
* @param objectName - Name of the serialized object
|
|
*
|
|
* @param options - additional options to serialization
|
|
*
|
|
* @returns A valid serialized Javascript object
|
|
*/
|
|
serialize(mapper, object, objectName, options = { xml: {} }) {
|
|
const updatedOptions = {
|
|
xml: {
|
|
rootName: options.xml.rootName ?? "",
|
|
includeRoot: options.xml.includeRoot ?? false,
|
|
xmlCharKey: options.xml.xmlCharKey ?? XML_CHARKEY,
|
|
},
|
|
};
|
|
let payload = {};
|
|
const mapperType = mapper.type.name;
|
|
if (!objectName) {
|
|
objectName = mapper.serializedName;
|
|
}
|
|
if (mapperType.match(/^Sequence$/i) !== null) {
|
|
payload = [];
|
|
}
|
|
if (mapper.isConstant) {
|
|
object = mapper.defaultValue;
|
|
}
|
|
// This table of allowed values should help explain
|
|
// the mapper.required and mapper.nullable properties.
|
|
// X means "neither undefined or null are allowed".
|
|
// || required
|
|
// || true | false
|
|
// nullable || ==========================
|
|
// true || null | undefined/null
|
|
// false || X | undefined
|
|
// undefined || X | undefined/null
|
|
const { required, nullable } = mapper;
|
|
if (required && nullable && object === undefined) {
|
|
throw new Error(`${objectName} cannot be undefined.`);
|
|
}
|
|
if (required && !nullable && (object === undefined || object === null)) {
|
|
throw new Error(`${objectName} cannot be null or undefined.`);
|
|
}
|
|
if (!required && nullable === false && object === null) {
|
|
throw new Error(`${objectName} cannot be null.`);
|
|
}
|
|
if (object === undefined || object === null) {
|
|
payload = object;
|
|
}
|
|
else {
|
|
if (mapperType.match(/^any$/i) !== null) {
|
|
payload = object;
|
|
}
|
|
else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
|
|
payload = serializeBasicTypes(mapperType, objectName, object);
|
|
}
|
|
else if (mapperType.match(/^Enum$/i) !== null) {
|
|
const enumMapper = mapper;
|
|
payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
|
|
}
|
|
else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
|
|
payload = serializeDateTypes(mapperType, object, objectName);
|
|
}
|
|
else if (mapperType.match(/^ByteArray$/i) !== null) {
|
|
payload = serializeByteArrayType(objectName, object);
|
|
}
|
|
else if (mapperType.match(/^Base64Url$/i) !== null) {
|
|
payload = serializeBase64UrlType(objectName, object);
|
|
}
|
|
else if (mapperType.match(/^Sequence$/i) !== null) {
|
|
payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
|
|
}
|
|
else if (mapperType.match(/^Dictionary$/i) !== null) {
|
|
payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
|
|
}
|
|
else if (mapperType.match(/^Composite$/i) !== null) {
|
|
payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
|
|
}
|
|
}
|
|
return payload;
|
|
}
|
|
/**
|
|
* Deserialize the given object based on its metadata defined in the mapper
|
|
*
|
|
* @param mapper - The mapper which defines the metadata of the serializable object
|
|
*
|
|
* @param responseBody - A valid Javascript entity to be deserialized
|
|
*
|
|
* @param objectName - Name of the deserialized object
|
|
*
|
|
* @param options - Controls behavior of XML parser and builder.
|
|
*
|
|
* @returns A valid deserialized Javascript object
|
|
*/
|
|
deserialize(mapper, responseBody, objectName, options = { xml: {} }) {
|
|
const updatedOptions = {
|
|
xml: {
|
|
rootName: options.xml.rootName ?? "",
|
|
includeRoot: options.xml.includeRoot ?? false,
|
|
xmlCharKey: options.xml.xmlCharKey ?? XML_CHARKEY,
|
|
},
|
|
ignoreUnknownProperties: options.ignoreUnknownProperties ?? false,
|
|
};
|
|
if (responseBody === undefined || responseBody === null) {
|
|
if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
|
|
// Edge case for empty XML non-wrapped lists. xml2js can't distinguish
|
|
// between the list being empty versus being missing,
|
|
// so let's do the more user-friendly thing and return an empty list.
|
|
responseBody = [];
|
|
}
|
|
// specifically check for undefined as default value can be a falsey value `0, "", false, null`
|
|
if (mapper.defaultValue !== undefined) {
|
|
responseBody = mapper.defaultValue;
|
|
}
|
|
return responseBody;
|
|
}
|
|
let payload;
|
|
const mapperType = mapper.type.name;
|
|
if (!objectName) {
|
|
objectName = mapper.serializedName;
|
|
}
|
|
if (mapperType.match(/^Composite$/i) !== null) {
|
|
payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
|
|
}
|
|
else {
|
|
if (this.isXML) {
|
|
const xmlCharKey = updatedOptions.xml.xmlCharKey;
|
|
/**
|
|
* If the mapper specifies this as a non-composite type value but the responseBody contains
|
|
* both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
|
|
* then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
|
|
*/
|
|
if (responseBody[XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) {
|
|
responseBody = responseBody[xmlCharKey];
|
|
}
|
|
}
|
|
if (mapperType.match(/^Number$/i) !== null) {
|
|
payload = parseFloat(responseBody);
|
|
if (isNaN(payload)) {
|
|
payload = responseBody;
|
|
}
|
|
}
|
|
else if (mapperType.match(/^Boolean$/i) !== null) {
|
|
if (responseBody === "true") {
|
|
payload = true;
|
|
}
|
|
else if (responseBody === "false") {
|
|
payload = false;
|
|
}
|
|
else {
|
|
payload = responseBody;
|
|
}
|
|
}
|
|
else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
|
|
payload = responseBody;
|
|
}
|
|
else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
|
|
payload = new Date(responseBody);
|
|
}
|
|
else if (mapperType.match(/^UnixTime$/i) !== null) {
|
|
payload = unixTimeToDate(responseBody);
|
|
}
|
|
else if (mapperType.match(/^ByteArray$/i) !== null) {
|
|
payload = decodeString(responseBody);
|
|
}
|
|
else if (mapperType.match(/^Base64Url$/i) !== null) {
|
|
payload = base64UrlToByteArray(responseBody);
|
|
}
|
|
else if (mapperType.match(/^Sequence$/i) !== null) {
|
|
payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
|
|
}
|
|
else if (mapperType.match(/^Dictionary$/i) !== null) {
|
|
payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
|
|
}
|
|
}
|
|
if (mapper.isConstant) {
|
|
payload = mapper.defaultValue;
|
|
}
|
|
return payload;
|
|
}
|
|
}
|
|
/**
|
|
* Method that creates and returns a Serializer.
|
|
* @param modelMappers - Known models to map
|
|
* @param isXML - If XML should be supported
|
|
*/
|
|
function createSerializer(modelMappers = {}, isXML = false) {
|
|
return new SerializerImpl(modelMappers, isXML);
|
|
}
|
|
function trimEnd(str, ch) {
|
|
let len = str.length;
|
|
while (len - 1 >= 0 && str[len - 1] === ch) {
|
|
--len;
|
|
}
|
|
return str.substr(0, len);
|
|
}
|
|
function bufferToBase64Url(buffer) {
|
|
if (!buffer) {
|
|
return undefined;
|
|
}
|
|
if (!(buffer instanceof Uint8Array)) {
|
|
throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
|
|
}
|
|
// Uint8Array to Base64.
|
|
const str = encodeByteArray(buffer);
|
|
// Base64 to Base64Url.
|
|
return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
|
|
}
|
|
function base64UrlToByteArray(str) {
|
|
if (!str) {
|
|
return undefined;
|
|
}
|
|
if (str && typeof str.valueOf() !== "string") {
|
|
throw new Error("Please provide an input of type string for converting to Uint8Array");
|
|
}
|
|
// Base64Url to Base64.
|
|
str = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
// Base64 to Uint8Array.
|
|
return decodeString(str);
|
|
}
|
|
function splitSerializeName(prop) {
|
|
const classes = [];
|
|
let partialclass = "";
|
|
if (prop) {
|
|
const subwords = prop.split(".");
|
|
for (const item of subwords) {
|
|
if (item.charAt(item.length - 1) === "\\") {
|
|
partialclass += item.substr(0, item.length - 1) + ".";
|
|
}
|
|
else {
|
|
partialclass += item;
|
|
classes.push(partialclass);
|
|
partialclass = "";
|
|
}
|
|
}
|
|
}
|
|
return classes;
|
|
}
|
|
function dateToUnixTime(d) {
|
|
if (!d) {
|
|
return undefined;
|
|
}
|
|
if (typeof d.valueOf() === "string") {
|
|
d = new Date(d);
|
|
}
|
|
return Math.floor(d.getTime() / 1000);
|
|
}
|
|
function unixTimeToDate(n) {
|
|
if (!n) {
|
|
return undefined;
|
|
}
|
|
return new Date(n * 1000);
|
|
}
|
|
function serializeBasicTypes(typeName, objectName, value) {
|
|
if (value !== null && value !== undefined) {
|
|
if (typeName.match(/^Number$/i) !== null) {
|
|
if (typeof value !== "number") {
|
|
throw new Error(`${objectName} with value ${value} must be of type number.`);
|
|
}
|
|
}
|
|
else if (typeName.match(/^String$/i) !== null) {
|
|
if (typeof value.valueOf() !== "string") {
|
|
throw new Error(`${objectName} with value "${value}" must be of type string.`);
|
|
}
|
|
}
|
|
else if (typeName.match(/^Uuid$/i) !== null) {
|
|
if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {
|
|
throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
|
|
}
|
|
}
|
|
else if (typeName.match(/^Boolean$/i) !== null) {
|
|
if (typeof value !== "boolean") {
|
|
throw new Error(`${objectName} with value ${value} must be of type boolean.`);
|
|
}
|
|
}
|
|
else if (typeName.match(/^Stream$/i) !== null) {
|
|
const objectType = typeof value;
|
|
if (objectType !== "string" &&
|
|
typeof value.pipe !== "function" && // NodeJS.ReadableStream
|
|
typeof value.tee !== "function" && // browser ReadableStream
|
|
!(value instanceof ArrayBuffer) &&
|
|
!ArrayBuffer.isView(value) &&
|
|
// File objects count as a type of Blob, so we want to use instanceof explicitly
|
|
!((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob) &&
|
|
objectType !== "function") {
|
|
throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, ReadableStream, or () => ReadableStream.`);
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function serializeEnumType(objectName, allowedValues, value) {
|
|
if (!allowedValues) {
|
|
throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
|
|
}
|
|
const isPresent = allowedValues.some((item) => {
|
|
if (typeof item.valueOf() === "string") {
|
|
return item.toLowerCase() === value.toLowerCase();
|
|
}
|
|
return item === value;
|
|
});
|
|
if (!isPresent) {
|
|
throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
|
|
}
|
|
return value;
|
|
}
|
|
function serializeByteArrayType(objectName, value) {
|
|
if (value !== undefined && value !== null) {
|
|
if (!(value instanceof Uint8Array)) {
|
|
throw new Error(`${objectName} must be of type Uint8Array.`);
|
|
}
|
|
value = encodeByteArray(value);
|
|
}
|
|
return value;
|
|
}
|
|
function serializeBase64UrlType(objectName, value) {
|
|
if (value !== undefined && value !== null) {
|
|
if (!(value instanceof Uint8Array)) {
|
|
throw new Error(`${objectName} must be of type Uint8Array.`);
|
|
}
|
|
value = bufferToBase64Url(value);
|
|
}
|
|
return value;
|
|
}
|
|
function serializeDateTypes(typeName, value, objectName) {
|
|
if (value !== undefined && value !== null) {
|
|
if (typeName.match(/^Date$/i) !== null) {
|
|
if (!(value instanceof Date ||
|
|
(typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
|
|
throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
|
|
}
|
|
value =
|
|
value instanceof Date
|
|
? value.toISOString().substring(0, 10)
|
|
: new Date(value).toISOString().substring(0, 10);
|
|
}
|
|
else if (typeName.match(/^DateTime$/i) !== null) {
|
|
if (!(value instanceof Date ||
|
|
(typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
|
|
throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
|
|
}
|
|
value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
|
|
}
|
|
else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
|
|
if (!(value instanceof Date ||
|
|
(typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
|
|
throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
|
|
}
|
|
value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
|
|
}
|
|
else if (typeName.match(/^UnixTime$/i) !== null) {
|
|
if (!(value instanceof Date ||
|
|
(typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
|
|
throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
|
|
`for it to be serialized in UnixTime/Epoch format.`);
|
|
}
|
|
value = dateToUnixTime(value);
|
|
}
|
|
else if (typeName.match(/^TimeSpan$/i) !== null) {
|
|
if (!isDuration(value)) {
|
|
throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
|
|
if (!Array.isArray(object)) {
|
|
throw new Error(`${objectName} must be of type Array.`);
|
|
}
|
|
let elementType = mapper.type.element;
|
|
if (!elementType || typeof elementType !== "object") {
|
|
throw new Error(`"element" metadata for an Array must be defined in the ` +
|
|
`mapper and it must be of type "object" in ${objectName}.`);
|
|
}
|
|
// Quirk: Composite mappers referenced by `element` might
|
|
// not have *all* properties declared (like uberParent),
|
|
// so let's try to look up the full definition by name.
|
|
if (elementType.type.name === "Composite" && elementType.type.className) {
|
|
elementType = serializer.modelMappers[elementType.type.className] ?? elementType;
|
|
}
|
|
const tempArray = [];
|
|
for (let i = 0; i < object.length; i++) {
|
|
const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
|
|
if (isXml && elementType.xmlNamespace) {
|
|
const xmlnsKey = elementType.xmlNamespacePrefix
|
|
? `xmlns:${elementType.xmlNamespacePrefix}`
|
|
: "xmlns";
|
|
if (elementType.type.name === "Composite") {
|
|
tempArray[i] = { ...serializedValue };
|
|
tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
|
|
}
|
|
else {
|
|
tempArray[i] = {};
|
|
tempArray[i][options.xml.xmlCharKey] = serializedValue;
|
|
tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
|
|
}
|
|
}
|
|
else {
|
|
tempArray[i] = serializedValue;
|
|
}
|
|
}
|
|
return tempArray;
|
|
}
|
|
function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
|
|
if (typeof object !== "object") {
|
|
throw new Error(`${objectName} must be of type object.`);
|
|
}
|
|
const valueType = mapper.type.value;
|
|
if (!valueType || typeof valueType !== "object") {
|
|
throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
|
|
`mapper and it must of type "object" in ${objectName}.`);
|
|
}
|
|
const tempDictionary = {};
|
|
for (const key of Object.keys(object)) {
|
|
const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
|
|
// If the element needs an XML namespace we need to add it within the $ property
|
|
tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
|
|
}
|
|
// Add the namespace to the root element if needed
|
|
if (isXml && mapper.xmlNamespace) {
|
|
const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
|
|
const result = tempDictionary;
|
|
result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
|
|
return result;
|
|
}
|
|
return tempDictionary;
|
|
}
|
|
/**
|
|
* Resolves the additionalProperties property from a referenced mapper
|
|
* @param serializer - the serializer containing the entire set of mappers
|
|
* @param mapper - the composite mapper to resolve
|
|
* @param objectName - name of the object being serialized
|
|
*/
|
|
function resolveAdditionalProperties(serializer, mapper, objectName) {
|
|
const additionalProperties = mapper.type.additionalProperties;
|
|
if (!additionalProperties && mapper.type.className) {
|
|
const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
|
|
return modelMapper?.type.additionalProperties;
|
|
}
|
|
return additionalProperties;
|
|
}
|
|
/**
|
|
* Finds the mapper referenced by className
|
|
* @param serializer - the serializer containing the entire set of mappers
|
|
* @param mapper - the composite mapper to resolve
|
|
* @param objectName - name of the object being serialized
|
|
*/
|
|
function resolveReferencedMapper(serializer, mapper, objectName) {
|
|
const className = mapper.type.className;
|
|
if (!className) {
|
|
throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
|
|
}
|
|
return serializer.modelMappers[className];
|
|
}
|
|
/**
|
|
* Resolves a composite mapper's modelProperties.
|
|
* @param serializer - the serializer containing the entire set of mappers
|
|
* @param mapper - the composite mapper to resolve
|
|
*/
|
|
function resolveModelProperties(serializer, mapper, objectName) {
|
|
let modelProps = mapper.type.modelProperties;
|
|
if (!modelProps) {
|
|
const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
|
|
if (!modelMapper) {
|
|
throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
|
|
}
|
|
modelProps = modelMapper?.type.modelProperties;
|
|
if (!modelProps) {
|
|
throw new Error(`modelProperties cannot be null or undefined in the ` +
|
|
`mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
|
|
}
|
|
}
|
|
return modelProps;
|
|
}
|
|
function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
|
|
if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
|
|
mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
|
|
}
|
|
if (object !== undefined && object !== null) {
|
|
const payload = {};
|
|
const modelProps = resolveModelProperties(serializer, mapper, objectName);
|
|
for (const key of Object.keys(modelProps)) {
|
|
const propertyMapper = modelProps[key];
|
|
if (propertyMapper.readOnly) {
|
|
continue;
|
|
}
|
|
let propName;
|
|
let parentObject = payload;
|
|
if (serializer.isXML) {
|
|
if (propertyMapper.xmlIsWrapped) {
|
|
propName = propertyMapper.xmlName;
|
|
}
|
|
else {
|
|
propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
|
|
}
|
|
}
|
|
else {
|
|
const paths = splitSerializeName(propertyMapper.serializedName);
|
|
propName = paths.pop();
|
|
for (const pathName of paths) {
|
|
const childObject = parentObject[pathName];
|
|
if ((childObject === undefined || childObject === null) &&
|
|
((object[key] !== undefined && object[key] !== null) ||
|
|
propertyMapper.defaultValue !== undefined)) {
|
|
parentObject[pathName] = {};
|
|
}
|
|
parentObject = parentObject[pathName];
|
|
}
|
|
}
|
|
if (parentObject !== undefined && parentObject !== null) {
|
|
if (isXml && mapper.xmlNamespace) {
|
|
const xmlnsKey = mapper.xmlNamespacePrefix
|
|
? `xmlns:${mapper.xmlNamespacePrefix}`
|
|
: "xmlns";
|
|
parentObject[XML_ATTRKEY] = {
|
|
...parentObject[XML_ATTRKEY],
|
|
[xmlnsKey]: mapper.xmlNamespace,
|
|
};
|
|
}
|
|
const propertyObjectName = propertyMapper.serializedName !== ""
|
|
? objectName + "." + propertyMapper.serializedName
|
|
: objectName;
|
|
let toSerialize = object[key];
|
|
const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
|
|
if (polymorphicDiscriminator &&
|
|
polymorphicDiscriminator.clientName === key &&
|
|
(toSerialize === undefined || toSerialize === null)) {
|
|
toSerialize = mapper.serializedName;
|
|
}
|
|
const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
|
|
if (serializedValue !== undefined && propName !== undefined && propName !== null) {
|
|
const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
|
|
if (isXml && propertyMapper.xmlIsAttribute) {
|
|
// XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
|
|
// This keeps things simple while preventing name collision
|
|
// with names in user documents.
|
|
parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};
|
|
parentObject[XML_ATTRKEY][propName] = serializedValue;
|
|
}
|
|
else if (isXml && propertyMapper.xmlIsWrapped) {
|
|
parentObject[propName] = { [propertyMapper.xmlElementName]: value };
|
|
}
|
|
else {
|
|
parentObject[propName] = value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
|
|
if (additionalPropertiesMapper) {
|
|
const propNames = Object.keys(modelProps);
|
|
for (const clientPropName of Object.keys(object)) {
|
|
const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
|
|
if (isAdditionalProperty) {
|
|
Object.defineProperty(payload, clientPropName, {
|
|
value: serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options),
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return payload;
|
|
}
|
|
return object;
|
|
}
|
|
function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
|
|
if (!isXml || !propertyMapper.xmlNamespace) {
|
|
return serializedValue;
|
|
}
|
|
const xmlnsKey = propertyMapper.xmlNamespacePrefix
|
|
? `xmlns:${propertyMapper.xmlNamespacePrefix}`
|
|
: "xmlns";
|
|
const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
|
|
if (["Composite"].includes(propertyMapper.type.name)) {
|
|
if (serializedValue[XML_ATTRKEY]) {
|
|
return serializedValue;
|
|
}
|
|
else {
|
|
const result = { ...serializedValue };
|
|
result[XML_ATTRKEY] = xmlNamespace;
|
|
return result;
|
|
}
|
|
}
|
|
const result = {};
|
|
result[options.xml.xmlCharKey] = serializedValue;
|
|
result[XML_ATTRKEY] = xmlNamespace;
|
|
return result;
|
|
}
|
|
function isSpecialXmlProperty(propertyName, options) {
|
|
return [XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName);
|
|
}
|
|
function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
|
|
const xmlCharKey = options.xml.xmlCharKey ?? XML_CHARKEY;
|
|
if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
|
|
mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
|
|
}
|
|
const modelProps = resolveModelProperties(serializer, mapper, objectName);
|
|
let instance = {};
|
|
const handledPropertyNames = [];
|
|
for (const key of Object.keys(modelProps)) {
|
|
const propertyMapper = modelProps[key];
|
|
const paths = splitSerializeName(modelProps[key].serializedName);
|
|
handledPropertyNames.push(paths[0]);
|
|
const { serializedName, xmlName, xmlElementName } = propertyMapper;
|
|
let propertyObjectName = objectName;
|
|
if (serializedName !== "" && serializedName !== undefined) {
|
|
propertyObjectName = objectName + "." + serializedName;
|
|
}
|
|
const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
|
|
if (headerCollectionPrefix) {
|
|
const dictionary = {};
|
|
for (const headerKey of Object.keys(responseBody)) {
|
|
if (headerKey.startsWith(headerCollectionPrefix)) {
|
|
dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
|
|
}
|
|
handledPropertyNames.push(headerKey);
|
|
}
|
|
instance[key] = dictionary;
|
|
}
|
|
else if (serializer.isXML) {
|
|
if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {
|
|
instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);
|
|
}
|
|
else if (propertyMapper.xmlIsMsText) {
|
|
if (responseBody[xmlCharKey] !== undefined) {
|
|
instance[key] = responseBody[xmlCharKey];
|
|
}
|
|
else if (typeof responseBody === "string") {
|
|
// The special case where xml parser parses "<Name>content</Name>" into JSON of
|
|
// `{ name: "content"}` instead of `{ name: { "_": "content" }}`
|
|
instance[key] = responseBody;
|
|
}
|
|
}
|
|
else {
|
|
const propertyName = xmlElementName || xmlName || serializedName;
|
|
if (propertyMapper.xmlIsWrapped) {
|
|
/* a list of <xmlElementName> wrapped by <xmlName>
|
|
For the xml example below
|
|
<Cors>
|
|
<CorsRule>...</CorsRule>
|
|
<CorsRule>...</CorsRule>
|
|
</Cors>
|
|
the responseBody has
|
|
{
|
|
Cors: {
|
|
CorsRule: [{...}, {...}]
|
|
}
|
|
}
|
|
xmlName is "Cors" and xmlElementName is"CorsRule".
|
|
*/
|
|
const wrapped = responseBody[xmlName];
|
|
const elementList = wrapped?.[xmlElementName] ?? [];
|
|
Object.defineProperty(instance, key, {
|
|
value: serializer.deserialize(propertyMapper, elementList, propertyObjectName, options),
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
});
|
|
handledPropertyNames.push(xmlName);
|
|
}
|
|
else {
|
|
const property = responseBody[propertyName];
|
|
instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
|
|
handledPropertyNames.push(propertyName);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// deserialize the property if it is present in the provided responseBody instance
|
|
let propertyInstance;
|
|
let res = responseBody;
|
|
// traversing the object step by step.
|
|
let steps = 0;
|
|
for (const item of paths) {
|
|
if (!res)
|
|
break;
|
|
steps++;
|
|
res = res[item];
|
|
}
|
|
// only accept null when reaching the last position of object otherwise it would be undefined
|
|
if (res === null && steps < paths.length) {
|
|
res = undefined;
|
|
}
|
|
propertyInstance = res;
|
|
const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
|
|
// checking that the model property name (key)(ex: "fishtype") and the
|
|
// clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
|
|
// instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
|
|
// is a better approach. The generator is not consistent with escaping '\.' in the
|
|
// serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
|
|
// and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
|
|
// the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
|
|
// the transformation of model property name (ex: "fishtype") is done consistently.
|
|
// Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
|
|
if (polymorphicDiscriminator &&
|
|
key === polymorphicDiscriminator.clientName &&
|
|
(propertyInstance === undefined || propertyInstance === null)) {
|
|
propertyInstance = mapper.serializedName;
|
|
}
|
|
let serializedValue;
|
|
// paging
|
|
if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
|
|
propertyInstance = responseBody[key];
|
|
const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
|
|
// Copy over any properties that have already been added into the instance, where they do
|
|
// not exist on the newly de-serialized array
|
|
for (const [k, v] of Object.entries(instance)) {
|
|
if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
|
|
arrayInstance[k] = v;
|
|
}
|
|
}
|
|
instance = arrayInstance;
|
|
}
|
|
else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
|
|
serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
|
|
instance[key] = serializedValue;
|
|
}
|
|
}
|
|
}
|
|
const additionalPropertiesMapper = mapper.type.additionalProperties;
|
|
if (additionalPropertiesMapper) {
|
|
const isAdditionalProperty = (responsePropName) => {
|
|
for (const clientPropName of Object.keys(modelProps)) {
|
|
const paths = splitSerializeName(modelProps[clientPropName].serializedName);
|
|
if (paths[0] === responsePropName) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
for (const responsePropName of Object.keys(responseBody)) {
|
|
if (isAdditionalProperty(responsePropName)) {
|
|
const deserializedValue = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
|
|
Object.defineProperty(instance, responsePropName, {
|
|
value: deserializedValue,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
else if (responseBody && !options.ignoreUnknownProperties) {
|
|
for (const key of Object.keys(responseBody)) {
|
|
if (instance[key] === undefined &&
|
|
!handledPropertyNames.includes(key) &&
|
|
!isSpecialXmlProperty(key, options)) {
|
|
Object.defineProperty(instance, key, {
|
|
value: responseBody[key],
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return instance;
|
|
}
|
|
function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
|
|
/* jshint validthis: true */
|
|
const value = mapper.type.value;
|
|
if (!value || typeof value !== "object") {
|
|
throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
|
|
`mapper and it must of type "object" in ${objectName}`);
|
|
}
|
|
if (responseBody) {
|
|
const tempDictionary = {};
|
|
for (const key of Object.keys(responseBody)) {
|
|
tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
|
|
}
|
|
return tempDictionary;
|
|
}
|
|
return responseBody;
|
|
}
|
|
function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
|
|
let element = mapper.type.element;
|
|
if (!element || typeof element !== "object") {
|
|
throw new Error(`"element" metadata for an Array must be defined in the ` +
|
|
`mapper and it must be of type "object" in ${objectName}`);
|
|
}
|
|
if (responseBody) {
|
|
if (!Array.isArray(responseBody)) {
|
|
// xml2js will interpret a single element array as just the element, so force it to be an array
|
|
responseBody = [responseBody];
|
|
}
|
|
// Quirk: Composite mappers referenced by `element` might
|
|
// not have *all* properties declared (like uberParent),
|
|
// so let's try to look up the full definition by name.
|
|
if (element.type.name === "Composite" && element.type.className) {
|
|
element = serializer.modelMappers[element.type.className] ?? element;
|
|
}
|
|
const tempArray = [];
|
|
for (let i = 0; i < responseBody.length; i++) {
|
|
tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
|
|
}
|
|
return tempArray;
|
|
}
|
|
return responseBody;
|
|
}
|
|
function getIndexDiscriminator(discriminators, discriminatorValue, typeName) {
|
|
const typeNamesToCheck = [typeName];
|
|
while (typeNamesToCheck.length) {
|
|
const currentName = typeNamesToCheck.shift();
|
|
const indexDiscriminator = discriminatorValue === currentName
|
|
? discriminatorValue
|
|
: currentName + "." + discriminatorValue;
|
|
if (Object.prototype.hasOwnProperty.call(discriminators, indexDiscriminator)) {
|
|
return discriminators[indexDiscriminator];
|
|
}
|
|
else {
|
|
for (const [name, mapper] of Object.entries(discriminators)) {
|
|
if (name.startsWith(currentName + ".") &&
|
|
mapper.type.uberParent === currentName &&
|
|
mapper.type.className) {
|
|
typeNamesToCheck.push(mapper.type.className);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
|
|
const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
|
|
if (polymorphicDiscriminator) {
|
|
let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
|
|
if (discriminatorName) {
|
|
// The serializedName might have \\, which we just want to ignore
|
|
if (polymorphicPropertyName === "serializedName") {
|
|
discriminatorName = discriminatorName.replace(/\\/gi, "");
|
|
}
|
|
const discriminatorValue = object[discriminatorName];
|
|
const typeName = mapper.type.uberParent ?? mapper.type.className;
|
|
if (typeof discriminatorValue === "string" && typeName) {
|
|
const polymorphicMapper = getIndexDiscriminator(serializer.modelMappers.discriminators, discriminatorValue, typeName);
|
|
if (polymorphicMapper) {
|
|
mapper = polymorphicMapper;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return mapper;
|
|
}
|
|
function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
|
|
return (mapper.type.polymorphicDiscriminator ||
|
|
getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
|
|
getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
|
|
}
|
|
function getPolymorphicDiscriminatorSafely(serializer, typeName) {
|
|
return (typeName &&
|
|
serializer.modelMappers[typeName] &&
|
|
serializer.modelMappers[typeName].type.polymorphicDiscriminator);
|
|
}
|
|
/**
|
|
* Known types of Mappers
|
|
*/
|
|
const MapperTypeNames = {
|
|
Base64Url: "Base64Url",
|
|
Boolean: "Boolean",
|
|
ByteArray: "ByteArray",
|
|
Composite: "Composite",
|
|
Date: "Date",
|
|
DateTime: "DateTime",
|
|
DateTimeRfc1123: "DateTimeRfc1123",
|
|
Dictionary: "Dictionary",
|
|
Enum: "Enum",
|
|
Number: "Number",
|
|
Object: "Object",
|
|
Sequence: "Sequence",
|
|
String: "String",
|
|
Stream: "Stream",
|
|
TimeSpan: "TimeSpan",
|
|
UnixTime: "UnixTime",
|
|
};
|
|
//# sourceMappingURL=serializer.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@azure/core-client/dist/commonjs/state-cjs.js
|
|
var commonjs_state_cjs = __webpack_require__(30);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/state.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
// @ts-expect-error The recommended approach to sharing module state between ESM and CJS.
|
|
// See https://github.com/isaacs/tshy/blob/main/README.md#module-local-state for additional information.
|
|
|
|
/**
|
|
* Defines the shared state between CJS and ESM by re-exporting the CJS state.
|
|
*/
|
|
const esm_state_state = commonjs_state_cjs/* state */.w;
|
|
//# sourceMappingURL=state.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/operationHelpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* @internal
|
|
* Retrieves the value to use for a given operation argument
|
|
* @param operationArguments - The arguments passed from the generated client
|
|
* @param parameter - The parameter description
|
|
* @param fallbackObject - If something isn't found in the arguments bag, look here.
|
|
* Generally used to look at the service client properties.
|
|
*/
|
|
function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) {
|
|
let parameterPath = parameter.parameterPath;
|
|
const parameterMapper = parameter.mapper;
|
|
let value;
|
|
if (typeof parameterPath === "string") {
|
|
parameterPath = [parameterPath];
|
|
}
|
|
if (Array.isArray(parameterPath)) {
|
|
if (parameterPath.length > 0) {
|
|
if (parameterMapper.isConstant) {
|
|
value = parameterMapper.defaultValue;
|
|
}
|
|
else {
|
|
let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
|
|
if (!propertySearchResult.propertyFound && fallbackObject) {
|
|
propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath);
|
|
}
|
|
let useDefaultValue = false;
|
|
if (!propertySearchResult.propertyFound) {
|
|
useDefaultValue =
|
|
parameterMapper.required ||
|
|
(parameterPath[0] === "options" && parameterPath.length === 2);
|
|
}
|
|
value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (parameterMapper.required) {
|
|
value = {};
|
|
}
|
|
for (const [propertyName, propertyPath] of Object.entries(parameterPath)) {
|
|
const propertyMapper = parameterMapper.type.modelProperties[propertyName];
|
|
const propertyValue = getOperationArgumentValueFromParameter(operationArguments, {
|
|
parameterPath: propertyPath,
|
|
mapper: propertyMapper,
|
|
}, fallbackObject);
|
|
if (propertyValue !== undefined) {
|
|
if (!value) {
|
|
value = {};
|
|
}
|
|
Object.defineProperty(value, propertyName, {
|
|
value: propertyValue,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
function getPropertyFromParameterPath(parent, parameterPath) {
|
|
const result = { propertyFound: false };
|
|
let i = 0;
|
|
for (; i < parameterPath.length; ++i) {
|
|
const parameterPathPart = parameterPath[i];
|
|
// Make sure to check inherited properties too, so don't use hasOwnProperty().
|
|
if (parent && parameterPathPart in parent) {
|
|
parent = parent[parameterPathPart];
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
if (i === parameterPath.length) {
|
|
result.propertyValue = parent;
|
|
result.propertyFound = true;
|
|
}
|
|
return result;
|
|
}
|
|
const originalRequestSymbol = Symbol.for("@azure/core-client original request");
|
|
function hasOriginalRequest(request) {
|
|
return originalRequestSymbol in request;
|
|
}
|
|
function getOperationRequestInfo(request) {
|
|
if (hasOriginalRequest(request)) {
|
|
return getOperationRequestInfo(request[originalRequestSymbol]);
|
|
}
|
|
let info = esm_state_state.operationRequestMap.get(request);
|
|
if (!info) {
|
|
info = {};
|
|
esm_state_state.operationRequestMap.set(request, info);
|
|
}
|
|
return info;
|
|
}
|
|
//# sourceMappingURL=operationHelpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/deserializationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
const defaultJsonContentTypes = ["application/json", "text/json"];
|
|
const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
|
|
/**
|
|
* The programmatic identifier of the deserializationPolicy.
|
|
*/
|
|
const deserializationPolicyName = "deserializationPolicy";
|
|
/**
|
|
* This policy handles parsing out responses according to OperationSpecs on the request.
|
|
*/
|
|
function deserializationPolicy(options = {}) {
|
|
const jsonContentTypes = options.expectedContentTypes?.json ?? defaultJsonContentTypes;
|
|
const xmlContentTypes = options.expectedContentTypes?.xml ?? defaultXmlContentTypes;
|
|
const parseXML = options.parseXML;
|
|
const serializerOptions = options.serializerOptions;
|
|
const updatedOptions = {
|
|
xml: {
|
|
rootName: serializerOptions?.xml.rootName ?? "",
|
|
includeRoot: serializerOptions?.xml.includeRoot ?? false,
|
|
xmlCharKey: serializerOptions?.xml.xmlCharKey ?? XML_CHARKEY,
|
|
},
|
|
};
|
|
return {
|
|
name: deserializationPolicyName,
|
|
async sendRequest(request, next) {
|
|
const response = await next(request);
|
|
return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML);
|
|
},
|
|
};
|
|
}
|
|
function getOperationResponseMap(parsedResponse) {
|
|
let result;
|
|
const request = parsedResponse.request;
|
|
const operationInfo = getOperationRequestInfo(request);
|
|
const operationSpec = operationInfo?.operationSpec;
|
|
if (operationSpec) {
|
|
if (!operationInfo?.operationResponseGetter) {
|
|
result = operationSpec.responses[parsedResponse.status];
|
|
}
|
|
else {
|
|
result = operationInfo?.operationResponseGetter(operationSpec, parsedResponse);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function shouldDeserializeResponse(parsedResponse) {
|
|
const request = parsedResponse.request;
|
|
const operationInfo = getOperationRequestInfo(request);
|
|
const shouldDeserialize = operationInfo?.shouldDeserialize;
|
|
let result;
|
|
if (shouldDeserialize === undefined) {
|
|
result = true;
|
|
}
|
|
else if (typeof shouldDeserialize === "boolean") {
|
|
result = shouldDeserialize;
|
|
}
|
|
else {
|
|
result = shouldDeserialize(parsedResponse);
|
|
}
|
|
return result;
|
|
}
|
|
async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) {
|
|
const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML);
|
|
if (!shouldDeserializeResponse(parsedResponse)) {
|
|
return parsedResponse;
|
|
}
|
|
const operationInfo = getOperationRequestInfo(parsedResponse.request);
|
|
const operationSpec = operationInfo?.operationSpec;
|
|
if (!operationSpec || !operationSpec.responses) {
|
|
return parsedResponse;
|
|
}
|
|
const responseSpec = getOperationResponseMap(parsedResponse);
|
|
const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec, options);
|
|
if (error) {
|
|
throw error;
|
|
}
|
|
else if (shouldReturnResponse) {
|
|
return parsedResponse;
|
|
}
|
|
// An operation response spec does exist for current status code, so
|
|
// use it to deserialize the response.
|
|
if (responseSpec) {
|
|
if (responseSpec.bodyMapper) {
|
|
let valueToDeserialize = parsedResponse.parsedBody;
|
|
if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperTypeNames.Sequence) {
|
|
valueToDeserialize =
|
|
typeof valueToDeserialize === "object"
|
|
? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
|
|
: [];
|
|
}
|
|
try {
|
|
parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);
|
|
}
|
|
catch (deserializeError) {
|
|
const restError = new esm_restError_RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, {
|
|
statusCode: parsedResponse.status,
|
|
request: parsedResponse.request,
|
|
response: parsedResponse,
|
|
});
|
|
throw restError;
|
|
}
|
|
}
|
|
else if (operationSpec.httpMethod === "HEAD") {
|
|
// head methods never have a body, but we return a boolean to indicate presence/absence of the resource
|
|
parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
|
|
}
|
|
if (responseSpec.headersMapper) {
|
|
parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders", { xml: {}, ignoreUnknownProperties: true });
|
|
}
|
|
}
|
|
return parsedResponse;
|
|
}
|
|
function isOperationSpecEmpty(operationSpec) {
|
|
const expectedStatusCodes = Object.keys(operationSpec.responses);
|
|
return (expectedStatusCodes.length === 0 ||
|
|
(expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
|
|
}
|
|
function handleErrorResponse(parsedResponse, operationSpec, responseSpec, options) {
|
|
const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
|
|
const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
|
|
? isSuccessByStatus
|
|
: !!responseSpec;
|
|
if (isExpectedStatusCode) {
|
|
if (responseSpec) {
|
|
if (!responseSpec.isError) {
|
|
return { error: null, shouldReturnResponse: false };
|
|
}
|
|
}
|
|
else {
|
|
return { error: null, shouldReturnResponse: false };
|
|
}
|
|
}
|
|
const errorResponseSpec = responseSpec ?? operationSpec.responses.default;
|
|
const initialErrorMessage = parsedResponse.request.streamResponseStatusCodes?.has(parsedResponse.status)
|
|
? `Unexpected status code: ${parsedResponse.status}`
|
|
: parsedResponse.bodyAsText;
|
|
const error = new esm_restError_RestError(initialErrorMessage, {
|
|
statusCode: parsedResponse.status,
|
|
request: parsedResponse.request,
|
|
response: parsedResponse,
|
|
});
|
|
// If the item failed but there's no error spec or default spec to deserialize the error,
|
|
// and the parsed body doesn't look like an error object,
|
|
// we should fail so we just throw the parsed response
|
|
if (!errorResponseSpec &&
|
|
!(parsedResponse.parsedBody?.error?.code && parsedResponse.parsedBody?.error?.message)) {
|
|
throw error;
|
|
}
|
|
const defaultBodyMapper = errorResponseSpec?.bodyMapper;
|
|
const defaultHeadersMapper = errorResponseSpec?.headersMapper;
|
|
try {
|
|
// If error response has a body, try to deserialize it using default body mapper.
|
|
// Then try to extract error code & message from it
|
|
if (parsedResponse.parsedBody) {
|
|
const parsedBody = parsedResponse.parsedBody;
|
|
let deserializedError;
|
|
if (defaultBodyMapper) {
|
|
let valueToDeserialize = parsedBody;
|
|
if (operationSpec.isXML && defaultBodyMapper.type.name === MapperTypeNames.Sequence) {
|
|
valueToDeserialize = [];
|
|
const elementName = defaultBodyMapper.xmlElementName;
|
|
if (typeof parsedBody === "object" && elementName) {
|
|
valueToDeserialize = parsedBody[elementName];
|
|
}
|
|
}
|
|
deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody", options);
|
|
}
|
|
const internalError = parsedBody.error || deserializedError || parsedBody;
|
|
error.code = internalError.code;
|
|
if (internalError.message) {
|
|
error.message = internalError.message;
|
|
}
|
|
if (defaultBodyMapper) {
|
|
error.response.parsedBody = deserializedError;
|
|
}
|
|
}
|
|
// If error response has headers, try to deserialize it using default header mapper
|
|
if (parsedResponse.headers && defaultHeadersMapper) {
|
|
error.response.parsedHeaders =
|
|
operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
|
|
}
|
|
}
|
|
catch (defaultError) {
|
|
error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
|
|
}
|
|
return { error, shouldReturnResponse: false };
|
|
}
|
|
async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) {
|
|
if (!operationResponse.request.streamResponseStatusCodes?.has(operationResponse.status) &&
|
|
operationResponse.bodyAsText) {
|
|
const text = operationResponse.bodyAsText;
|
|
const contentType = operationResponse.headers.get("Content-Type") || "";
|
|
const contentComponents = !contentType
|
|
? []
|
|
: contentType.split(";").map((component) => component.toLowerCase());
|
|
try {
|
|
if (contentComponents.length === 0 ||
|
|
contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
|
|
operationResponse.parsedBody = JSON.parse(text);
|
|
return operationResponse;
|
|
}
|
|
else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
|
|
if (!parseXML) {
|
|
throw new Error("Parsing XML not supported.");
|
|
}
|
|
const body = await parseXML(text, opts.xml);
|
|
operationResponse.parsedBody = body;
|
|
return operationResponse;
|
|
}
|
|
}
|
|
catch (err) {
|
|
const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
|
|
const errCode = err.code || esm_restError_RestError.PARSE_ERROR;
|
|
const e = new esm_restError_RestError(msg, {
|
|
code: errCode,
|
|
statusCode: operationResponse.status,
|
|
request: operationResponse.request,
|
|
response: operationResponse,
|
|
});
|
|
throw e;
|
|
}
|
|
}
|
|
return operationResponse;
|
|
}
|
|
//# sourceMappingURL=deserializationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/interfaceHelpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Gets the list of status codes for streaming responses.
|
|
* @internal
|
|
*/
|
|
function getStreamingResponseStatusCodes(operationSpec) {
|
|
const result = new Set();
|
|
for (const [statusCode, operationResponse] of Object.entries(operationSpec.responses)) {
|
|
if (operationResponse.bodyMapper &&
|
|
operationResponse.bodyMapper.type.name === MapperTypeNames.Stream) {
|
|
result.add(Number(statusCode));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Get the path to this parameter's value as a dotted string (a.b.c).
|
|
* @param parameter - The parameter to get the path string for.
|
|
* @returns The path to this parameter's value as a dotted string.
|
|
* @internal
|
|
*/
|
|
function getPathStringFromParameter(parameter) {
|
|
const { parameterPath, mapper } = parameter;
|
|
let result;
|
|
if (typeof parameterPath === "string") {
|
|
result = parameterPath;
|
|
}
|
|
else if (Array.isArray(parameterPath)) {
|
|
result = parameterPath.join(".");
|
|
}
|
|
else {
|
|
result = mapper.serializedName;
|
|
}
|
|
return result;
|
|
}
|
|
//# sourceMappingURL=interfaceHelpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/serializationPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the serializationPolicy.
|
|
*/
|
|
const serializationPolicyName = "serializationPolicy";
|
|
/**
|
|
* This policy handles assembling the request body and headers using
|
|
* an OperationSpec and OperationArguments on the request.
|
|
*/
|
|
function serializationPolicy(options = {}) {
|
|
const stringifyXML = options.stringifyXML;
|
|
return {
|
|
name: serializationPolicyName,
|
|
sendRequest(request, next) {
|
|
const operationInfo = getOperationRequestInfo(request);
|
|
const operationSpec = operationInfo?.operationSpec;
|
|
const operationArguments = operationInfo?.operationArguments;
|
|
if (operationSpec && operationArguments) {
|
|
serializeHeaders(request, operationArguments, operationSpec);
|
|
serializeRequestBody(request, operationArguments, operationSpec, stringifyXML);
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
function serializeHeaders(request, operationArguments, operationSpec) {
|
|
if (operationSpec.headerParameters) {
|
|
for (const headerParameter of operationSpec.headerParameters) {
|
|
let headerValue = getOperationArgumentValueFromParameter(operationArguments, headerParameter);
|
|
if ((headerValue !== null && headerValue !== undefined) || headerParameter.mapper.required) {
|
|
headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter));
|
|
const headerCollectionPrefix = headerParameter.mapper
|
|
.headerCollectionPrefix;
|
|
if (headerCollectionPrefix) {
|
|
for (const key of Object.keys(headerValue)) {
|
|
request.headers.set(headerCollectionPrefix + key, headerValue[key]);
|
|
}
|
|
}
|
|
else {
|
|
request.headers.set(headerParameter.mapper.serializedName || getPathStringFromParameter(headerParameter), headerValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const customHeaders = operationArguments.options?.requestOptions?.customHeaders;
|
|
if (customHeaders) {
|
|
for (const customHeaderName of Object.keys(customHeaders)) {
|
|
request.headers.set(customHeaderName, customHeaders[customHeaderName]);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* @internal
|
|
*/
|
|
function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function () {
|
|
throw new Error("XML serialization unsupported!");
|
|
}) {
|
|
const serializerOptions = operationArguments.options?.serializerOptions;
|
|
const updatedOptions = {
|
|
xml: {
|
|
rootName: serializerOptions?.xml.rootName ?? "",
|
|
includeRoot: serializerOptions?.xml.includeRoot ?? false,
|
|
xmlCharKey: serializerOptions?.xml.xmlCharKey ?? XML_CHARKEY,
|
|
},
|
|
};
|
|
const xmlCharKey = updatedOptions.xml.xmlCharKey;
|
|
if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
|
|
request.body = getOperationArgumentValueFromParameter(operationArguments, operationSpec.requestBody);
|
|
const bodyMapper = operationSpec.requestBody.mapper;
|
|
const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable, } = bodyMapper;
|
|
const typeName = bodyMapper.type.name;
|
|
try {
|
|
if ((request.body !== undefined && request.body !== null) ||
|
|
(nullable && request.body === null) ||
|
|
required) {
|
|
const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);
|
|
request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions);
|
|
const isStream = typeName === MapperTypeNames.Stream;
|
|
if (operationSpec.isXML) {
|
|
const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
|
|
const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions);
|
|
if (typeName === MapperTypeNames.Sequence) {
|
|
request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey });
|
|
}
|
|
else if (!isStream) {
|
|
request.body = stringifyXML(value, {
|
|
rootName: xmlName || serializedName,
|
|
xmlCharKey,
|
|
});
|
|
}
|
|
}
|
|
else if (typeName === MapperTypeNames.String &&
|
|
(operationSpec.contentType?.match("text/plain") || operationSpec.mediaType === "text")) {
|
|
// the String serializer has validated that request body is a string
|
|
// so just send the string.
|
|
return;
|
|
}
|
|
else if (!isStream) {
|
|
request.body = JSON.stringify(request.body);
|
|
}
|
|
}
|
|
}
|
|
catch (error) {
|
|
throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, " ")}.`);
|
|
}
|
|
}
|
|
else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
|
|
request.formData = {};
|
|
for (const formDataParameter of operationSpec.formDataParameters) {
|
|
const formDataParameterValue = getOperationArgumentValueFromParameter(operationArguments, formDataParameter);
|
|
if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
|
|
const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);
|
|
request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
|
|
*/
|
|
function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
|
|
// Composite and Sequence schemas already got their root namespace set during serialization
|
|
// We just need to add xmlns to the other schema types
|
|
if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
|
|
const result = {};
|
|
result[options.xml.xmlCharKey] = serializedValue;
|
|
result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
|
|
return result;
|
|
}
|
|
return serializedValue;
|
|
}
|
|
function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
|
|
if (!Array.isArray(obj)) {
|
|
obj = [obj];
|
|
}
|
|
if (!xmlNamespaceKey || !xmlNamespace) {
|
|
return { [elementName]: obj };
|
|
}
|
|
const result = { [elementName]: obj };
|
|
result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
|
|
return result;
|
|
}
|
|
//# sourceMappingURL=serializationPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/pipeline.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* Creates a new Pipeline for use with a Service Client.
|
|
* Adds in deserializationPolicy by default.
|
|
* Also adds in bearerTokenAuthenticationPolicy if passed a TokenCredential.
|
|
* @param options - Options to customize the created pipeline.
|
|
*/
|
|
function createClientPipeline(options = {}) {
|
|
const pipeline = esm_createPipelineFromOptions_createPipelineFromOptions(options ?? {});
|
|
if (options.credentialOptions) {
|
|
pipeline.addPolicy(bearerTokenAuthenticationPolicy({
|
|
credential: options.credentialOptions.credential,
|
|
scopes: options.credentialOptions.credentialScopes,
|
|
}));
|
|
}
|
|
pipeline.addPolicy(serializationPolicy(options.serializationOptions), { phase: "Serialize" });
|
|
pipeline.addPolicy(deserializationPolicy(options.deserializationOptions), {
|
|
phase: "Deserialize",
|
|
});
|
|
return pipeline;
|
|
}
|
|
//# sourceMappingURL=pipeline.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/httpClientCache.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
let httpClientCache_cachedHttpClient;
|
|
function getCachedDefaultHttpClient() {
|
|
if (!httpClientCache_cachedHttpClient) {
|
|
httpClientCache_cachedHttpClient = esm_defaultHttpClient_createDefaultHttpClient();
|
|
}
|
|
return httpClientCache_cachedHttpClient;
|
|
}
|
|
//# sourceMappingURL=httpClientCache.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/urlHelpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
const CollectionFormatToDelimiterMap = {
|
|
CSV: ",",
|
|
SSV: " ",
|
|
Multi: "Multi",
|
|
TSV: "\t",
|
|
Pipes: "|",
|
|
};
|
|
function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
|
|
const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
|
|
let isAbsolutePath = false;
|
|
let requestUrl = replaceAll(baseUri, urlReplacements);
|
|
if (operationSpec.path) {
|
|
let path = replaceAll(operationSpec.path, urlReplacements);
|
|
// QUIRK: sometimes we get a path component like /{nextLink}
|
|
// which may be a fully formed URL with a leading /. In that case, we should
|
|
// remove the leading /
|
|
if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
|
|
path = path.substring(1);
|
|
}
|
|
// QUIRK: sometimes we get a path component like {nextLink}
|
|
// which may be a fully formed URL. In that case, we should
|
|
// ignore the baseUri.
|
|
if (isAbsoluteUrl(path)) {
|
|
requestUrl = path;
|
|
isAbsolutePath = true;
|
|
}
|
|
else {
|
|
requestUrl = appendPath(requestUrl, path);
|
|
}
|
|
}
|
|
const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
|
|
/**
|
|
* Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
|
|
* is an absolute path. This ensures that existing query parameter values in `requestUrl`
|
|
* do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
|
|
* is still being built so there is nothing to overwrite.
|
|
*/
|
|
requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
|
|
return requestUrl;
|
|
}
|
|
function replaceAll(input, replacements) {
|
|
let result = input;
|
|
for (const [searchValue, replaceValue] of replacements) {
|
|
result = result.split(searchValue).join(replaceValue);
|
|
}
|
|
return result;
|
|
}
|
|
function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
|
|
const result = new Map();
|
|
if (operationSpec.urlParameters?.length) {
|
|
for (const urlParameter of operationSpec.urlParameters) {
|
|
let urlParameterValue = getOperationArgumentValueFromParameter(operationArguments, urlParameter, fallbackObject);
|
|
const parameterPathString = getPathStringFromParameter(urlParameter);
|
|
urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
|
|
if (!urlParameter.skipEncoding) {
|
|
urlParameterValue = encodeURIComponent(urlParameterValue);
|
|
}
|
|
result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function isAbsoluteUrl(url) {
|
|
return url.includes("://");
|
|
}
|
|
function appendPath(url, pathToAppend) {
|
|
if (!pathToAppend) {
|
|
return url;
|
|
}
|
|
const parsedUrl = new URL(url);
|
|
let newPath = parsedUrl.pathname;
|
|
if (!newPath.endsWith("/")) {
|
|
newPath = `${newPath}/`;
|
|
}
|
|
if (pathToAppend.startsWith("/")) {
|
|
pathToAppend = pathToAppend.substring(1);
|
|
}
|
|
const searchStart = pathToAppend.indexOf("?");
|
|
if (searchStart !== -1) {
|
|
const path = pathToAppend.substring(0, searchStart);
|
|
const search = pathToAppend.substring(searchStart + 1);
|
|
newPath = newPath + path;
|
|
if (search) {
|
|
parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
|
|
}
|
|
}
|
|
else {
|
|
newPath = newPath + pathToAppend;
|
|
}
|
|
// Use Object.assign to bypass react-native's incorrect readonly URL.pathname declaration
|
|
Object.assign(parsedUrl, { pathname: newPath });
|
|
return parsedUrl.toString();
|
|
}
|
|
function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
|
|
const result = new Map();
|
|
const sequenceParams = new Set();
|
|
if (operationSpec.queryParameters?.length) {
|
|
for (const queryParameter of operationSpec.queryParameters) {
|
|
if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
|
|
sequenceParams.add(queryParameter.mapper.serializedName);
|
|
}
|
|
let queryParameterValue = getOperationArgumentValueFromParameter(operationArguments, queryParameter, fallbackObject);
|
|
if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
|
|
queryParameter.mapper.required) {
|
|
queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter));
|
|
const delimiter = queryParameter.collectionFormat
|
|
? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
|
|
: "";
|
|
if (Array.isArray(queryParameterValue)) {
|
|
// replace null and undefined
|
|
queryParameterValue = queryParameterValue.map((item) => {
|
|
if (item === null || item === undefined) {
|
|
return "";
|
|
}
|
|
return item;
|
|
});
|
|
}
|
|
if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
|
|
continue;
|
|
}
|
|
else if (Array.isArray(queryParameterValue) &&
|
|
(queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
|
|
queryParameterValue = queryParameterValue.join(delimiter);
|
|
}
|
|
if (!queryParameter.skipEncoding) {
|
|
if (Array.isArray(queryParameterValue)) {
|
|
queryParameterValue = queryParameterValue.map((item) => {
|
|
return encodeURIComponent(item);
|
|
});
|
|
}
|
|
else {
|
|
queryParameterValue = encodeURIComponent(queryParameterValue);
|
|
}
|
|
}
|
|
// Join pipes and CSV *after* encoding, or the server will be upset.
|
|
if (Array.isArray(queryParameterValue) &&
|
|
(queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
|
|
queryParameterValue = queryParameterValue.join(delimiter);
|
|
}
|
|
result.set(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
queryParams: result,
|
|
sequenceParams,
|
|
};
|
|
}
|
|
function simpleParseQueryParams(queryString) {
|
|
const result = new Map();
|
|
if (!queryString || queryString[0] !== "?") {
|
|
return result;
|
|
}
|
|
// remove the leading ?
|
|
queryString = queryString.slice(1);
|
|
const pairs = queryString.split("&");
|
|
for (const pair of pairs) {
|
|
const [name, value] = pair.split("=", 2);
|
|
const existingValue = result.get(name);
|
|
if (existingValue) {
|
|
if (Array.isArray(existingValue)) {
|
|
existingValue.push(value);
|
|
}
|
|
else {
|
|
result.set(name, [existingValue, value]);
|
|
}
|
|
}
|
|
else {
|
|
result.set(name, value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/** @internal */
|
|
function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
|
|
if (queryParams.size === 0) {
|
|
return url;
|
|
}
|
|
const parsedUrl = new URL(url);
|
|
// QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
|
|
// can change their meaning to the server, such as in the case of a SAS signature.
|
|
// To avoid accidentally un-encoding a query param, we parse the key/values ourselves
|
|
const combinedParams = simpleParseQueryParams(parsedUrl.search);
|
|
for (const [name, value] of queryParams) {
|
|
const existingValue = combinedParams.get(name);
|
|
if (Array.isArray(existingValue)) {
|
|
if (Array.isArray(value)) {
|
|
existingValue.push(...value);
|
|
const valueSet = new Set(existingValue);
|
|
combinedParams.set(name, Array.from(valueSet));
|
|
}
|
|
else {
|
|
existingValue.push(value);
|
|
}
|
|
}
|
|
else if (existingValue) {
|
|
if (Array.isArray(value)) {
|
|
value.unshift(existingValue);
|
|
}
|
|
else if (sequenceParams.has(name)) {
|
|
combinedParams.set(name, [existingValue, value]);
|
|
}
|
|
if (!noOverwrite) {
|
|
combinedParams.set(name, value);
|
|
}
|
|
}
|
|
else {
|
|
combinedParams.set(name, value);
|
|
}
|
|
}
|
|
const searchPieces = [];
|
|
for (const [name, value] of combinedParams) {
|
|
if (typeof value === "string") {
|
|
searchPieces.push(`${name}=${value}`);
|
|
}
|
|
else if (Array.isArray(value)) {
|
|
// QUIRK: If we get an array of values, include multiple key/value pairs
|
|
for (const subValue of value) {
|
|
searchPieces.push(`${name}=${subValue}`);
|
|
}
|
|
}
|
|
else {
|
|
searchPieces.push(`${name}=${value}`);
|
|
}
|
|
}
|
|
// QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
|
|
parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
|
|
return parsedUrl.toString();
|
|
}
|
|
//# sourceMappingURL=urlHelpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const dist_esm_log_logger = esm_createClientLogger("core-client");
|
|
//# sourceMappingURL=log.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/serviceClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Initializes a new instance of the ServiceClient.
|
|
*/
|
|
class ServiceClient {
|
|
/**
|
|
* If specified, this is the base URI that requests will be made against for this ServiceClient.
|
|
* If it is not specified, then all OperationSpecs must contain a baseUrl property.
|
|
*/
|
|
_endpoint;
|
|
/**
|
|
* The default request content type for the service.
|
|
* Used if no requestContentType is present on an OperationSpec.
|
|
*/
|
|
_requestContentType;
|
|
/**
|
|
* Set to true if the request is sent over HTTP instead of HTTPS
|
|
*/
|
|
_allowInsecureConnection;
|
|
/**
|
|
* The HTTP client that will be used to send requests.
|
|
*/
|
|
_httpClient;
|
|
/**
|
|
* The pipeline used by this client to make requests
|
|
*/
|
|
pipeline;
|
|
/**
|
|
* The ServiceClient constructor
|
|
* @param options - The service client options that govern the behavior of the client.
|
|
*/
|
|
constructor(options = {}) {
|
|
this._requestContentType = options.requestContentType;
|
|
this._endpoint = options.endpoint ?? options.baseUri;
|
|
if (options.baseUri) {
|
|
dist_esm_log_logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead.");
|
|
}
|
|
this._allowInsecureConnection = options.allowInsecureConnection;
|
|
this._httpClient = options.httpClient || getCachedDefaultHttpClient();
|
|
this.pipeline = options.pipeline || serviceClient_createDefaultPipeline(options);
|
|
if (options.additionalPolicies?.length) {
|
|
for (const { policy, position } of options.additionalPolicies) {
|
|
// Sign happens after Retry and is commonly needed to occur
|
|
// before policies that intercept post-retry.
|
|
const afterPhase = position === "perRetry" ? "Sign" : undefined;
|
|
this.pipeline.addPolicy(policy, {
|
|
afterPhase,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Send the provided httpRequest.
|
|
*/
|
|
sendRequest(request) {
|
|
return this.pipeline.sendRequest(this._httpClient, request);
|
|
}
|
|
/**
|
|
* Send an HTTP request that is populated using the provided OperationSpec.
|
|
* @typeParam T - The typed result of the request, based on the OperationSpec.
|
|
* @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
|
|
* @param operationSpec - The OperationSpec to use to populate the httpRequest.
|
|
*/
|
|
async sendOperationRequest(operationArguments, operationSpec) {
|
|
const endpoint = operationSpec.baseUrl || this._endpoint;
|
|
if (!endpoint) {
|
|
throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.");
|
|
}
|
|
// Templatized URLs sometimes reference properties on the ServiceClient child class,
|
|
// so we have to pass `this` below in order to search these properties if they're
|
|
// not part of OperationArguments
|
|
const url = getRequestUrl(endpoint, operationSpec, operationArguments, this);
|
|
const request = esm_pipelineRequest_createPipelineRequest({
|
|
url,
|
|
});
|
|
request.method = operationSpec.httpMethod;
|
|
const operationInfo = getOperationRequestInfo(request);
|
|
operationInfo.operationSpec = operationSpec;
|
|
operationInfo.operationArguments = operationArguments;
|
|
const contentType = operationSpec.contentType || this._requestContentType;
|
|
if (contentType && operationSpec.requestBody) {
|
|
request.headers.set("Content-Type", contentType);
|
|
}
|
|
const options = operationArguments.options;
|
|
if (options) {
|
|
const requestOptions = options.requestOptions;
|
|
if (requestOptions) {
|
|
if (requestOptions.timeout) {
|
|
request.timeout = requestOptions.timeout;
|
|
}
|
|
if (requestOptions.onUploadProgress) {
|
|
request.onUploadProgress = requestOptions.onUploadProgress;
|
|
}
|
|
if (requestOptions.onDownloadProgress) {
|
|
request.onDownloadProgress = requestOptions.onDownloadProgress;
|
|
}
|
|
if (requestOptions.shouldDeserialize !== undefined) {
|
|
operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
|
|
}
|
|
if (requestOptions.allowInsecureConnection) {
|
|
request.allowInsecureConnection = true;
|
|
}
|
|
}
|
|
if (options.abortSignal) {
|
|
request.abortSignal = options.abortSignal;
|
|
}
|
|
if (options.tracingOptions) {
|
|
request.tracingOptions = options.tracingOptions;
|
|
}
|
|
}
|
|
if (this._allowInsecureConnection) {
|
|
request.allowInsecureConnection = true;
|
|
}
|
|
if (request.streamResponseStatusCodes === undefined) {
|
|
request.streamResponseStatusCodes = getStreamingResponseStatusCodes(operationSpec);
|
|
}
|
|
try {
|
|
const rawResponse = await this.sendRequest(request);
|
|
const flatResponse = flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]);
|
|
if (options?.onResponse) {
|
|
options.onResponse(rawResponse, flatResponse);
|
|
}
|
|
return flatResponse;
|
|
}
|
|
catch (error) {
|
|
if (typeof error === "object" && error?.response) {
|
|
const rawResponse = error.response;
|
|
const flatResponse = flattenResponse(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]);
|
|
error.details = flatResponse;
|
|
if (options?.onResponse) {
|
|
options.onResponse(rawResponse, flatResponse, error);
|
|
}
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
function serviceClient_createDefaultPipeline(options) {
|
|
const credentialScopes = getCredentialScopes(options);
|
|
const credentialOptions = options.credential && credentialScopes
|
|
? { credentialScopes, credential: options.credential }
|
|
: undefined;
|
|
return createClientPipeline({
|
|
...options,
|
|
credentialOptions,
|
|
});
|
|
}
|
|
function getCredentialScopes(options) {
|
|
if (options.credentialScopes) {
|
|
return options.credentialScopes;
|
|
}
|
|
if (options.endpoint) {
|
|
return `${options.endpoint}/.default`;
|
|
}
|
|
if (options.baseUri) {
|
|
return `${options.baseUri}/.default`;
|
|
}
|
|
if (options.credential) {
|
|
throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`);
|
|
}
|
|
return undefined;
|
|
}
|
|
//# sourceMappingURL=serviceClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/authorizeRequestOnClaimChallenge.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Converts: `Bearer a="b", c="d", Bearer d="e", f="g"`.
|
|
* Into: `[ { a: 'b', c: 'd' }, { d: 'e', f: 'g' } ]`.
|
|
*
|
|
* @internal
|
|
*/
|
|
function parseCAEChallenge(challenges) {
|
|
const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x);
|
|
return bearerChallenges.map((challenge) => {
|
|
const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x);
|
|
const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="')));
|
|
// Key-value pairs to plain object:
|
|
return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
|
|
});
|
|
}
|
|
/**
|
|
* This function can be used as a callback for the `bearerTokenAuthenticationPolicy` of `@azure/core-rest-pipeline`, to support CAE challenges:
|
|
* [Continuous Access Evaluation](https://learn.microsoft.com/azure/active-directory/conditional-access/concept-continuous-access-evaluation).
|
|
*
|
|
* Call the `bearerTokenAuthenticationPolicy` with the following options:
|
|
*
|
|
* ```ts snippet:AuthorizeRequestOnClaimChallenge
|
|
* import { bearerTokenAuthenticationPolicy } from "@azure/core-rest-pipeline";
|
|
* import { authorizeRequestOnClaimChallenge } from "@azure/core-client";
|
|
*
|
|
* const policy = bearerTokenAuthenticationPolicy({
|
|
* challengeCallbacks: {
|
|
* authorizeRequestOnChallenge: authorizeRequestOnClaimChallenge,
|
|
* },
|
|
* scopes: ["https://service/.default"],
|
|
* });
|
|
* ```
|
|
*
|
|
* Once provided, the `bearerTokenAuthenticationPolicy` policy will internally handle Continuous Access Evaluation (CAE) challenges.
|
|
* When it can't complete a challenge it will return the 401 (unauthorized) response from ARM.
|
|
*
|
|
* Example challenge with claims:
|
|
*
|
|
* ```
|
|
* Bearer authorization_uri="https://login.windows-ppe.net/", error="invalid_token",
|
|
* error_description="User session has been revoked",
|
|
* claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwMzc0MjgwMCJ9fX0="
|
|
* ```
|
|
*/
|
|
async function authorizeRequestOnClaimChallenge(onChallengeOptions) {
|
|
const { scopes, response } = onChallengeOptions;
|
|
const logger = onChallengeOptions.logger || coreClientLogger;
|
|
const challenge = response.headers.get("WWW-Authenticate");
|
|
if (!challenge) {
|
|
logger.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`);
|
|
return false;
|
|
}
|
|
const challenges = parseCAEChallenge(challenge) || [];
|
|
const parsedChallenge = challenges.find((x) => x.claims);
|
|
if (!parsedChallenge) {
|
|
logger.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`);
|
|
return false;
|
|
}
|
|
const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, {
|
|
claims: decodeStringToString(parsedChallenge.claims),
|
|
});
|
|
if (!accessToken) {
|
|
return false;
|
|
}
|
|
onChallengeOptions.request.headers.set("Authorization", `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
|
|
return true;
|
|
}
|
|
//# sourceMappingURL=authorizeRequestOnClaimChallenge.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/authorizeRequestOnTenantChallenge.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* A set of constants used internally when processing requests.
|
|
*/
|
|
const Constants = {
|
|
DefaultScope: "/.default",
|
|
/**
|
|
* Defines constants for use with HTTP headers.
|
|
*/
|
|
HeaderConstants: {
|
|
/**
|
|
* The Authorization header.
|
|
*/
|
|
AUTHORIZATION: "authorization",
|
|
},
|
|
};
|
|
function isUuid(text) {
|
|
return /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(text);
|
|
}
|
|
/**
|
|
* Defines a callback to handle auth challenge for Storage APIs.
|
|
* This implements the bearer challenge process described here: https://learn.microsoft.com/rest/api/storageservices/authorize-with-azure-active-directory#bearer-challenge
|
|
* Handling has specific features for storage that departs to the general AAD challenge docs.
|
|
**/
|
|
const authorizeRequestOnTenantChallenge = async (challengeOptions) => {
|
|
const requestOptions = requestToOptions(challengeOptions.request);
|
|
const challenge = getChallenge(challengeOptions.response);
|
|
if (challenge) {
|
|
const challengeInfo = parseChallenge(challenge);
|
|
const challengeScopes = buildScopes(challengeOptions, challengeInfo);
|
|
const tenantId = extractTenantId(challengeInfo);
|
|
if (!tenantId) {
|
|
return false;
|
|
}
|
|
const accessToken = await challengeOptions.getAccessToken(challengeScopes, {
|
|
...requestOptions,
|
|
tenantId,
|
|
});
|
|
if (!accessToken) {
|
|
return false;
|
|
}
|
|
challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `${accessToken.tokenType ?? "Bearer"} ${accessToken.token}`);
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
/**
|
|
* Extracts the tenant id from the challenge information
|
|
* The tenant id is contained in the authorization_uri as the first
|
|
* path part.
|
|
*/
|
|
function extractTenantId(challengeInfo) {
|
|
const parsedAuthUri = new URL(challengeInfo.authorization_uri);
|
|
const pathSegments = parsedAuthUri.pathname.split("/");
|
|
const tenantId = pathSegments[1];
|
|
if (tenantId && isUuid(tenantId)) {
|
|
return tenantId;
|
|
}
|
|
return undefined;
|
|
}
|
|
/**
|
|
* Builds the authentication scopes based on the information that comes in the
|
|
* challenge information. Scopes url is present in the resource_id, if it is empty
|
|
* we keep using the original scopes.
|
|
*/
|
|
function buildScopes(challengeOptions, challengeInfo) {
|
|
if (!challengeInfo.resource_id) {
|
|
return challengeOptions.scopes;
|
|
}
|
|
const challengeScopes = new URL(challengeInfo.resource_id);
|
|
let scope = new URL(Constants.DefaultScope, challengeScopes.origin).toString();
|
|
if (scope === "https://disk.azure.com/.default") {
|
|
// the extra slash is required by the service
|
|
scope = "https://disk.azure.com//.default";
|
|
}
|
|
return [scope];
|
|
}
|
|
/**
|
|
* We will retrieve the challenge only if the response status code was 401,
|
|
* and if the response contained the header "WWW-Authenticate" with a non-empty value.
|
|
*/
|
|
function getChallenge(response) {
|
|
const challenge = response.headers.get("WWW-Authenticate");
|
|
if (response.status === 401 && challenge) {
|
|
return challenge;
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* Converts: `Bearer a="b" c="d"`.
|
|
* Into: `[ { a: 'b', c: 'd' }]`.
|
|
*
|
|
* @internal
|
|
*/
|
|
function parseChallenge(challenge) {
|
|
const bearerChallenge = challenge.slice("Bearer ".length);
|
|
const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
|
|
const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
|
|
// Key-value pairs to plain object:
|
|
return keyValuePairs.reduce((a, b) => ({ ...a, ...b }), {});
|
|
}
|
|
/**
|
|
* Extracts the options form a Pipeline Request for later re-use
|
|
*/
|
|
function requestToOptions(request) {
|
|
return {
|
|
abortSignal: request.abortSignal,
|
|
requestOptions: {
|
|
timeout: request.timeout,
|
|
},
|
|
tracingOptions: request.tracingOptions,
|
|
};
|
|
}
|
|
//# sourceMappingURL=authorizeRequestOnTenantChallenge.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/util.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
// We use a custom symbol to cache a reference to the original request without
|
|
// exposing it on the public interface.
|
|
const util_originalRequestSymbol = Symbol("Original PipelineRequest");
|
|
// Symbol.for() will return the same symbol if it's already been created
|
|
// This particular one is used in core-client to handle the case of when a request is
|
|
// cloned but we need to retrieve the OperationSpec and OperationArguments from the
|
|
// original request.
|
|
const originalClientRequestSymbol = Symbol.for("@azure/core-client original request");
|
|
const passThroughProps = new Set([
|
|
"url",
|
|
"method",
|
|
"withCredentials",
|
|
"timeout",
|
|
"requestId",
|
|
"abortSignal",
|
|
"body",
|
|
"formData",
|
|
"onDownloadProgress",
|
|
"onUploadProgress",
|
|
"proxySettings",
|
|
"streamResponseStatusCodes",
|
|
"agent",
|
|
"requestOverrides",
|
|
]);
|
|
function toPipelineRequest(webResource, options = {}) {
|
|
const compatWebResource = webResource;
|
|
const request = compatWebResource[util_originalRequestSymbol];
|
|
const headers = esm_httpHeaders_createHttpHeaders(webResource.headers.toJson({ preserveCase: true }));
|
|
if (request) {
|
|
request.headers = headers;
|
|
return request;
|
|
}
|
|
else {
|
|
const newRequest = esm_pipelineRequest_createPipelineRequest({
|
|
url: webResource.url,
|
|
method: webResource.method,
|
|
headers,
|
|
withCredentials: webResource.withCredentials,
|
|
timeout: webResource.timeout,
|
|
requestId: webResource.requestId,
|
|
abortSignal: webResource.abortSignal,
|
|
body: webResource.body,
|
|
formData: webResource.formData,
|
|
disableKeepAlive: !!webResource.keepAlive,
|
|
onDownloadProgress: webResource.onDownloadProgress,
|
|
onUploadProgress: webResource.onUploadProgress,
|
|
proxySettings: webResource.proxySettings,
|
|
streamResponseStatusCodes: webResource.streamResponseStatusCodes,
|
|
agent: webResource.agent,
|
|
requestOverrides: webResource.requestOverrides,
|
|
});
|
|
if (options.originalRequest) {
|
|
newRequest[originalClientRequestSymbol] =
|
|
options.originalRequest;
|
|
}
|
|
return newRequest;
|
|
}
|
|
}
|
|
function toWebResourceLike(request, options) {
|
|
const originalRequest = options?.originalRequest ?? request;
|
|
const webResource = {
|
|
url: request.url,
|
|
method: request.method,
|
|
headers: toHttpHeadersLike(request.headers),
|
|
withCredentials: request.withCredentials,
|
|
timeout: request.timeout,
|
|
requestId: request.headers.get("x-ms-client-request-id") || request.requestId,
|
|
abortSignal: request.abortSignal,
|
|
body: request.body,
|
|
formData: request.formData,
|
|
keepAlive: !!request.disableKeepAlive,
|
|
onDownloadProgress: request.onDownloadProgress,
|
|
onUploadProgress: request.onUploadProgress,
|
|
proxySettings: request.proxySettings,
|
|
streamResponseStatusCodes: request.streamResponseStatusCodes,
|
|
agent: request.agent,
|
|
requestOverrides: request.requestOverrides,
|
|
clone() {
|
|
throw new Error("Cannot clone a non-proxied WebResourceLike");
|
|
},
|
|
prepare() {
|
|
throw new Error("WebResourceLike.prepare() is not supported by @azure/core-http-compat");
|
|
},
|
|
validateRequestProperties() {
|
|
/** do nothing */
|
|
},
|
|
};
|
|
if (options?.createProxy) {
|
|
return new Proxy(webResource, {
|
|
get(target, prop, receiver) {
|
|
if (prop === util_originalRequestSymbol) {
|
|
return request;
|
|
}
|
|
else if (prop === "clone") {
|
|
return () => {
|
|
return toWebResourceLike(toPipelineRequest(webResource, { originalRequest }), {
|
|
createProxy: true,
|
|
originalRequest,
|
|
});
|
|
};
|
|
}
|
|
return Reflect.get(target, prop, receiver);
|
|
},
|
|
set(target, prop, value, receiver) {
|
|
if (prop === "keepAlive") {
|
|
request.disableKeepAlive = !value;
|
|
}
|
|
if (typeof prop === "string" && passThroughProps.has(prop)) {
|
|
request[prop] = value;
|
|
}
|
|
return Reflect.set(target, prop, value, receiver);
|
|
},
|
|
});
|
|
}
|
|
else {
|
|
return webResource;
|
|
}
|
|
}
|
|
/**
|
|
* Converts HttpHeaders from core-rest-pipeline to look like
|
|
* HttpHeaders from core-http.
|
|
* @param headers - HttpHeaders from core-rest-pipeline
|
|
* @returns HttpHeaders as they looked in core-http
|
|
*/
|
|
function toHttpHeadersLike(headers) {
|
|
return new HttpHeaders(headers.toJSON({ preserveCase: true }));
|
|
}
|
|
/**
|
|
* A collection of HttpHeaders that can be sent with a HTTP request.
|
|
*/
|
|
function getHeaderKey(headerName) {
|
|
return headerName.toLowerCase();
|
|
}
|
|
/**
|
|
* A collection of HTTP header key/value pairs.
|
|
*/
|
|
class HttpHeaders {
|
|
_headersMap;
|
|
constructor(rawHeaders) {
|
|
this._headersMap = {};
|
|
if (rawHeaders) {
|
|
for (const headerName in rawHeaders) {
|
|
this.set(headerName, rawHeaders[headerName]);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Set a header in this collection with the provided name and value. The name is
|
|
* case-insensitive.
|
|
* @param headerName - The name of the header to set. This value is case-insensitive.
|
|
* @param headerValue - The value of the header to set.
|
|
*/
|
|
set(headerName, headerValue) {
|
|
this._headersMap[getHeaderKey(headerName)] = {
|
|
name: headerName,
|
|
value: headerValue.toString(),
|
|
};
|
|
}
|
|
/**
|
|
* Get the header value for the provided header name, or undefined if no header exists in this
|
|
* collection with the provided name.
|
|
* @param headerName - The name of the header.
|
|
*/
|
|
get(headerName) {
|
|
const header = this._headersMap[getHeaderKey(headerName)];
|
|
return !header ? undefined : header.value;
|
|
}
|
|
/**
|
|
* Get whether or not this header collection contains a header entry for the provided header name.
|
|
*/
|
|
contains(headerName) {
|
|
return !!this._headersMap[getHeaderKey(headerName)];
|
|
}
|
|
/**
|
|
* Remove the header with the provided headerName. Return whether or not the header existed and
|
|
* was removed.
|
|
* @param headerName - The name of the header to remove.
|
|
*/
|
|
remove(headerName) {
|
|
const result = this.contains(headerName);
|
|
delete this._headersMap[getHeaderKey(headerName)];
|
|
return result;
|
|
}
|
|
/**
|
|
* Get the headers that are contained this collection as an object.
|
|
*/
|
|
rawHeaders() {
|
|
return this.toJson({ preserveCase: true });
|
|
}
|
|
/**
|
|
* Get the headers that are contained in this collection as an array.
|
|
*/
|
|
headersArray() {
|
|
const headers = [];
|
|
for (const headerKey in this._headersMap) {
|
|
headers.push(this._headersMap[headerKey]);
|
|
}
|
|
return headers;
|
|
}
|
|
/**
|
|
* Get the header names that are contained in this collection.
|
|
*/
|
|
headerNames() {
|
|
const headerNames = [];
|
|
const headers = this.headersArray();
|
|
for (let i = 0; i < headers.length; ++i) {
|
|
headerNames.push(headers[i].name);
|
|
}
|
|
return headerNames;
|
|
}
|
|
/**
|
|
* Get the header values that are contained in this collection.
|
|
*/
|
|
headerValues() {
|
|
const headerValues = [];
|
|
const headers = this.headersArray();
|
|
for (let i = 0; i < headers.length; ++i) {
|
|
headerValues.push(headers[i].value);
|
|
}
|
|
return headerValues;
|
|
}
|
|
/**
|
|
* Get the JSON object representation of this HTTP header collection.
|
|
*/
|
|
toJson(options = {}) {
|
|
const result = {};
|
|
if (options.preserveCase) {
|
|
for (const headerKey in this._headersMap) {
|
|
const header = this._headersMap[headerKey];
|
|
result[header.name] = header.value;
|
|
}
|
|
}
|
|
else {
|
|
for (const headerKey in this._headersMap) {
|
|
const header = this._headersMap[headerKey];
|
|
result[getHeaderKey(header.name)] = header.value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**
|
|
* Get the string representation of this HTTP header collection.
|
|
*/
|
|
toString() {
|
|
return JSON.stringify(this.toJson({ preserveCase: true }));
|
|
}
|
|
/**
|
|
* Create a deep clone/copy of this HttpHeaders collection.
|
|
*/
|
|
clone() {
|
|
const resultPreservingCasing = {};
|
|
for (const headerKey in this._headersMap) {
|
|
const header = this._headersMap[headerKey];
|
|
resultPreservingCasing[header.name] = header.value;
|
|
}
|
|
return new HttpHeaders(resultPreservingCasing);
|
|
}
|
|
}
|
|
//# sourceMappingURL=util.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/response.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
const originalResponse = Symbol("Original FullOperationResponse");
|
|
/**
|
|
* A helper to convert response objects from the new pipeline back to the old one.
|
|
* @param response - A response object from core-client.
|
|
* @returns A response compatible with `HttpOperationResponse` from core-http.
|
|
*/
|
|
function toCompatResponse(response, options) {
|
|
let request = toWebResourceLike(response.request);
|
|
let headers = toHttpHeadersLike(response.headers);
|
|
if (options?.createProxy) {
|
|
return new Proxy(response, {
|
|
get(target, prop, receiver) {
|
|
if (prop === "headers") {
|
|
return headers;
|
|
}
|
|
else if (prop === "request") {
|
|
return request;
|
|
}
|
|
else if (prop === originalResponse) {
|
|
return response;
|
|
}
|
|
return Reflect.get(target, prop, receiver);
|
|
},
|
|
set(target, prop, value, receiver) {
|
|
if (prop === "headers") {
|
|
headers = value;
|
|
}
|
|
else if (prop === "request") {
|
|
request = value;
|
|
}
|
|
return Reflect.set(target, prop, value, receiver);
|
|
},
|
|
});
|
|
}
|
|
else {
|
|
return {
|
|
...response,
|
|
request,
|
|
headers,
|
|
};
|
|
}
|
|
}
|
|
/**
|
|
* A helper to convert back to a PipelineResponse
|
|
* @param compatResponse - A response compatible with `HttpOperationResponse` from core-http.
|
|
*/
|
|
function response_toPipelineResponse(compatResponse) {
|
|
const extendedCompatResponse = compatResponse;
|
|
const response = extendedCompatResponse[originalResponse];
|
|
const headers = esm_httpHeaders_createHttpHeaders(compatResponse.headers.toJson({ preserveCase: true }));
|
|
if (response) {
|
|
response.headers = headers;
|
|
return response;
|
|
}
|
|
else {
|
|
return {
|
|
...compatResponse,
|
|
headers,
|
|
request: toPipelineRequest(compatResponse.request),
|
|
};
|
|
}
|
|
}
|
|
//# sourceMappingURL=response.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/extendedClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Client to provide compatability between core V1 & V2.
|
|
*/
|
|
class ExtendedServiceClient extends ServiceClient {
|
|
constructor(options) {
|
|
super(options);
|
|
if (options.keepAliveOptions?.enable === false &&
|
|
!pipelineContainsDisableKeepAlivePolicy(this.pipeline)) {
|
|
this.pipeline.addPolicy(createDisableKeepAlivePolicy());
|
|
}
|
|
if (options.redirectOptions?.handleRedirects === false) {
|
|
this.pipeline.removePolicy({
|
|
name: redirectPolicy_redirectPolicyName,
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* Compatible send operation request function.
|
|
*
|
|
* @param operationArguments - Operation arguments
|
|
* @param operationSpec - Operation Spec
|
|
* @returns
|
|
*/
|
|
async sendOperationRequest(operationArguments, operationSpec) {
|
|
const userProvidedCallBack = operationArguments?.options?.onResponse;
|
|
let lastResponse;
|
|
function onResponse(rawResponse, flatResponse, error) {
|
|
lastResponse = rawResponse;
|
|
if (userProvidedCallBack) {
|
|
userProvidedCallBack(rawResponse, flatResponse, error);
|
|
}
|
|
}
|
|
operationArguments.options = {
|
|
...operationArguments.options,
|
|
onResponse,
|
|
};
|
|
const result = await super.sendOperationRequest(operationArguments, operationSpec);
|
|
if (lastResponse) {
|
|
Object.defineProperty(result, "_response", {
|
|
value: toCompatResponse(lastResponse),
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
//# sourceMappingURL=extendedClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/policies/requestPolicyFactoryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* An enum for compatibility with RequestPolicy
|
|
*/
|
|
var HttpPipelineLogLevel;
|
|
(function (HttpPipelineLogLevel) {
|
|
HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";
|
|
HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";
|
|
HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";
|
|
HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";
|
|
})(HttpPipelineLogLevel || (HttpPipelineLogLevel = {}));
|
|
const mockRequestPolicyOptions = {
|
|
log(_logLevel, _message) {
|
|
/* do nothing */
|
|
},
|
|
shouldLog(_logLevel) {
|
|
return false;
|
|
},
|
|
};
|
|
/**
|
|
* The name of the RequestPolicyFactoryPolicy
|
|
*/
|
|
const requestPolicyFactoryPolicyName = "RequestPolicyFactoryPolicy";
|
|
/**
|
|
* A policy that wraps policies written for core-http.
|
|
* @param factories - An array of `RequestPolicyFactory` objects from a core-http pipeline
|
|
*/
|
|
function createRequestPolicyFactoryPolicy(factories) {
|
|
const orderedFactories = factories.slice().reverse();
|
|
return {
|
|
name: requestPolicyFactoryPolicyName,
|
|
async sendRequest(request, next) {
|
|
let httpPipeline = {
|
|
async sendRequest(httpRequest) {
|
|
const response = await next(toPipelineRequest(httpRequest));
|
|
return toCompatResponse(response, { createProxy: true });
|
|
},
|
|
};
|
|
for (const factory of orderedFactories) {
|
|
httpPipeline = factory.create(httpPipeline, mockRequestPolicyOptions);
|
|
}
|
|
const webResourceLike = toWebResourceLike(request, { createProxy: true });
|
|
const response = await httpPipeline.sendRequest(webResourceLike);
|
|
return response_toPipelineResponse(response);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=requestPolicyFactoryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/httpClientAdapter.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Converts a RequestPolicy based HttpClient to a PipelineRequest based HttpClient.
|
|
* @param requestPolicyClient - A HttpClient compatible with core-http
|
|
* @returns A HttpClient compatible with core-rest-pipeline
|
|
*/
|
|
function convertHttpClient(requestPolicyClient) {
|
|
return {
|
|
sendRequest: async (request) => {
|
|
const response = await requestPolicyClient.sendRequest(toWebResourceLike(request, { createProxy: true }));
|
|
return response_toPipelineResponse(response);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=httpClientAdapter.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-http-compat/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* A Shim Library that provides compatibility between Core V1 & V2 Packages.
|
|
*
|
|
* @packageDocumentation
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
// EXTERNAL MODULE: ./node_modules/path-expression-matcher/src/Expression.js
|
|
var Expression = __webpack_require__(3945);
|
|
// EXTERNAL MODULE: ./node_modules/path-expression-matcher/src/Matcher.js
|
|
var Matcher = __webpack_require__(8257);
|
|
;// CONCATENATED MODULE: ./node_modules/fast-xml-builder/src/util.js
|
|
|
|
|
|
function safeComment(val) {
|
|
return String(val)
|
|
.replace(/--/g, '- -') // -- is illegal anywhere in comment content
|
|
.replace(/--/g, '- -') // handle the scenario when 2 consiucative dashes appears
|
|
.replace(/-$/, '- '); // trailing - would form -- with the closing -->
|
|
}
|
|
|
|
function safeCdata(val) {
|
|
return String(val).replace(/\]\]>/g, ']]]]><![CDATA[>')
|
|
}
|
|
|
|
function escapeAttribute(val) {
|
|
return String(val).replace(/"/g, '"').replace(/'/g, ''')
|
|
}
|
|
// EXTERNAL MODULE: ./node_modules/xml-naming/src/index.js
|
|
var src = __webpack_require__(4658);
|
|
;// CONCATENATED MODULE: ./node_modules/fast-xml-builder/src/orderedJs2Xml.js
|
|
|
|
|
|
|
|
|
|
const EOL = "\n";
|
|
|
|
/**
|
|
* Detect XML version from the first element of the ordered array input.
|
|
* The first element must be a ?xml processing instruction with a version attribute.
|
|
* Returns '1.0' if not found.
|
|
*
|
|
* @param {array} jArray
|
|
* @param {object} options
|
|
*/
|
|
function detectXmlVersionFromArray(jArray, options) {
|
|
if (!Array.isArray(jArray) || jArray.length === 0) return '1.0';
|
|
const first = jArray[0];
|
|
const firstKey = propName(first);
|
|
if (firstKey === '?xml') {
|
|
const attrs = first[':@'];
|
|
if (attrs) {
|
|
const versionKey = options.attributeNamePrefix + 'version';
|
|
if (attrs[versionKey]) return attrs[versionKey];
|
|
}
|
|
}
|
|
return '1.0';
|
|
}
|
|
|
|
/**
|
|
* Resolve a tag or attribute name through sanitizeName if configured.
|
|
* Validation via xml-naming's qName is performed first; the sanitizeName
|
|
* callback is invoked only when the name is invalid. If sanitizeName is
|
|
* false (default), no validation occurs and the name is used as-is.
|
|
*
|
|
* @param {string} name - raw name from the JS object
|
|
* @param {boolean} isAttribute - true when resolving an attribute name
|
|
* @param {object} options
|
|
* @param {Matcher} matcher - current matcher state (readonly from callback perspective)
|
|
* @param {function} qNameValidator - function to validate tag names
|
|
*/
|
|
function resolveTagName(name, isAttribute, options, matcher, qNameValidator) {
|
|
if (!options.sanitizeName) return name;
|
|
if (qNameValidator(name)) return name;
|
|
return options.sanitizeName(name, { isAttribute, matcher: matcher.readOnly() });
|
|
}
|
|
|
|
/**
|
|
* @param {array} jArray
|
|
* @param {any} options
|
|
* @returns
|
|
*/
|
|
function toXml(jArray, options) {
|
|
let indentation = "";
|
|
if (options.format) {
|
|
indentation = EOL;
|
|
}
|
|
|
|
// Pre-compile stopNode expressions for pattern matching
|
|
const stopNodeExpressions = [];
|
|
if (options.stopNodes && Array.isArray(options.stopNodes)) {
|
|
for (let i = 0; i < options.stopNodes.length; i++) {
|
|
const node = options.stopNodes[i];
|
|
if (typeof node === 'string') {
|
|
stopNodeExpressions.push(new Expression/* default */.A(node));
|
|
} else if (node instanceof Expression/* default */.A) {
|
|
stopNodeExpressions.push(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Detect XML version for use in name validation
|
|
const xmlVersion = detectXmlVersionFromArray(jArray, options);
|
|
const qNameValidator = (0,src/* createValidator */.fH)('qName', { xmlVersion });
|
|
// Initialize matcher for path tracking
|
|
const matcher = new Matcher/* default */.A();
|
|
|
|
return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions, qNameValidator);
|
|
}
|
|
|
|
function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, qNameValidator) {
|
|
let xmlStr = "";
|
|
let isPreviousElementTag = false;
|
|
|
|
if (options.maxNestedTags && matcher.getDepth() > options.maxNestedTags) {
|
|
throw new Error("Maximum nested tags exceeded");
|
|
}
|
|
|
|
if (!Array.isArray(arr)) {
|
|
// Non-array values (e.g. string tag values) should be treated as text content
|
|
if (arr !== undefined && arr !== null) {
|
|
let text = arr.toString();
|
|
text = replaceEntitiesValue(text, options);
|
|
return text;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
for (let i = 0; i < arr.length; i++) {
|
|
const tagObj = arr[i];
|
|
const rawTagName = propName(tagObj);
|
|
if (rawTagName === undefined) continue;
|
|
|
|
// Special names are exempt from sanitizeName: internal conventions and PI tags
|
|
// are not user-supplied XML element names.
|
|
const isSpecialName = rawTagName === options.textNodeName
|
|
|| rawTagName === options.cdataPropName
|
|
|| rawTagName === options.commentPropName
|
|
|| rawTagName[0] === '?';
|
|
|
|
// Resolve tag name (may transform it; may throw for invalid names)
|
|
const tagName = isSpecialName
|
|
? rawTagName
|
|
: resolveTagName(rawTagName, false, options, matcher, qNameValidator);
|
|
|
|
// Extract attributes from ":@" property
|
|
const attrValues = extractAttributeValues(tagObj[":@"], options);
|
|
|
|
// Push resolved tag to matcher WITH attributes
|
|
matcher.push(tagName, attrValues);
|
|
|
|
// Check if this is a stop node using Expression matching
|
|
const isStopNode = checkStopNode(matcher, stopNodeExpressions);
|
|
|
|
if (tagName === options.textNodeName) {
|
|
let tagText = tagObj[rawTagName];
|
|
if (!isStopNode) {
|
|
tagText = options.tagValueProcessor(tagName, tagText);
|
|
tagText = replaceEntitiesValue(tagText, options);
|
|
}
|
|
if (isPreviousElementTag) {
|
|
xmlStr += indentation;
|
|
}
|
|
xmlStr += tagText;
|
|
isPreviousElementTag = false;
|
|
matcher.pop();
|
|
continue;
|
|
} else if (tagName === options.cdataPropName) {
|
|
if (isPreviousElementTag) {
|
|
xmlStr += indentation;
|
|
}
|
|
const val = tagObj[rawTagName][0][options.textNodeName];
|
|
const safeVal = safeCdata(val);
|
|
xmlStr += `<![CDATA[${safeVal}]]>`;
|
|
isPreviousElementTag = false;
|
|
matcher.pop();
|
|
continue;
|
|
} else if (tagName === options.commentPropName) {
|
|
const val = tagObj[rawTagName][0][options.textNodeName];
|
|
const safeVal = safeComment(val);
|
|
xmlStr += indentation + `<!--${safeVal}-->`;
|
|
isPreviousElementTag = true;
|
|
matcher.pop();
|
|
continue;
|
|
} else if (tagName[0] === "?") {
|
|
const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, qNameValidator);
|
|
const tempInd = tagName === "?xml" ? "" : indentation;
|
|
// Text node content on PI/XML declaration tags is intentionally ignored.
|
|
// Only attributes are valid on these tags per the XML spec.
|
|
xmlStr += tempInd + `<${tagName}${attStr}?>`;
|
|
isPreviousElementTag = true;
|
|
matcher.pop();
|
|
continue;
|
|
}
|
|
|
|
let newIdentation = indentation;
|
|
if (newIdentation !== "") {
|
|
newIdentation += options.indentBy;
|
|
}
|
|
|
|
// Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes
|
|
const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, qNameValidator);
|
|
const tagStart = indentation + `<${tagName}${attStr}`;
|
|
|
|
// If this is a stopNode, get raw content without processing
|
|
let tagValue;
|
|
if (isStopNode) {
|
|
tagValue = orderedJs2Xml_getRawContent(tagObj[rawTagName], options);
|
|
} else {
|
|
tagValue = arrToStr(tagObj[rawTagName], options, newIdentation, matcher, stopNodeExpressions, qNameValidator);
|
|
}
|
|
|
|
if (options.unpairedTags.indexOf(tagName) !== -1) {
|
|
if (options.suppressUnpairedNode) xmlStr += tagStart + ">";
|
|
else xmlStr += tagStart + "/>";
|
|
} else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {
|
|
xmlStr += tagStart + "/>";
|
|
} else if (tagValue && tagValue.endsWith(">")) {
|
|
xmlStr += tagStart + `>${tagValue}${indentation}</${tagName}>`;
|
|
} else {
|
|
xmlStr += tagStart + ">";
|
|
if (tagValue && indentation !== "" && (tagValue.includes("/>") || tagValue.includes("</"))) {
|
|
xmlStr += indentation + options.indentBy + tagValue + indentation;
|
|
} else {
|
|
xmlStr += tagValue;
|
|
}
|
|
xmlStr += `</${tagName}>`;
|
|
}
|
|
isPreviousElementTag = true;
|
|
|
|
// Pop tag from matcher
|
|
matcher.pop();
|
|
}
|
|
|
|
return xmlStr;
|
|
}
|
|
|
|
/**
|
|
* Extract attribute values from the ":@" object and return as plain object
|
|
* for passing to matcher.push()
|
|
*/
|
|
function extractAttributeValues(attrMap, options) {
|
|
if (!attrMap || options.ignoreAttributes) return null;
|
|
|
|
const attrValues = {};
|
|
let hasAttrs = false;
|
|
|
|
for (let attr in attrMap) {
|
|
if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
|
|
// Remove the attribute prefix to get clean attribute name
|
|
const cleanAttrName = attr.startsWith(options.attributeNamePrefix)
|
|
? attr.substr(options.attributeNamePrefix.length)
|
|
: attr;
|
|
attrValues[cleanAttrName] = escapeAttribute(attrMap[attr]);
|
|
hasAttrs = true;
|
|
}
|
|
|
|
return hasAttrs ? attrValues : null;
|
|
}
|
|
|
|
/**
|
|
* Extract raw content from a stopNode without any processing
|
|
* This preserves the content exactly as-is, including special characters
|
|
*/
|
|
function orderedJs2Xml_getRawContent(arr, options) {
|
|
if (!Array.isArray(arr)) {
|
|
// Non-array values return as-is
|
|
if (arr !== undefined && arr !== null) {
|
|
return arr.toString();
|
|
}
|
|
return "";
|
|
}
|
|
|
|
let content = "";
|
|
for (let i = 0; i < arr.length; i++) {
|
|
const item = arr[i];
|
|
const tagName = propName(item);
|
|
|
|
if (tagName === options.textNodeName) {
|
|
// Raw text content - NO processing, NO entity replacement
|
|
content += item[tagName];
|
|
} else if (tagName === options.cdataPropName) {
|
|
// CDATA content
|
|
content += item[tagName][0][options.textNodeName];
|
|
} else if (tagName === options.commentPropName) {
|
|
// Comment content
|
|
content += item[tagName][0][options.textNodeName];
|
|
} else if (tagName && tagName[0] === "?") {
|
|
// Processing instruction - skip for stopNodes
|
|
continue;
|
|
} else if (tagName) {
|
|
// Nested tags within stopNode — no sanitizeName, content is raw
|
|
const attStr = attr_to_str_raw(item[":@"], options);
|
|
const nestedContent = orderedJs2Xml_getRawContent(item[tagName], options);
|
|
|
|
if (!nestedContent || nestedContent.length === 0) {
|
|
content += `<${tagName}${attStr}/>`;
|
|
} else {
|
|
content += `<${tagName}${attStr}>${nestedContent}</${tagName}>`;
|
|
}
|
|
}
|
|
}
|
|
return content;
|
|
}
|
|
|
|
/**
|
|
* Build attribute string for stopNodes - NO entity replacement
|
|
*/
|
|
function attr_to_str_raw(attrMap, options) {
|
|
let attrStr = "";
|
|
if (attrMap && !options.ignoreAttributes) {
|
|
for (let attr in attrMap) {
|
|
if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
|
|
// For stopNodes, use raw value without processing
|
|
let attrVal = attrMap[attr];
|
|
if (attrVal === true && options.suppressBooleanAttributes) {
|
|
attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;
|
|
} else {
|
|
attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}="${escapeAttribute(attrVal)}"`;
|
|
}
|
|
}
|
|
}
|
|
return attrStr;
|
|
}
|
|
|
|
function propName(obj) {
|
|
const keys = Object.keys(obj);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const key = keys[i];
|
|
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
if (key !== ":@") return key;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Build attribute string, resolving attribute names through sanitizeName when configured.
|
|
* Accepts matcher so the callback has path context.
|
|
*/
|
|
function attr_to_str(attrMap, options, isStopNode, matcher, qNameValidator) {
|
|
let attrStr = "";
|
|
if (attrMap && !options.ignoreAttributes) {
|
|
for (let attr in attrMap) {
|
|
if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;
|
|
|
|
// Strip prefix to get the clean XML attribute name, then optionally sanitize it
|
|
const cleanAttrName = attr.substr(options.attributeNamePrefix.length);
|
|
const resolvedAttrName = isStopNode
|
|
? cleanAttrName // stopNodes are raw — skip sanitizeName for attr names too
|
|
: resolveTagName(cleanAttrName, true, options, matcher, qNameValidator);
|
|
|
|
let attrVal;
|
|
if (isStopNode) {
|
|
// For stopNodes, use raw value without any processing
|
|
attrVal = attrMap[attr];
|
|
} else {
|
|
// Normal processing: apply attributeValueProcessor and entity replacement
|
|
attrVal = options.attributeValueProcessor(attr, attrMap[attr]);
|
|
attrVal = replaceEntitiesValue(attrVal, options);
|
|
}
|
|
|
|
if (attrVal === true && options.suppressBooleanAttributes) {
|
|
attrStr += ` ${resolvedAttrName}`;
|
|
} else {
|
|
attrStr += ` ${resolvedAttrName}="${escapeAttribute(attrVal)}"`;
|
|
}
|
|
}
|
|
}
|
|
return attrStr;
|
|
}
|
|
|
|
function checkStopNode(matcher, stopNodeExpressions) {
|
|
if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;
|
|
|
|
for (let i = 0; i < stopNodeExpressions.length; i++) {
|
|
if (matcher.matches(stopNodeExpressions[i])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function replaceEntitiesValue(textValue, options) {
|
|
if (textValue && textValue.length > 0 && options.processEntities) {
|
|
for (let i = 0; i < options.entities.length; i++) {
|
|
const entity = options.entities[i];
|
|
textValue = textValue.replace(entity.regex, entity.val);
|
|
}
|
|
}
|
|
return textValue;
|
|
}
|
|
;// CONCATENATED MODULE: ./node_modules/fast-xml-builder/src/ignoreAttributes.js
|
|
function getIgnoreAttributesFn(ignoreAttributes) {
|
|
if (typeof ignoreAttributes === 'function') {
|
|
return ignoreAttributes
|
|
}
|
|
if (Array.isArray(ignoreAttributes)) {
|
|
return (attrName) => {
|
|
for (const pattern of ignoreAttributes) {
|
|
if (typeof pattern === 'string' && attrName === pattern) {
|
|
return true
|
|
}
|
|
if (pattern instanceof RegExp && pattern.test(attrName)) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return () => false
|
|
}
|
|
;// CONCATENATED MODULE: ./node_modules/fast-xml-builder/src/fxb.js
|
|
|
|
//parse Empty Node as self closing node
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const defaultOptions = {
|
|
attributeNamePrefix: '@_',
|
|
attributesGroupName: false,
|
|
textNodeName: '#text',
|
|
ignoreAttributes: true,
|
|
cdataPropName: false,
|
|
format: false,
|
|
indentBy: ' ',
|
|
suppressEmptyNode: false,
|
|
suppressUnpairedNode: true,
|
|
suppressBooleanAttributes: true,
|
|
tagValueProcessor: function (key, a) {
|
|
return a;
|
|
},
|
|
attributeValueProcessor: function (attrName, a) {
|
|
return a;
|
|
},
|
|
preserveOrder: false,
|
|
commentPropName: false,
|
|
unpairedTags: [],
|
|
entities: [
|
|
{ regex: new RegExp("&", "g"), val: "&" },//it must be on top
|
|
{ regex: new RegExp(">", "g"), val: ">" },
|
|
{ regex: new RegExp("<", "g"), val: "<" },
|
|
{ regex: new RegExp("\'", "g"), val: "'" },
|
|
{ regex: new RegExp("\"", "g"), val: """ }
|
|
],
|
|
processEntities: true,
|
|
stopNodes: [],
|
|
// transformTagName: false,
|
|
// transformAttributeName: false,
|
|
oneListGroup: false,
|
|
maxNestedTags: 100,
|
|
jPath: true, // When true, callbacks receive string jPath; when false, receive Matcher instance
|
|
sanitizeName: false // false = allow all names as-is (default, backward-compatible).
|
|
// Set to a function (name, { isAttribute, matcher }) => string to
|
|
// validate/sanitize tag and attribute names. Throw inside the function
|
|
// to reject an invalid name.
|
|
};
|
|
|
|
function Builder(options) {
|
|
this.options = Object.assign({}, defaultOptions, options);
|
|
|
|
// Convert old-style stopNodes for backward compatibility
|
|
// Old syntax: "*.tag" meant "tag anywhere in tree"
|
|
// New syntax: "..tag" means "tag anywhere in tree"
|
|
if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {
|
|
this.options.stopNodes = this.options.stopNodes.map(node => {
|
|
if (typeof node === 'string' && node.startsWith('*.')) {
|
|
// Convert old wildcard syntax to deep wildcard
|
|
return '..' + node.substring(2);
|
|
}
|
|
return node;
|
|
});
|
|
}
|
|
|
|
// Pre-compile stopNode expressions for pattern matching
|
|
this.stopNodeExpressions = [];
|
|
if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {
|
|
for (let i = 0; i < this.options.stopNodes.length; i++) {
|
|
const node = this.options.stopNodes[i];
|
|
if (typeof node === 'string') {
|
|
this.stopNodeExpressions.push(new Expression/* default */.A(node));
|
|
} else if (node instanceof Expression/* default */.A) {
|
|
this.stopNodeExpressions.push(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {
|
|
this.isAttribute = function (/*a*/) {
|
|
return false;
|
|
};
|
|
} else {
|
|
this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)
|
|
this.attrPrefixLen = this.options.attributeNamePrefix.length;
|
|
this.isAttribute = isAttribute;
|
|
}
|
|
|
|
this.processTextOrObjNode = processTextOrObjNode
|
|
|
|
if (this.options.format) {
|
|
this.indentate = indentate;
|
|
this.tagEndChar = '>\n';
|
|
this.newLine = '\n';
|
|
} else {
|
|
this.indentate = function () {
|
|
return '';
|
|
};
|
|
this.tagEndChar = '>';
|
|
this.newLine = '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Detect XML version from the ?xml declaration at the root of a plain-object input.
|
|
* Checks both attributesGroupName and flat attribute forms.
|
|
* Returns '1.0' if no declaration is found.
|
|
*/
|
|
function detectXmlVersionFromObj(jObj, options) {
|
|
const decl = jObj['?xml'];
|
|
if (decl && typeof decl === 'object') {
|
|
// attributesGroupName path e.g. { '$$': { '@_version': '1.1' } }
|
|
if (options.attributesGroupName && decl[options.attributesGroupName]) {
|
|
const v = decl[options.attributesGroupName][options.attributeNamePrefix + 'version'];
|
|
if (v) return v;
|
|
}
|
|
// flat attribute path e.g. { '@_version': '1.1' }
|
|
const v = decl[options.attributeNamePrefix + 'version'];
|
|
if (v) return v;
|
|
}
|
|
return '1.0';
|
|
}
|
|
|
|
/**
|
|
* Resolve a tag or attribute name through sanitizeName if configured.
|
|
* Validation via xml-naming's qName is performed first; the sanitizeName
|
|
* callback is invoked only when the name is invalid. If sanitizeName is
|
|
* false (default), no validation occurs and the name is used as-is.
|
|
*
|
|
* @param {string} name - raw name from the JS object
|
|
* @param {boolean} isAttribute - true when resolving an attribute name
|
|
* @param {object} options
|
|
* @param {Matcher} matcher - current matcher state (readonly from callback perspective)
|
|
* @param {function} qNameValidator - function to validate tag names
|
|
*/
|
|
function fxb_resolveTagName(name, isAttribute, options, matcher, qNameValidator) {
|
|
if (!options.sanitizeName) return name;
|
|
if (qNameValidator(name)) return name;
|
|
return options.sanitizeName(name, { isAttribute, matcher: matcher.readOnly() });
|
|
}
|
|
|
|
Builder.prototype.build = function (jObj) {
|
|
if (this.options.preserveOrder) {
|
|
return toXml(jObj, this.options);
|
|
} else {
|
|
if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {
|
|
jObj = {
|
|
[this.options.arrayNodeName]: jObj
|
|
}
|
|
}
|
|
// Initialize matcher for path tracking
|
|
const matcher = new Matcher/* default */.A();
|
|
const xmlVersion = detectXmlVersionFromObj(jObj, this.options);
|
|
const qNameValidator = (0,src/* createValidator */.fH)('qName', { xmlVersion });
|
|
return this.j2x(jObj, 0, matcher, qNameValidator).val;
|
|
}
|
|
};
|
|
|
|
Builder.prototype.j2x = function (jObj, level, matcher, qNameValidator) {
|
|
let attrStr = '';
|
|
let val = '';
|
|
if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) {
|
|
throw new Error("Maximum nested tags exceeded");
|
|
}
|
|
// Get jPath based on option: string for backward compatibility, or Matcher for new features
|
|
const jPath = this.options.jPath ? matcher.toString() : matcher;
|
|
|
|
// Check if current node is a stopNode (will be used for attribute encoding)
|
|
const isCurrentStopNode = this.checkStopNode(matcher);
|
|
|
|
for (let key in jObj) {
|
|
if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;
|
|
|
|
// Resolve the key through sanitizeName before any use.
|
|
// Special keys (textNodeName, cdataPropName, commentPropName, attributeNamePrefix,
|
|
// attributesGroupName, "?" PI tags) are exempt — they are builder-internal conventions,
|
|
// not user-supplied XML names.
|
|
const isSpecialKey = key === this.options.textNodeName
|
|
|| key === this.options.cdataPropName
|
|
|| key === this.options.commentPropName
|
|
|| (this.options.attributesGroupName && key === this.options.attributesGroupName)
|
|
|| this.isAttribute(key)
|
|
|| key[0] === '?';
|
|
|
|
const resolvedKey = isSpecialKey
|
|
? key
|
|
: fxb_resolveTagName(key, false, this.options, matcher, qNameValidator);
|
|
|
|
if (typeof jObj[key] === 'undefined') {
|
|
// supress undefined node only if it is not an attribute
|
|
if (this.isAttribute(key)) {
|
|
val += '';
|
|
}
|
|
} else if (jObj[key] === null) {
|
|
// null attribute should be ignored by the attribute list, but should not cause the tag closing
|
|
if (this.isAttribute(key)) {
|
|
val += '';
|
|
} else if (resolvedKey === this.options.cdataPropName || resolvedKey === this.options.commentPropName) {
|
|
val += '';
|
|
} else if (resolvedKey[0] === '?') {
|
|
val += this.indentate(level) + '<' + resolvedKey + '?' + this.tagEndChar;
|
|
} else {
|
|
val += this.indentate(level) + '<' + resolvedKey + '/' + this.tagEndChar;
|
|
}
|
|
} else if (jObj[key] instanceof Date) {
|
|
val += this.buildTextValNode(jObj[key], resolvedKey, '', level, matcher);
|
|
} else if (typeof jObj[key] !== 'object') {
|
|
//premitive type
|
|
const attr = this.isAttribute(key);
|
|
if (attr && !this.ignoreAttributesFn(attr, jPath)) {
|
|
// Resolve the attribute name through sanitizeName
|
|
const resolvedAttr = fxb_resolveTagName(attr, true, this.options, matcher, qNameValidator);
|
|
attrStr += this.buildAttrPairStr(resolvedAttr, '' + jObj[key], isCurrentStopNode);
|
|
} else if (!attr) {
|
|
//tag value
|
|
if (key === this.options.textNodeName) {
|
|
let newval = this.options.tagValueProcessor(key, '' + jObj[key]);
|
|
val += this.replaceEntitiesValue(newval);
|
|
} else {
|
|
// Check if this is a stopNode before building
|
|
matcher.push(resolvedKey);
|
|
const isStopNode = this.checkStopNode(matcher);
|
|
matcher.pop();
|
|
|
|
if (isStopNode) {
|
|
// Build as raw content without encoding
|
|
const textValue = '' + jObj[key];
|
|
if (textValue === '') {
|
|
val += this.indentate(level) + '<' + resolvedKey + this.closeTag(resolvedKey) + this.tagEndChar;
|
|
} else {
|
|
val += this.indentate(level) + '<' + resolvedKey + '>' + textValue + '</' + resolvedKey + this.tagEndChar;
|
|
}
|
|
} else {
|
|
val += this.buildTextValNode(jObj[key], resolvedKey, '', level, matcher);
|
|
}
|
|
}
|
|
}
|
|
} else if (Array.isArray(jObj[key])) {
|
|
//repeated nodes
|
|
const arrLen = jObj[key].length;
|
|
let listTagVal = "";
|
|
let listTagAttr = "";
|
|
for (let j = 0; j < arrLen; j++) {
|
|
const item = jObj[key][j];
|
|
if (typeof item === 'undefined') {
|
|
// supress undefined node
|
|
} else if (item === null) {
|
|
if (resolvedKey[0] === "?") val += this.indentate(level) + '<' + resolvedKey + '?' + this.tagEndChar;
|
|
else val += this.indentate(level) + '<' + resolvedKey + '/' + this.tagEndChar;
|
|
} else if (typeof item === 'object') {
|
|
if (this.options.oneListGroup) {
|
|
// Push tag to matcher before recursive call
|
|
matcher.push(resolvedKey);
|
|
const result = this.j2x(item, level + 1, matcher, qNameValidator);
|
|
// Pop tag from matcher after recursive call
|
|
matcher.pop();
|
|
|
|
listTagVal += result.val;
|
|
if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {
|
|
listTagAttr += result.attrStr
|
|
}
|
|
} else {
|
|
listTagVal += this.processTextOrObjNode(item, resolvedKey, level, matcher, qNameValidator)
|
|
}
|
|
} else {
|
|
if (this.options.oneListGroup) {
|
|
let textValue = this.options.tagValueProcessor(resolvedKey, item);
|
|
textValue = this.replaceEntitiesValue(textValue);
|
|
listTagVal += textValue;
|
|
} else {
|
|
// Check if this is a stopNode before building
|
|
matcher.push(resolvedKey);
|
|
const isStopNode = this.checkStopNode(matcher);
|
|
matcher.pop();
|
|
|
|
if (isStopNode) {
|
|
// Build as raw content without encoding
|
|
const textValue = '' + item;
|
|
if (textValue === '') {
|
|
listTagVal += this.indentate(level) + '<' + resolvedKey + this.closeTag(resolvedKey) + this.tagEndChar;
|
|
} else {
|
|
listTagVal += this.indentate(level) + '<' + resolvedKey + '>' + textValue + '</' + resolvedKey + this.tagEndChar;
|
|
}
|
|
} else {
|
|
listTagVal += this.buildTextValNode(item, resolvedKey, '', level, matcher);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (this.options.oneListGroup) {
|
|
listTagVal = this.buildObjectNode(listTagVal, resolvedKey, listTagAttr, level);
|
|
}
|
|
val += listTagVal;
|
|
} else {
|
|
//nested node
|
|
if (this.options.attributesGroupName && key === this.options.attributesGroupName) {
|
|
const Ks = Object.keys(jObj[key]);
|
|
const L = Ks.length;
|
|
for (let j = 0; j < L; j++) {
|
|
// Resolve attribute names inside attributesGroupName
|
|
const resolvedAttr = fxb_resolveTagName(Ks[j], true, this.options, matcher, qNameValidator);
|
|
attrStr += this.buildAttrPairStr(resolvedAttr, '' + jObj[key][Ks[j]], isCurrentStopNode);
|
|
}
|
|
} else {
|
|
val += this.processTextOrObjNode(jObj[key], resolvedKey, level, matcher, qNameValidator)
|
|
}
|
|
}
|
|
}
|
|
return { attrStr: attrStr, val: val };
|
|
};
|
|
|
|
Builder.prototype.buildAttrPairStr = function (attrName, val, isStopNode) {
|
|
if (!isStopNode) {
|
|
val = this.options.attributeValueProcessor(attrName, '' + val);
|
|
val = this.replaceEntitiesValue(val);
|
|
}
|
|
if (this.options.suppressBooleanAttributes && val === "true") {
|
|
return ' ' + attrName;
|
|
} else return ' ' + attrName + '="' + escapeAttribute(val) + '"';
|
|
}
|
|
|
|
function processTextOrObjNode(object, key, level, matcher, qNameValidator) {
|
|
// Extract attributes to pass to matcher
|
|
const attrValues = this.extractAttributes(object);
|
|
|
|
// Push tag to matcher before recursion WITH attributes
|
|
matcher.push(key, attrValues);
|
|
|
|
// Check if this entire node is a stopNode
|
|
const isStopNode = this.checkStopNode(matcher);
|
|
|
|
if (isStopNode) {
|
|
// For stopNodes, build raw content without entity encoding
|
|
const rawContent = this.buildRawContent(object);
|
|
const attrStr = this.buildAttributesForStopNode(object);
|
|
matcher.pop();
|
|
return this.buildObjectNode(rawContent, key, attrStr, level);
|
|
}
|
|
|
|
const result = this.j2x(object, level + 1, matcher, qNameValidator);
|
|
// Pop tag from matcher after recursion
|
|
matcher.pop();
|
|
|
|
// PI/XML-declaration tags must never emit text content — route through
|
|
// buildTextValNode which correctly ignores the text node for "?" tags.
|
|
if (key[0] === '?') {
|
|
return this.buildTextValNode('', key, result.attrStr, level, matcher);
|
|
} else if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {
|
|
return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level, matcher);
|
|
} else {
|
|
return this.buildObjectNode(result.val, key, result.attrStr, level);
|
|
}
|
|
}
|
|
|
|
// Helper method to extract attributes from an object
|
|
Builder.prototype.extractAttributes = function (obj) {
|
|
if (!obj || typeof obj !== 'object') return null;
|
|
|
|
const attrValues = {};
|
|
let hasAttrs = false;
|
|
|
|
// Check for attributesGroupName (when attributes are grouped)
|
|
if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {
|
|
const attrGroup = obj[this.options.attributesGroupName];
|
|
for (let attrKey in attrGroup) {
|
|
if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;
|
|
// Remove attribute prefix if present
|
|
const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)
|
|
? attrKey.substring(this.options.attributeNamePrefix.length)
|
|
: attrKey;
|
|
attrValues[cleanKey] = escapeAttribute(attrGroup[attrKey]);
|
|
hasAttrs = true;
|
|
}
|
|
} else {
|
|
// Look for individual attributes (prefixed with attributeNamePrefix)
|
|
for (let key in obj) {
|
|
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
const attr = this.isAttribute(key);
|
|
if (attr) {
|
|
attrValues[attr] = escapeAttribute(obj[key]);
|
|
hasAttrs = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return hasAttrs ? attrValues : null;
|
|
};
|
|
|
|
// Build raw content for stopNode without entity encoding
|
|
Builder.prototype.buildRawContent = function (obj) {
|
|
if (typeof obj === 'string') {
|
|
return obj; // Already a string, return as-is
|
|
}
|
|
|
|
if (typeof obj !== 'object' || obj === null) {
|
|
return String(obj);
|
|
}
|
|
|
|
// Check if this is a stopNode data from parser: { "#text": "raw xml", "@_attr": "val" }
|
|
if (obj[this.options.textNodeName] !== undefined) {
|
|
return obj[this.options.textNodeName]; // Return raw text without encoding
|
|
}
|
|
|
|
// Build raw XML from nested structure
|
|
let content = '';
|
|
|
|
for (let key in obj) {
|
|
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
|
|
// Skip attributes
|
|
if (this.isAttribute(key)) continue;
|
|
if (this.options.attributesGroupName && key === this.options.attributesGroupName) continue;
|
|
|
|
const value = obj[key];
|
|
|
|
if (key === this.options.textNodeName) {
|
|
content += value; // Raw text
|
|
} else if (Array.isArray(value)) {
|
|
// Array of same tag
|
|
for (let item of value) {
|
|
if (typeof item === 'string' || typeof item === 'number') {
|
|
content += `<${key}>${item}</${key}>`;
|
|
} else if (typeof item === 'object' && item !== null) {
|
|
const nestedContent = this.buildRawContent(item);
|
|
const nestedAttrs = this.buildAttributesForStopNode(item);
|
|
if (nestedContent === '') {
|
|
content += `<${key}${nestedAttrs}/>`;
|
|
} else {
|
|
content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;
|
|
}
|
|
}
|
|
}
|
|
} else if (typeof value === 'object' && value !== null) {
|
|
// Nested object
|
|
const nestedContent = this.buildRawContent(value);
|
|
const nestedAttrs = this.buildAttributesForStopNode(value);
|
|
if (nestedContent === '') {
|
|
content += `<${key}${nestedAttrs}/>`;
|
|
} else {
|
|
content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;
|
|
}
|
|
} else {
|
|
// Primitive value
|
|
content += `<${key}>${value}</${key}>`;
|
|
}
|
|
}
|
|
|
|
return content;
|
|
};
|
|
|
|
// Build attribute string for stopNode (no entity encoding)
|
|
Builder.prototype.buildAttributesForStopNode = function (obj) {
|
|
if (!obj || typeof obj !== 'object') return '';
|
|
|
|
let attrStr = '';
|
|
|
|
// Check for attributesGroupName (when attributes are grouped)
|
|
if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {
|
|
const attrGroup = obj[this.options.attributesGroupName];
|
|
for (let attrKey in attrGroup) {
|
|
if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;
|
|
const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)
|
|
? attrKey.substring(this.options.attributeNamePrefix.length)
|
|
: attrKey;
|
|
const val = attrGroup[attrKey];
|
|
if (val === true && this.options.suppressBooleanAttributes) {
|
|
attrStr += ' ' + cleanKey;
|
|
} else {
|
|
// stopNode content is raw, but the quote delimiter is always escaped
|
|
// so a quote in the value cannot break out of the attribute (see orderedJs2Xml attr_to_str)
|
|
attrStr += ' ' + cleanKey + '="' + escapeAttribute(val) + '"';
|
|
}
|
|
}
|
|
} else {
|
|
// Look for individual attributes
|
|
for (let key in obj) {
|
|
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
const attr = this.isAttribute(key);
|
|
if (attr) {
|
|
const val = obj[key];
|
|
if (val === true && this.options.suppressBooleanAttributes) {
|
|
attrStr += ' ' + attr;
|
|
} else {
|
|
// stopNode content is raw, but the quote delimiter is always escaped
|
|
// so a quote in the value cannot break out of the attribute (see orderedJs2Xml attr_to_str)
|
|
attrStr += ' ' + attr + '="' + escapeAttribute(val) + '"';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return attrStr;
|
|
};
|
|
|
|
Builder.prototype.buildObjectNode = function (val, key, attrStr, level) {
|
|
if (val === "") {
|
|
if (key[0] === "?") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
|
|
else {
|
|
return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;
|
|
}
|
|
} else if (key[0] === "?") {
|
|
// PI/XML-declaration tags never have body content — treat them like empty.
|
|
return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
|
|
} else {
|
|
let tagEndExp = '</' + key + this.tagEndChar;
|
|
let piClosingChar = "";
|
|
|
|
if (key[0] === "?") {
|
|
piClosingChar = "?";
|
|
tagEndExp = "";
|
|
}
|
|
|
|
// attrStr is an empty string in case the attribute came as undefined or null
|
|
if ((attrStr || attrStr === '') && val.indexOf('<') === -1) {
|
|
return (this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp);
|
|
} else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {
|
|
return this.indentate(level) + `<!--${safeComment(val)}-->` + this.newLine;
|
|
} else {
|
|
return (
|
|
this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +
|
|
val +
|
|
this.indentate(level) + tagEndExp);
|
|
}
|
|
}
|
|
}
|
|
|
|
Builder.prototype.closeTag = function (key) {
|
|
let closeTag = "";
|
|
if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired
|
|
if (!this.options.suppressUnpairedNode) closeTag = "/"
|
|
} else if (this.options.suppressEmptyNode) { //empty
|
|
closeTag = "/";
|
|
} else {
|
|
closeTag = `></${key}`
|
|
}
|
|
return closeTag;
|
|
}
|
|
|
|
Builder.prototype.checkStopNode = function (matcher) {
|
|
if (!this.stopNodeExpressions || this.stopNodeExpressions.length === 0) return false;
|
|
|
|
for (let i = 0; i < this.stopNodeExpressions.length; i++) {
|
|
if (matcher.matches(this.stopNodeExpressions[i])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function buildEmptyObjNode(val, key, attrStr, level) {
|
|
if (val !== '') {
|
|
return this.buildObjectNode(val, key, attrStr, level);
|
|
} else {
|
|
if (key[0] === "?") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
|
|
else {
|
|
return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;
|
|
}
|
|
}
|
|
}
|
|
|
|
Builder.prototype.buildTextValNode = function (val, key, attrStr, level, matcher) {
|
|
if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {
|
|
const safeVal = safeCdata(val);
|
|
return this.indentate(level) + `<![CDATA[${safeVal}]]>` + this.newLine;
|
|
} else if (this.options.commentPropName !== false && key === this.options.commentPropName) {
|
|
const safeVal = safeComment(val);
|
|
return this.indentate(level) + `<!--${safeVal}-->` + this.newLine;
|
|
} else if (key[0] === "?") {//PI tag
|
|
return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;
|
|
} else {
|
|
// Normal processing: apply tagValueProcessor and entity replacement
|
|
let textValue = this.options.tagValueProcessor(key, val);
|
|
textValue = this.replaceEntitiesValue(textValue);
|
|
|
|
if (textValue === '') {
|
|
return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;
|
|
} else {
|
|
return this.indentate(level) + '<' + key + attrStr + '>' +
|
|
textValue +
|
|
'</' + key + this.tagEndChar;
|
|
}
|
|
}
|
|
}
|
|
|
|
Builder.prototype.replaceEntitiesValue = function (textValue) {
|
|
if (textValue && textValue.length > 0 && this.options.processEntities) {
|
|
for (let i = 0; i < this.options.entities.length; i++) {
|
|
const entity = this.options.entities[i];
|
|
textValue = textValue.replace(entity.regex, entity.val);
|
|
}
|
|
}
|
|
return textValue;
|
|
}
|
|
|
|
function indentate(level) {
|
|
return this.options.indentBy.repeat(level);
|
|
}
|
|
|
|
function isAttribute(name /*, options*/) {
|
|
if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {
|
|
return name.substr(this.attrPrefixLen);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
;// CONCATENATED MODULE: ./node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js
|
|
// Re-export from fast-xml-builder for backward compatibility
|
|
|
|
/* harmony default export */ const json2xml = (Builder);
|
|
|
|
// If there are any named exports you also want to re-export:
|
|
|
|
// EXTERNAL MODULE: ./node_modules/fast-xml-parser/src/fxp.js
|
|
var fxp = __webpack_require__(5824);
|
|
// EXTERNAL MODULE: ./node_modules/fast-xml-parser/src/xmlparser/XMLParser.js + 22 modules
|
|
var XMLParser = __webpack_require__(6009);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-xml/dist/esm/xml.common.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Default key used to access the XML attributes.
|
|
*/
|
|
const xml_common_XML_ATTRKEY = "$";
|
|
/**
|
|
* Default key used to access the XML value content.
|
|
*/
|
|
const xml_common_XML_CHARKEY = "_";
|
|
//# sourceMappingURL=xml.common.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-xml/dist/esm/xml.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
function getCommonOptions(options) {
|
|
return {
|
|
attributesGroupName: xml_common_XML_ATTRKEY,
|
|
textNodeName: options.xmlCharKey ?? xml_common_XML_CHARKEY,
|
|
ignoreAttributes: false,
|
|
suppressBooleanAttributes: false,
|
|
};
|
|
}
|
|
function getSerializerOptions(options = {}) {
|
|
return {
|
|
...getCommonOptions(options),
|
|
attributeNamePrefix: "@_",
|
|
format: true,
|
|
suppressEmptyNode: true,
|
|
indentBy: "",
|
|
rootNodeName: options.rootName ?? "root",
|
|
cdataPropName: options.cdataPropName ?? "__cdata",
|
|
};
|
|
}
|
|
function getParserOptions(options = {}) {
|
|
return {
|
|
...getCommonOptions(options),
|
|
parseAttributeValue: false,
|
|
parseTagValue: false,
|
|
attributeNamePrefix: "",
|
|
stopNodes: options.stopNodes,
|
|
processEntities: true,
|
|
trimValues: false,
|
|
};
|
|
}
|
|
/**
|
|
* Converts given JSON object to XML string
|
|
* @param obj - JSON object to be converted into XML string
|
|
* @param opts - Options that govern the XML building of given JSON object
|
|
* `rootName` indicates the name of the root element in the resulting XML
|
|
*/
|
|
function stringifyXML(obj, opts = {}) {
|
|
const parserOptions = getSerializerOptions(opts);
|
|
const j2x = new json2xml(parserOptions);
|
|
const node = { [parserOptions.rootNodeName]: obj };
|
|
const xmlData = j2x.build(node);
|
|
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>${xmlData}`.replace(/\n/g, "");
|
|
}
|
|
/**
|
|
* Converts given XML string into JSON
|
|
* @param str - String containing the XML content to be parsed into JSON
|
|
* @param opts - Options that govern the parsing of given xml string
|
|
* `includeRoot` indicates whether the root element is to be included or not in the output
|
|
*/
|
|
async function parseXML(str, opts = {}) {
|
|
if (!str) {
|
|
throw new Error("Document is empty");
|
|
}
|
|
const validation = fxp/* XMLValidator */.i.validate(str);
|
|
if (validation !== true) {
|
|
throw validation;
|
|
}
|
|
const parser = new XMLParser/* default */.A(getParserOptions(opts));
|
|
const parsedXml = parser.parse(str);
|
|
// Remove the <?xml version="..." ?> node.
|
|
// This is a change in behavior on fxp v4. Issue #424
|
|
if (parsedXml["?xml"]) {
|
|
delete parsedXml["?xml"];
|
|
}
|
|
if (!opts.includeRoot) {
|
|
const key = Object.keys(parsedXml)[0];
|
|
if (key !== undefined) {
|
|
const value = parsedXml[key];
|
|
return typeof value === "object" ? { ...value } : value;
|
|
}
|
|
}
|
|
return parsedXml;
|
|
}
|
|
//# sourceMappingURL=xml.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The `@azure/logger` configuration for this package.
|
|
*/
|
|
const storage_blob_dist_esm_log_logger = esm_createClientLogger("storage-blob");
|
|
//# sourceMappingURL=log.js.map
|
|
// EXTERNAL MODULE: external "events"
|
|
var external_events_ = __webpack_require__(4434);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/BuffersStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* This class generates a readable stream from the data in an array of buffers.
|
|
*/
|
|
class BuffersStream extends external_node_stream_.Readable {
|
|
buffers;
|
|
byteLength;
|
|
/**
|
|
* The offset of data to be read in the current buffer.
|
|
*/
|
|
byteOffsetInCurrentBuffer;
|
|
/**
|
|
* The index of buffer to be read in the array of buffers.
|
|
*/
|
|
bufferIndex;
|
|
/**
|
|
* The total length of data already read.
|
|
*/
|
|
pushedBytesLength;
|
|
/**
|
|
* Creates an instance of BuffersStream that will emit the data
|
|
* contained in the array of buffers.
|
|
*
|
|
* @param buffers - Array of buffers containing the data
|
|
* @param byteLength - The total length of data contained in the buffers
|
|
*/
|
|
constructor(buffers, byteLength, options) {
|
|
super(options);
|
|
this.buffers = buffers;
|
|
this.byteLength = byteLength;
|
|
this.byteOffsetInCurrentBuffer = 0;
|
|
this.bufferIndex = 0;
|
|
this.pushedBytesLength = 0;
|
|
// check byteLength is no larger than buffers[] total length
|
|
let buffersLength = 0;
|
|
for (const buf of this.buffers) {
|
|
buffersLength += buf.byteLength;
|
|
}
|
|
if (buffersLength < this.byteLength) {
|
|
throw new Error("Data size shouldn't be larger than the total length of buffers.");
|
|
}
|
|
}
|
|
/**
|
|
* Internal _read() that will be called when the stream wants to pull more data in.
|
|
*
|
|
* @param size - Optional. The size of data to be read
|
|
*/
|
|
_read(size) {
|
|
if (this.pushedBytesLength >= this.byteLength) {
|
|
this.push(null);
|
|
}
|
|
if (!size) {
|
|
size = this.readableHighWaterMark;
|
|
}
|
|
const outBuffers = [];
|
|
let i = 0;
|
|
while (i < size && this.pushedBytesLength < this.byteLength) {
|
|
// The last buffer may be longer than the data it contains.
|
|
const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength;
|
|
const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer;
|
|
const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers);
|
|
if (remaining > size - i) {
|
|
// chunkSize = size - i
|
|
const end = this.byteOffsetInCurrentBuffer + size - i;
|
|
outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
|
|
this.pushedBytesLength += size - i;
|
|
this.byteOffsetInCurrentBuffer = end;
|
|
i = size;
|
|
break;
|
|
}
|
|
else {
|
|
// chunkSize = remaining
|
|
const end = this.byteOffsetInCurrentBuffer + remaining;
|
|
outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end));
|
|
if (remaining === remainingCapacityInThisBuffer) {
|
|
// this.buffers[this.bufferIndex] used up, shift to next one
|
|
this.byteOffsetInCurrentBuffer = 0;
|
|
this.bufferIndex++;
|
|
}
|
|
else {
|
|
this.byteOffsetInCurrentBuffer = end;
|
|
}
|
|
this.pushedBytesLength += remaining;
|
|
i += remaining;
|
|
}
|
|
}
|
|
if (outBuffers.length > 1) {
|
|
this.push(Buffer.concat(outBuffers));
|
|
}
|
|
else if (outBuffers.length === 1) {
|
|
this.push(outBuffers[0]);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=BuffersStream.js.map
|
|
// EXTERNAL MODULE: external "node:buffer"
|
|
var external_node_buffer_ = __webpack_require__(4573);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/PooledBuffer.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* maxBufferLength is max size of each buffer in the pooled buffers.
|
|
*/
|
|
const maxBufferLength = external_node_buffer_.constants.MAX_LENGTH;
|
|
/**
|
|
* This class provides a buffer container which conceptually has no hard size limit.
|
|
* It accepts a capacity, an array of input buffers and the total length of input data.
|
|
* It will allocate an internal "buffer" of the capacity and fill the data in the input buffers
|
|
* into the internal "buffer" serially with respect to the total length.
|
|
* Then by calling PooledBuffer.getReadableStream(), you can get a readable stream
|
|
* assembled from all the data in the internal "buffer".
|
|
*/
|
|
class PooledBuffer {
|
|
/**
|
|
* Internal buffers used to keep the data.
|
|
* Each buffer has a length of the maxBufferLength except last one.
|
|
*/
|
|
buffers = [];
|
|
/**
|
|
* The total size of internal buffers.
|
|
*/
|
|
capacity;
|
|
/**
|
|
* The total size of data contained in internal buffers.
|
|
*/
|
|
_size;
|
|
/**
|
|
* The size of the data contained in the pooled buffers.
|
|
*/
|
|
get size() {
|
|
return this._size;
|
|
}
|
|
constructor(capacity, buffers, totalLength) {
|
|
this.capacity = capacity;
|
|
this._size = 0;
|
|
// allocate
|
|
const bufferNum = Math.ceil(capacity / maxBufferLength);
|
|
for (let i = 0; i < bufferNum; i++) {
|
|
let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength;
|
|
if (len === 0) {
|
|
len = maxBufferLength;
|
|
}
|
|
this.buffers.push(Buffer.allocUnsafe(len));
|
|
}
|
|
if (buffers) {
|
|
this.fill(buffers, totalLength);
|
|
}
|
|
}
|
|
/**
|
|
* Fill the internal buffers with data in the input buffers serially
|
|
* with respect to the total length and the total capacity of the internal buffers.
|
|
* Data copied will be shift out of the input buffers.
|
|
*
|
|
* @param buffers - Input buffers containing the data to be filled in the pooled buffer
|
|
* @param totalLength - Total length of the data to be filled in.
|
|
*
|
|
*/
|
|
fill(buffers, totalLength) {
|
|
this._size = Math.min(this.capacity, totalLength);
|
|
let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0;
|
|
while (totalCopiedNum < this._size) {
|
|
const source = buffers[i];
|
|
const target = this.buffers[j];
|
|
const copiedNum = source.copy(target, targetOffset, sourceOffset);
|
|
totalCopiedNum += copiedNum;
|
|
sourceOffset += copiedNum;
|
|
targetOffset += copiedNum;
|
|
if (sourceOffset === source.length) {
|
|
i++;
|
|
sourceOffset = 0;
|
|
}
|
|
if (targetOffset === target.length) {
|
|
j++;
|
|
targetOffset = 0;
|
|
}
|
|
}
|
|
// clear copied from source buffers
|
|
buffers.splice(0, i);
|
|
if (buffers.length > 0) {
|
|
buffers[0] = buffers[0].slice(sourceOffset);
|
|
}
|
|
}
|
|
/**
|
|
* Get the readable stream assembled from all the data in the internal buffers.
|
|
*
|
|
*/
|
|
getReadableStream() {
|
|
return new BuffersStream(this.buffers, this.size);
|
|
}
|
|
}
|
|
//# sourceMappingURL=PooledBuffer.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/BufferScheduler.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* This class accepts a Node.js Readable stream as input, and keeps reading data
|
|
* from the stream into the internal buffer structure, until it reaches maxBuffers.
|
|
* Every available buffer will try to trigger outgoingHandler.
|
|
*
|
|
* The internal buffer structure includes an incoming buffer array, and a outgoing
|
|
* buffer array. The incoming buffer array includes the "empty" buffers can be filled
|
|
* with new incoming data. The outgoing array includes the filled buffers to be
|
|
* handled by outgoingHandler. Every above buffer size is defined by parameter bufferSize.
|
|
*
|
|
* NUM_OF_ALL_BUFFERS = BUFFERS_IN_INCOMING + BUFFERS_IN_OUTGOING + BUFFERS_UNDER_HANDLING
|
|
*
|
|
* NUM_OF_ALL_BUFFERS lesser than or equal to maxBuffers
|
|
*
|
|
* PERFORMANCE IMPROVEMENT TIPS:
|
|
* 1. Input stream highWaterMark is better to set a same value with bufferSize
|
|
* parameter, which will avoid Buffer.concat() operations.
|
|
* 2. concurrency should set a smaller value than maxBuffers, which is helpful to
|
|
* reduce the possibility when a outgoing handler waits for the stream data.
|
|
* in this situation, outgoing handlers are blocked.
|
|
* Outgoing queue shouldn't be empty.
|
|
*/
|
|
class BufferScheduler {
|
|
/**
|
|
* Size of buffers in incoming and outgoing queues. This class will try to align
|
|
* data read from Readable stream into buffer chunks with bufferSize defined.
|
|
*/
|
|
bufferSize;
|
|
/**
|
|
* How many buffers can be created or maintained.
|
|
*/
|
|
maxBuffers;
|
|
/**
|
|
* A Node.js Readable stream.
|
|
*/
|
|
readable;
|
|
/**
|
|
* OutgoingHandler is an async function triggered by BufferScheduler when there
|
|
* are available buffers in outgoing array.
|
|
*/
|
|
outgoingHandler;
|
|
/**
|
|
* An internal event emitter.
|
|
*/
|
|
emitter = new external_events_.EventEmitter();
|
|
/**
|
|
* Concurrency of executing outgoingHandlers. (0 lesser than concurrency lesser than or equal to maxBuffers)
|
|
*/
|
|
concurrency;
|
|
/**
|
|
* An internal offset marker to track data offset in bytes of next outgoingHandler.
|
|
*/
|
|
offset = 0;
|
|
/**
|
|
* An internal marker to track whether stream is end.
|
|
*/
|
|
isStreamEnd = false;
|
|
/**
|
|
* An internal marker to track whether stream or outgoingHandler returns error.
|
|
*/
|
|
isError = false;
|
|
/**
|
|
* How many handlers are executing.
|
|
*/
|
|
executingOutgoingHandlers = 0;
|
|
/**
|
|
* Encoding of the input Readable stream which has string data type instead of Buffer.
|
|
*/
|
|
encoding;
|
|
/**
|
|
* How many buffers have been allocated.
|
|
*/
|
|
numBuffers = 0;
|
|
/**
|
|
* Because this class doesn't know how much data every time stream pops, which
|
|
* is defined by highWaterMarker of the stream. So BufferScheduler will cache
|
|
* data received from the stream, when data in unresolvedDataArray exceeds the
|
|
* blockSize defined, it will try to concat a blockSize of buffer, fill into available
|
|
* buffers from incoming and push to outgoing array.
|
|
*/
|
|
unresolvedDataArray = [];
|
|
/**
|
|
* How much data consisted in unresolvedDataArray.
|
|
*/
|
|
unresolvedLength = 0;
|
|
/**
|
|
* The array includes all the available buffers can be used to fill data from stream.
|
|
*/
|
|
incoming = [];
|
|
/**
|
|
* The array (queue) includes all the buffers filled from stream data.
|
|
*/
|
|
outgoing = [];
|
|
/**
|
|
* Creates an instance of BufferScheduler.
|
|
*
|
|
* @param readable - A Node.js Readable stream
|
|
* @param bufferSize - Buffer size of every maintained buffer
|
|
* @param maxBuffers - How many buffers can be allocated
|
|
* @param outgoingHandler - An async function scheduled to be
|
|
* triggered when a buffer fully filled
|
|
* with stream data
|
|
* @param concurrency - Concurrency of executing outgoingHandlers (>0)
|
|
* @param encoding - [Optional] Encoding of Readable stream when it's a string stream
|
|
*/
|
|
constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) {
|
|
if (bufferSize <= 0) {
|
|
throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`);
|
|
}
|
|
if (maxBuffers <= 0) {
|
|
throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`);
|
|
}
|
|
if (concurrency <= 0) {
|
|
throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`);
|
|
}
|
|
this.bufferSize = bufferSize;
|
|
this.maxBuffers = maxBuffers;
|
|
this.readable = readable;
|
|
this.outgoingHandler = outgoingHandler;
|
|
this.concurrency = concurrency;
|
|
this.encoding = encoding;
|
|
}
|
|
/**
|
|
* Start the scheduler, will return error when stream of any of the outgoingHandlers
|
|
* returns error.
|
|
*
|
|
*/
|
|
async do() {
|
|
return new Promise((resolve, reject) => {
|
|
this.readable.on("data", (data) => {
|
|
data = typeof data === "string" ? Buffer.from(data, this.encoding) : data;
|
|
this.appendUnresolvedData(data);
|
|
if (!this.resolveData()) {
|
|
this.readable.pause();
|
|
}
|
|
});
|
|
this.readable.on("error", (err) => {
|
|
this.emitter.emit("error", err);
|
|
});
|
|
this.readable.on("end", () => {
|
|
this.isStreamEnd = true;
|
|
this.emitter.emit("checkEnd");
|
|
});
|
|
this.emitter.on("error", (err) => {
|
|
this.isError = true;
|
|
this.readable.pause();
|
|
reject(err);
|
|
});
|
|
this.emitter.on("checkEnd", () => {
|
|
if (this.outgoing.length > 0) {
|
|
this.triggerOutgoingHandlers();
|
|
return;
|
|
}
|
|
if (this.isStreamEnd && this.executingOutgoingHandlers === 0) {
|
|
if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) {
|
|
const buffer = this.shiftBufferFromUnresolvedDataArray();
|
|
this.outgoingHandler(() => buffer.getReadableStream(), buffer.size, this.offset)
|
|
.then(resolve)
|
|
.catch(reject);
|
|
}
|
|
else if (this.unresolvedLength >= this.bufferSize) {
|
|
return;
|
|
}
|
|
else {
|
|
resolve();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* Insert a new data into unresolved array.
|
|
*
|
|
* @param data -
|
|
*/
|
|
appendUnresolvedData(data) {
|
|
this.unresolvedDataArray.push(data);
|
|
this.unresolvedLength += data.length;
|
|
}
|
|
/**
|
|
* Try to shift a buffer with size in blockSize. The buffer returned may be less
|
|
* than blockSize when data in unresolvedDataArray is less than bufferSize.
|
|
*
|
|
*/
|
|
shiftBufferFromUnresolvedDataArray(buffer) {
|
|
if (!buffer) {
|
|
buffer = new PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength);
|
|
}
|
|
else {
|
|
buffer.fill(this.unresolvedDataArray, this.unresolvedLength);
|
|
}
|
|
this.unresolvedLength -= buffer.size;
|
|
return buffer;
|
|
}
|
|
/**
|
|
* Resolve data in unresolvedDataArray. For every buffer with size in blockSize
|
|
* shifted, it will try to get (or allocate a buffer) from incoming, and fill it,
|
|
* then push it into outgoing to be handled by outgoing handler.
|
|
*
|
|
* Return false when available buffers in incoming are not enough, else true.
|
|
*
|
|
* @returns Return false when buffers in incoming are not enough, else true.
|
|
*/
|
|
resolveData() {
|
|
while (this.unresolvedLength >= this.bufferSize) {
|
|
let buffer;
|
|
if (this.incoming.length > 0) {
|
|
buffer = this.incoming.shift();
|
|
this.shiftBufferFromUnresolvedDataArray(buffer);
|
|
}
|
|
else {
|
|
if (this.numBuffers < this.maxBuffers) {
|
|
buffer = this.shiftBufferFromUnresolvedDataArray();
|
|
this.numBuffers++;
|
|
}
|
|
else {
|
|
// No available buffer, wait for buffer returned
|
|
return false;
|
|
}
|
|
}
|
|
this.outgoing.push(buffer);
|
|
this.triggerOutgoingHandlers();
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Try to trigger a outgoing handler for every buffer in outgoing. Stop when
|
|
* concurrency reaches.
|
|
*/
|
|
async triggerOutgoingHandlers() {
|
|
let buffer;
|
|
do {
|
|
if (this.executingOutgoingHandlers >= this.concurrency) {
|
|
return;
|
|
}
|
|
buffer = this.outgoing.shift();
|
|
if (buffer) {
|
|
this.triggerOutgoingHandler(buffer);
|
|
}
|
|
} while (buffer);
|
|
}
|
|
/**
|
|
* Trigger a outgoing handler for a buffer shifted from outgoing.
|
|
*
|
|
* @param buffer -
|
|
*/
|
|
async triggerOutgoingHandler(buffer) {
|
|
const bufferLength = buffer.size;
|
|
this.executingOutgoingHandlers++;
|
|
this.offset += bufferLength;
|
|
try {
|
|
await this.outgoingHandler(() => buffer.getReadableStream(), bufferLength, this.offset - bufferLength);
|
|
}
|
|
catch (err) {
|
|
this.emitter.emit("error", err);
|
|
return;
|
|
}
|
|
this.executingOutgoingHandlers--;
|
|
this.reuseBuffer(buffer);
|
|
this.emitter.emit("checkEnd");
|
|
}
|
|
/**
|
|
* Return buffer used by outgoing handler into incoming.
|
|
*
|
|
* @param buffer -
|
|
*/
|
|
reuseBuffer(buffer) {
|
|
this.incoming.push(buffer);
|
|
if (!this.isError && this.resolveData() && !this.isStreamEnd) {
|
|
this.readable.resume();
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=BufferScheduler.js.map
|
|
// EXTERNAL MODULE: external "node:module"
|
|
var external_node_module_ = __webpack_require__(8995);
|
|
// EXTERNAL MODULE: external "node:path"
|
|
var external_node_path_ = __webpack_require__(6760);
|
|
// EXTERNAL MODULE: external "node:url"
|
|
var external_node_url_ = __webpack_require__(3136);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/crc64.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
// ESM-COMPAT-START (this block is stripped from dist/commonjs by copyJSFiles.cjs)
|
|
// In ESM under Node, `require`, `__filename`, and `__dirname` are not defined.
|
|
// Synthesize them from `import.meta.url` so the Emscripten Node branch below works as-is.
|
|
// Specifiers are held in variables to prevent web bundlers from statically resolving `node:*`.
|
|
// The detection check below MUST stay byte-for-byte identical to the Emscripten-generated
|
|
// `ENVIRONMENT_IS_NODE` check later in this file; otherwise the polyfill and the Node branch
|
|
// can disagree and the ESM `ReferenceError: require is not defined` bug returns.
|
|
|
|
|
|
|
|
const __isNode__ =
|
|
typeof process === "object" &&
|
|
typeof process.versions === "object" &&
|
|
typeof process.versions.node === "string";
|
|
let crc64_require;
|
|
let crc64_filename;
|
|
let crc64_dirname;
|
|
if (__isNode__) {
|
|
crc64_require = (0,external_node_module_.createRequire)(import.meta.url);
|
|
crc64_filename = (0,external_node_url_.fileURLToPath)(import.meta.url);
|
|
crc64_dirname = (0,external_node_path_.dirname)(crc64_filename);
|
|
}
|
|
// ESM-COMPAT-END
|
|
|
|
var NativeCRC64 = (() => {
|
|
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
|
if (typeof crc64_filename !== 'undefined') _scriptDir = _scriptDir || crc64_filename;
|
|
return (
|
|
function(NativeCRC64) {
|
|
NativeCRC64 = NativeCRC64 || {};
|
|
|
|
|
|
|
|
// The Module object: Our interface to the outside world. We import
|
|
// and export values on it. There are various ways Module can be used:
|
|
// 1. Not defined. We create it here
|
|
// 2. A function parameter, function(Module) { ..generated code.. }
|
|
// 3. pre-run appended it, var Module = {}; ..generated code..
|
|
// 4. External script tag defines var Module.
|
|
// We need to check if Module already exists (e.g. case 3 above).
|
|
// Substitution will be replaced with actual code on later stage of the build,
|
|
// this way Closure Compiler will not mangle it (e.g. case 4. above).
|
|
// Note that if you want to run closure, and also to use Module
|
|
// after the generated code, you will need to define var Module = {};
|
|
// before the code. Then that object will be used in the code, and you
|
|
// can continue to use Module afterwards as well.
|
|
var Module = typeof NativeCRC64 != 'undefined' ? NativeCRC64 : {};
|
|
|
|
// See https://caniuse.com/mdn-javascript_builtins_object_assign
|
|
|
|
// See https://caniuse.com/mdn-javascript_builtins_bigint64array
|
|
|
|
// Set up the promise that indicates the Module is initialized
|
|
var readyPromiseResolve, readyPromiseReject;
|
|
Module['ready'] = new Promise(function(resolve, reject) {
|
|
readyPromiseResolve = resolve;
|
|
readyPromiseReject = reject;
|
|
});
|
|
["_malloc","_free","_emscripten_bind_VoidPtr___destroy___0","_emscripten_bind_Crc64Hash_Crc64Hash_0","_emscripten_bind_Crc64Hash_OnAppend_2","_emscripten_bind_Crc64Hash_OnFinal_3","_emscripten_bind_Crc64Hash___destroy___0","_fflush","onRuntimeInitialized"].forEach((prop) => {
|
|
if (!Object.getOwnPropertyDescriptor(Module['ready'], prop)) {
|
|
Object.defineProperty(Module['ready'], prop, {
|
|
get: () => abort('You are getting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'),
|
|
set: () => abort('You are setting ' + prop + ' on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js'),
|
|
});
|
|
}
|
|
});
|
|
|
|
// --pre-jses are emitted after the Module integration code, so that they can
|
|
// refer to Module (if they choose; they can also define Module)
|
|
|
|
|
|
// Sometimes an existing Module object exists with properties
|
|
// meant to overwrite the default module functionality. Here
|
|
// we collect those properties and reapply _after_ we configure
|
|
// the current environment's defaults to avoid having to be so
|
|
// defensive during initialization.
|
|
var moduleOverrides = Object.assign({}, Module);
|
|
|
|
var arguments_ = [];
|
|
var thisProgram = './this.program';
|
|
var quit_ = (status, toThrow) => {
|
|
throw toThrow;
|
|
};
|
|
|
|
// Determine the runtime environment we are in. You can customize this by
|
|
// setting the ENVIRONMENT setting at compile time (see settings.js).
|
|
|
|
// Attempt to auto-detect the environment
|
|
var ENVIRONMENT_IS_WEB = typeof window == 'object';
|
|
var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function';
|
|
// N.b. Electron.js environment is simultaneously a NODE-environment, but
|
|
// also a web environment.
|
|
var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string';
|
|
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
|
|
|
|
if (Module['ENVIRONMENT']) {
|
|
throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)');
|
|
}
|
|
|
|
// `/` should be present at the end if `scriptDirectory` is not empty
|
|
var scriptDirectory = '';
|
|
function locateFile(path) {
|
|
if (Module['locateFile']) {
|
|
return Module['locateFile'](path, scriptDirectory);
|
|
}
|
|
return scriptDirectory + path;
|
|
}
|
|
|
|
// Hooks that are implemented differently in different runtime environments.
|
|
var read_,
|
|
readAsync,
|
|
readBinary,
|
|
setWindowTitle;
|
|
|
|
// Normally we don't log exceptions but instead let them bubble out the top
|
|
// level where the embedding environment (e.g. the browser) can handle
|
|
// them.
|
|
// However under v8 and node we sometimes exit the process direcly in which case
|
|
// its up to use us to log the exception before exiting.
|
|
// If we fix https://github.com/emscripten-core/emscripten/issues/15080
|
|
// this may no longer be needed under node.
|
|
function logExceptionOnExit(e) {
|
|
if (e instanceof ExitStatus) return;
|
|
let toLog = e;
|
|
if (e && typeof e == 'object' && e.stack) {
|
|
toLog = [e, e.stack];
|
|
}
|
|
err('exiting due to exception: ' + toLog);
|
|
}
|
|
|
|
if (ENVIRONMENT_IS_NODE) {
|
|
if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
|
|
// NODE-READ-START (this block is replaced with a no-op in dist/browser and dist/react-native by copyJSFiles.cjs)
|
|
// `require()` is no-op in an ESM module, use `createRequire()` to construct
|
|
// the require()` function. This is only necessary for multi-environment
|
|
// builds, `-sENVIRONMENT=node` emits a static import declaration instead.
|
|
// TODO: Swap all `require()`'s with `import()`'s?
|
|
// These modules will usually be used on Node.js. Load them eagerly to avoid
|
|
// the complexity of lazy-loading.
|
|
var fs = crc64_require('fs');
|
|
var nodePath = crc64_require('path');
|
|
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
scriptDirectory = nodePath.dirname(scriptDirectory) + '/';
|
|
} else {
|
|
scriptDirectory = crc64_dirname + '/';
|
|
}
|
|
|
|
// include: node_shell_read.js
|
|
|
|
|
|
read_ = (filename, binary) => {
|
|
// We need to re-wrap `file://` strings to URLs. Normalizing isn't
|
|
// necessary in that case, the path should already be absolute.
|
|
filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);
|
|
return fs.readFileSync(filename, binary ? undefined : 'utf8');
|
|
};
|
|
|
|
readBinary = (filename) => {
|
|
var ret = read_(filename, true);
|
|
if (!ret.buffer) {
|
|
ret = new Uint8Array(ret);
|
|
}
|
|
assert(ret.buffer);
|
|
return ret;
|
|
};
|
|
|
|
readAsync = (filename, onload, onerror) => {
|
|
// See the comment in the `read_` function.
|
|
filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename);
|
|
fs.readFile(filename, function(err, data) {
|
|
if (err) onerror(err);
|
|
else onload(data.buffer);
|
|
});
|
|
};
|
|
|
|
// end include: node_shell_read.js
|
|
// NODE-READ-END
|
|
if (process['argv'].length > 1) {
|
|
thisProgram = process['argv'][1].replace(/\\/g, '/');
|
|
}
|
|
|
|
arguments_ = process['argv'].slice(2);
|
|
|
|
// MODULARIZE will export the module in the proper place outside, we don't need to export here
|
|
|
|
process['on']('uncaughtException', function(ex) {
|
|
// suppress ExitStatus exceptions from showing an error
|
|
if (!(ex instanceof ExitStatus)) {
|
|
throw ex;
|
|
}
|
|
});
|
|
|
|
// Without this older versions of node (< v15) will log unhandled rejections
|
|
// but return 0, which is not normally the desired behaviour. This is
|
|
// not be needed with node v15 and about because it is now the default
|
|
// behaviour:
|
|
// See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
|
|
process['on']('unhandledRejection', function(reason) { throw reason; });
|
|
|
|
quit_ = (status, toThrow) => {
|
|
if (keepRuntimeAlive()) {
|
|
process['exitCode'] = status;
|
|
throw toThrow;
|
|
}
|
|
logExceptionOnExit(toThrow);
|
|
process['exit'](status);
|
|
};
|
|
|
|
Module['inspect'] = function () { return '[Emscripten Module object]'; };
|
|
|
|
} else
|
|
if (ENVIRONMENT_IS_SHELL) {
|
|
|
|
if ((typeof process == 'object' && typeof crc64_require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
|
|
|
|
if (typeof read != 'undefined') {
|
|
read_ = function shell_read(f) {
|
|
return read(f);
|
|
};
|
|
}
|
|
|
|
readBinary = function readBinary(f) {
|
|
let data;
|
|
if (typeof readbuffer == 'function') {
|
|
return new Uint8Array(readbuffer(f));
|
|
}
|
|
data = read(f, 'binary');
|
|
assert(typeof data == 'object');
|
|
return data;
|
|
};
|
|
|
|
readAsync = function readAsync(f, onload, onerror) {
|
|
setTimeout(() => onload(readBinary(f)), 0);
|
|
};
|
|
|
|
if (typeof scriptArgs != 'undefined') {
|
|
arguments_ = scriptArgs;
|
|
} else if (typeof arguments != 'undefined') {
|
|
arguments_ = arguments;
|
|
}
|
|
|
|
if (typeof quit == 'function') {
|
|
quit_ = (status, toThrow) => {
|
|
logExceptionOnExit(toThrow);
|
|
quit(status);
|
|
};
|
|
}
|
|
|
|
if (typeof print != 'undefined') {
|
|
// Prefer to use print/printErr where they exist, as they usually work better.
|
|
if (typeof console == 'undefined') console = /** @type{!Console} */({});
|
|
console.log = /** @type{!function(this:Console, ...*): undefined} */ (print);
|
|
console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print);
|
|
}
|
|
|
|
} else
|
|
|
|
// Note that this includes Node.js workers when relevant (pthreads is enabled).
|
|
// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
|
|
// ENVIRONMENT_IS_NODE.
|
|
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
|
|
if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
|
|
scriptDirectory = self.location.href;
|
|
} else if (typeof document != 'undefined' && document.currentScript) { // web
|
|
scriptDirectory = document.currentScript.src;
|
|
}
|
|
// When MODULARIZE, this JS may be executed later, after document.currentScript
|
|
// is gone, so we saved it, and we use it here instead of any other info.
|
|
if (_scriptDir) {
|
|
scriptDirectory = _scriptDir;
|
|
}
|
|
// blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
|
|
// otherwise, slice off the final part of the url to find the script directory.
|
|
// if scriptDirectory does not contain a slash, lastIndexOf will return -1,
|
|
// and scriptDirectory will correctly be replaced with an empty string.
|
|
// If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
|
|
// they are removed because they could contain a slash.
|
|
if (scriptDirectory.indexOf('blob:') !== 0) {
|
|
scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1);
|
|
} else {
|
|
scriptDirectory = '';
|
|
}
|
|
|
|
if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
|
|
|
|
// Differentiate the Web Worker from the Node Worker case, as reading must
|
|
// be done differently.
|
|
{
|
|
// include: web_or_worker_shell_read.js
|
|
|
|
|
|
read_ = (url) => {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('GET', url, false);
|
|
xhr.send(null);
|
|
return xhr.responseText;
|
|
}
|
|
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
readBinary = (url) => {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('GET', url, false);
|
|
xhr.responseType = 'arraybuffer';
|
|
xhr.send(null);
|
|
return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
|
|
};
|
|
}
|
|
|
|
readAsync = (url, onload, onerror) => {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('GET', url, true);
|
|
xhr.responseType = 'arraybuffer';
|
|
xhr.onload = () => {
|
|
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
|
|
onload(xhr.response);
|
|
return;
|
|
}
|
|
onerror();
|
|
};
|
|
xhr.onerror = onerror;
|
|
xhr.send(null);
|
|
}
|
|
|
|
// end include: web_or_worker_shell_read.js
|
|
}
|
|
|
|
setWindowTitle = (title) => document.title = title;
|
|
} else
|
|
{
|
|
throw new Error('environment detection error');
|
|
}
|
|
|
|
var out = Module['print'] || console.log.bind(console);
|
|
var err = Module['printErr'] || console.warn.bind(console);
|
|
|
|
// Merge back in the overrides
|
|
Object.assign(Module, moduleOverrides);
|
|
// Free the object hierarchy contained in the overrides, this lets the GC
|
|
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
|
|
moduleOverrides = null;
|
|
checkIncomingModuleAPI();
|
|
|
|
// Emit code to handle expected values on the Module object. This applies Module.x
|
|
// to the proper local x. This has two benefits: first, we only emit it if it is
|
|
// expected to arrive, and second, by using a local everywhere else that can be
|
|
// minified.
|
|
|
|
if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_');
|
|
|
|
if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram');
|
|
|
|
if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_');
|
|
|
|
// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
|
|
// Assertions on removed incoming Module JS APIs.
|
|
assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
|
|
assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
|
|
assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
|
|
assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
|
|
assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)');
|
|
assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
|
|
assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
|
|
assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)');
|
|
assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');
|
|
legacyModuleProp('read', 'read_');
|
|
legacyModuleProp('readAsync', 'readAsync');
|
|
legacyModuleProp('readBinary', 'readBinary');
|
|
legacyModuleProp('setWindowTitle', 'setWindowTitle');
|
|
var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
|
|
var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
|
|
var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
|
|
var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
|
|
|
|
assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable.");
|
|
|
|
|
|
|
|
|
|
var STACK_ALIGN = 16;
|
|
var POINTER_SIZE = 4;
|
|
|
|
function getNativeTypeSize(type) {
|
|
switch (type) {
|
|
case 'i1': case 'i8': case 'u8': return 1;
|
|
case 'i16': case 'u16': return 2;
|
|
case 'i32': case 'u32': return 4;
|
|
case 'i64': case 'u64': return 8;
|
|
case 'float': return 4;
|
|
case 'double': return 8;
|
|
default: {
|
|
if (type[type.length - 1] === '*') {
|
|
return POINTER_SIZE;
|
|
}
|
|
if (type[0] === 'i') {
|
|
const bits = Number(type.substr(1));
|
|
assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type);
|
|
return bits / 8;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// include: runtime_debug.js
|
|
|
|
|
|
function legacyModuleProp(prop, newName) {
|
|
if (!Object.getOwnPropertyDescriptor(Module, prop)) {
|
|
Object.defineProperty(Module, prop, {
|
|
configurable: true,
|
|
get: function() {
|
|
abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function ignoredModuleProp(prop) {
|
|
if (Object.getOwnPropertyDescriptor(Module, prop)) {
|
|
abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API');
|
|
}
|
|
}
|
|
|
|
// forcing the filesystem exports a few things by default
|
|
function isExportedByForceFilesystem(name) {
|
|
return name === 'FS_createPath' ||
|
|
name === 'FS_createDataFile' ||
|
|
name === 'FS_createPreloadedFile' ||
|
|
name === 'FS_unlink' ||
|
|
name === 'addRunDependency' ||
|
|
// The old FS has some functionality that WasmFS lacks.
|
|
name === 'FS_createLazyFile' ||
|
|
name === 'FS_createDevice' ||
|
|
name === 'removeRunDependency';
|
|
}
|
|
|
|
function missingLibrarySymbol(sym) {
|
|
if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) {
|
|
Object.defineProperty(globalThis, sym, {
|
|
configurable: true,
|
|
get: function() {
|
|
// Can't `abort()` here because it would break code that does runtime
|
|
// checks. e.g. `if (typeof SDL === 'undefined')`.
|
|
var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line';
|
|
// DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in
|
|
// library.js, which means $name for a JS name with no prefix, or name
|
|
// for a JS name like _name.
|
|
var librarySymbol = sym;
|
|
if (!librarySymbol.startsWith('_')) {
|
|
librarySymbol = '$' + sym;
|
|
}
|
|
msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE=" + librarySymbol + ")";
|
|
if (isExportedByForceFilesystem(sym)) {
|
|
msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
|
|
}
|
|
warnOnce(msg);
|
|
return undefined;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function unexportedRuntimeSymbol(sym) {
|
|
if (!Object.getOwnPropertyDescriptor(Module, sym)) {
|
|
Object.defineProperty(Module, sym, {
|
|
configurable: true,
|
|
get: function() {
|
|
var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)";
|
|
if (isExportedByForceFilesystem(sym)) {
|
|
msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you';
|
|
}
|
|
abort(msg);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// end include: runtime_debug.js
|
|
|
|
|
|
// === Preamble library stuff ===
|
|
|
|
// Documentation for the public APIs defined in this file must be updated in:
|
|
// site/source/docs/api_reference/preamble.js.rst
|
|
// A prebuilt local version of the documentation is available at:
|
|
// site/build/text/docs/api_reference/preamble.js.txt
|
|
// You can also build docs locally as HTML or other formats in site/
|
|
// An online HTML version (which may be of a different version of Emscripten)
|
|
// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html
|
|
|
|
var wasmBinary;
|
|
if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary');
|
|
var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime');
|
|
|
|
if (typeof WebAssembly != 'object') {
|
|
abort('no native wasm support detected');
|
|
}
|
|
|
|
// Wasm globals
|
|
|
|
var wasmMemory;
|
|
|
|
//========================================
|
|
// Runtime essentials
|
|
//========================================
|
|
|
|
// whether we are quitting the application. no code should run after this.
|
|
// set in exit() and abort()
|
|
var ABORT = false;
|
|
|
|
// set by exit() and abort(). Passed to 'onExit' handler.
|
|
// NOTE: This is also used as the process return code code in shell environments
|
|
// but only when noExitRuntime is false.
|
|
var EXITSTATUS;
|
|
|
|
/** @type {function(*, string=)} */
|
|
function assert(condition, text) {
|
|
if (!condition) {
|
|
abort('Assertion failed' + (text ? ': ' + text : ''));
|
|
}
|
|
}
|
|
|
|
// We used to include malloc/free by default in the past. Show a helpful error in
|
|
// builds with assertions.
|
|
|
|
// include: runtime_strings.js
|
|
|
|
|
|
// runtime_strings.js: String related runtime functions that are part of both
|
|
// MINIMAL_RUNTIME and regular runtime.
|
|
|
|
var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;
|
|
|
|
/**
|
|
* Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given
|
|
* array that contains uint8 values, returns a copy of that string as a
|
|
* Javascript String object.
|
|
* heapOrArray is either a regular array, or a JavaScript typed array view.
|
|
* @param {number} idx
|
|
* @param {number=} maxBytesToRead
|
|
* @return {string}
|
|
*/
|
|
function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {
|
|
var endIdx = idx + maxBytesToRead;
|
|
var endPtr = idx;
|
|
// TextDecoder needs to know the byte length in advance, it doesn't stop on
|
|
// null terminator by itself. Also, use the length info to avoid running tiny
|
|
// strings through TextDecoder, since .subarray() allocates garbage.
|
|
// (As a tiny code save trick, compare endPtr against endIdx using a negation,
|
|
// so that undefined means Infinity)
|
|
while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
|
|
|
|
if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
|
|
return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
|
|
}
|
|
var str = '';
|
|
// If building with TextDecoder, we have already computed the string length
|
|
// above, so test loop end condition against that
|
|
while (idx < endPtr) {
|
|
// For UTF8 byte structure, see:
|
|
// http://en.wikipedia.org/wiki/UTF-8#Description
|
|
// https://www.ietf.org/rfc/rfc2279.txt
|
|
// https://tools.ietf.org/html/rfc3629
|
|
var u0 = heapOrArray[idx++];
|
|
if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
|
|
var u1 = heapOrArray[idx++] & 63;
|
|
if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
|
|
var u2 = heapOrArray[idx++] & 63;
|
|
if ((u0 & 0xF0) == 0xE0) {
|
|
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
|
|
} else {
|
|
if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
|
|
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);
|
|
}
|
|
|
|
if (u0 < 0x10000) {
|
|
str += String.fromCharCode(u0);
|
|
} else {
|
|
var ch = u0 - 0x10000;
|
|
str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
|
|
}
|
|
}
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the
|
|
* emscripten HEAP, returns a copy of that string as a Javascript String object.
|
|
*
|
|
* @param {number} ptr
|
|
* @param {number=} maxBytesToRead - An optional length that specifies the
|
|
* maximum number of bytes to read. You can omit this parameter to scan the
|
|
* string until the first \0 byte. If maxBytesToRead is passed, and the string
|
|
* at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the
|
|
* string will cut short at that byte index (i.e. maxBytesToRead will not
|
|
* produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing
|
|
* frequent uses of UTF8ToString() with and without maxBytesToRead may throw
|
|
* JS JIT optimizations off, so it is worth to consider consistently using one
|
|
* @return {string}
|
|
*/
|
|
function UTF8ToString(ptr, maxBytesToRead) {
|
|
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
|
|
}
|
|
|
|
/**
|
|
* Copies the given Javascript String object 'str' to the given byte array at
|
|
* address 'outIdx', encoded in UTF8 form and null-terminated. The copy will
|
|
* require at most str.length*4+1 bytes of space in the HEAP. Use the function
|
|
* lengthBytesUTF8 to compute the exact number of bytes (excluding null
|
|
* terminator) that this function will write.
|
|
*
|
|
* @param {string} str - The Javascript string to copy.
|
|
* @param {ArrayBufferView|Array<number>} heap - The array to copy to. Each
|
|
* index in this array is assumed
|
|
* to be one 8-byte element.
|
|
* @param {number} outIdx - The starting offset in the array to begin the copying.
|
|
* @param {number} maxBytesToWrite - The maximum number of bytes this function
|
|
* can write to the array. This count should
|
|
* include the null terminator, i.e. if
|
|
* maxBytesToWrite=1, only the null terminator
|
|
* will be written and nothing else.
|
|
* maxBytesToWrite=0 does not write any bytes
|
|
* to the output, not even the null
|
|
* terminator.
|
|
* @return {number} The number of bytes written, EXCLUDING the null terminator.
|
|
*/
|
|
function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
|
|
// Parameter maxBytesToWrite is not optional. Negative values, 0, null,
|
|
// undefined and false each don't write out any bytes.
|
|
if (!(maxBytesToWrite > 0))
|
|
return 0;
|
|
|
|
var startIdx = outIdx;
|
|
var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
|
|
for (var i = 0; i < str.length; ++i) {
|
|
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
|
|
// unit, not a Unicode code point of the character! So decode
|
|
// UTF16->UTF32->UTF8.
|
|
// See http://unicode.org/faq/utf_bom.html#utf16-3
|
|
// For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description
|
|
// and https://www.ietf.org/rfc/rfc2279.txt
|
|
// and https://tools.ietf.org/html/rfc3629
|
|
var u = str.charCodeAt(i); // possibly a lead surrogate
|
|
if (u >= 0xD800 && u <= 0xDFFF) {
|
|
var u1 = str.charCodeAt(++i);
|
|
u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
|
|
}
|
|
if (u <= 0x7F) {
|
|
if (outIdx >= endIdx) break;
|
|
heap[outIdx++] = u;
|
|
} else if (u <= 0x7FF) {
|
|
if (outIdx + 1 >= endIdx) break;
|
|
heap[outIdx++] = 0xC0 | (u >> 6);
|
|
heap[outIdx++] = 0x80 | (u & 63);
|
|
} else if (u <= 0xFFFF) {
|
|
if (outIdx + 2 >= endIdx) break;
|
|
heap[outIdx++] = 0xE0 | (u >> 12);
|
|
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
|
|
heap[outIdx++] = 0x80 | (u & 63);
|
|
} else {
|
|
if (outIdx + 3 >= endIdx) break;
|
|
if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).');
|
|
heap[outIdx++] = 0xF0 | (u >> 18);
|
|
heap[outIdx++] = 0x80 | ((u >> 12) & 63);
|
|
heap[outIdx++] = 0x80 | ((u >> 6) & 63);
|
|
heap[outIdx++] = 0x80 | (u & 63);
|
|
}
|
|
}
|
|
// Null-terminate the pointer to the buffer.
|
|
heap[outIdx] = 0;
|
|
return outIdx - startIdx;
|
|
}
|
|
|
|
/**
|
|
* Copies the given Javascript String object 'str' to the emscripten HEAP at
|
|
* address 'outPtr', null-terminated and encoded in UTF8 form. The copy will
|
|
* require at most str.length*4+1 bytes of space in the HEAP.
|
|
* Use the function lengthBytesUTF8 to compute the exact number of bytes
|
|
* (excluding null terminator) that this function will write.
|
|
*
|
|
* @return {number} The number of bytes written, EXCLUDING the null terminator.
|
|
*/
|
|
function stringToUTF8(str, outPtr, maxBytesToWrite) {
|
|
assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
|
|
return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of bytes the given Javascript string takes if encoded as a
|
|
* UTF8 byte array, EXCLUDING the null terminator byte.
|
|
*
|
|
* @param {string} str - JavaScript string to operator on
|
|
* @return {number} Length, in bytes, of the UTF8 encoded string.
|
|
*/
|
|
function lengthBytesUTF8(str) {
|
|
var len = 0;
|
|
for (var i = 0; i < str.length; ++i) {
|
|
// Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code
|
|
// unit, not a Unicode code point of the character! So decode
|
|
// UTF16->UTF32->UTF8.
|
|
// See http://unicode.org/faq/utf_bom.html#utf16-3
|
|
var c = str.charCodeAt(i); // possibly a lead surrogate
|
|
if (c <= 0x7F) {
|
|
len++;
|
|
} else if (c <= 0x7FF) {
|
|
len += 2;
|
|
} else if (c >= 0xD800 && c <= 0xDFFF) {
|
|
len += 4; ++i;
|
|
} else {
|
|
len += 3;
|
|
}
|
|
}
|
|
return len;
|
|
}
|
|
|
|
// end include: runtime_strings.js
|
|
// Memory management
|
|
|
|
var HEAP,
|
|
/** @type {!ArrayBuffer} */
|
|
buffer,
|
|
/** @type {!Int8Array} */
|
|
HEAP8,
|
|
/** @type {!Uint8Array} */
|
|
HEAPU8,
|
|
/** @type {!Int16Array} */
|
|
HEAP16,
|
|
/** @type {!Uint16Array} */
|
|
HEAPU16,
|
|
/** @type {!Int32Array} */
|
|
HEAP32,
|
|
/** @type {!Uint32Array} */
|
|
HEAPU32,
|
|
/** @type {!Float32Array} */
|
|
HEAPF32,
|
|
/** @type {!Float64Array} */
|
|
HEAPF64;
|
|
|
|
function updateGlobalBufferAndViews(buf) {
|
|
buffer = buf;
|
|
Module['HEAP8'] = HEAP8 = new Int8Array(buf);
|
|
Module['HEAP16'] = HEAP16 = new Int16Array(buf);
|
|
Module['HEAP32'] = HEAP32 = new Int32Array(buf);
|
|
Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
|
|
Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
|
|
Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
|
|
Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
|
|
Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
|
|
}
|
|
|
|
var STACK_SIZE = 5242880;
|
|
if (Module['STACK_SIZE']) assert(STACK_SIZE === Module['STACK_SIZE'], 'the stack size can no longer be determined at runtime')
|
|
|
|
var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY');
|
|
|
|
assert(INITIAL_MEMORY >= STACK_SIZE, 'INITIAL_MEMORY should be larger than STACK_SIZE, was ' + INITIAL_MEMORY + '! (STACK_SIZE=' + STACK_SIZE + ')');
|
|
|
|
// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
|
|
assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined,
|
|
'JS engine does not provide full typed array support');
|
|
|
|
// If memory is defined in wasm, the user can't provide it.
|
|
assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally');
|
|
assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically');
|
|
|
|
// include: runtime_init_table.js
|
|
// In regular non-RELOCATABLE mode the table is exported
|
|
// from the wasm module and this will be assigned once
|
|
// the exports are available.
|
|
var wasmTable;
|
|
|
|
// end include: runtime_init_table.js
|
|
// include: runtime_stack_check.js
|
|
|
|
|
|
// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
|
|
function writeStackCookie() {
|
|
var max = _emscripten_stack_get_end();
|
|
assert((max & 3) == 0);
|
|
// If the stack ends at address zero we write our cookies 4 bytes into the
|
|
// stack. This prevents interference with the (separate) address-zero check
|
|
// below.
|
|
if (max == 0) {
|
|
max += 4;
|
|
}
|
|
// The stack grow downwards towards _emscripten_stack_get_end.
|
|
// We write cookies to the final two words in the stack and detect if they are
|
|
// ever overwritten.
|
|
HEAPU32[((max)>>2)] = 0x2135467;
|
|
HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE;
|
|
// Also test the global address 0 for integrity.
|
|
HEAPU32[0] = 0x63736d65; /* 'emsc' */
|
|
}
|
|
|
|
function checkStackCookie() {
|
|
if (ABORT) return;
|
|
var max = _emscripten_stack_get_end();
|
|
// See writeStackCookie().
|
|
if (max == 0) {
|
|
max += 4;
|
|
}
|
|
var cookie1 = HEAPU32[((max)>>2)];
|
|
var cookie2 = HEAPU32[(((max)+(4))>>2)];
|
|
if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) {
|
|
abort('Stack overflow! Stack cookie has been overwritten at ' + ptrToString(max) + ', expected hex dwords 0x89BACDFE and 0x2135467, but received ' + ptrToString(cookie2) + ' ' + ptrToString(cookie1));
|
|
}
|
|
// Also test the global address 0 for integrity.
|
|
if (HEAPU32[0] !== 0x63736d65 /* 'emsc' */) {
|
|
abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
|
|
}
|
|
}
|
|
|
|
// end include: runtime_stack_check.js
|
|
// include: runtime_assertions.js
|
|
|
|
|
|
// Endianness check
|
|
(function() {
|
|
var h16 = new Int16Array(1);
|
|
var h8 = new Int8Array(h16.buffer);
|
|
h16[0] = 0x6373;
|
|
if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)';
|
|
})();
|
|
|
|
// end include: runtime_assertions.js
|
|
var __ATPRERUN__ = []; // functions called before the runtime is initialized
|
|
var __ATINIT__ = []; // functions called during startup
|
|
var __ATEXIT__ = []; // functions called during shutdown
|
|
var __ATPOSTRUN__ = []; // functions called after the main() is called
|
|
|
|
var runtimeInitialized = false;
|
|
|
|
function keepRuntimeAlive() {
|
|
return noExitRuntime;
|
|
}
|
|
|
|
function preRun() {
|
|
|
|
if (Module['preRun']) {
|
|
if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
|
|
while (Module['preRun'].length) {
|
|
addOnPreRun(Module['preRun'].shift());
|
|
}
|
|
}
|
|
|
|
callRuntimeCallbacks(__ATPRERUN__);
|
|
}
|
|
|
|
function initRuntime() {
|
|
assert(!runtimeInitialized);
|
|
runtimeInitialized = true;
|
|
|
|
checkStackCookie();
|
|
|
|
|
|
callRuntimeCallbacks(__ATINIT__);
|
|
}
|
|
|
|
function postRun() {
|
|
checkStackCookie();
|
|
|
|
if (Module['postRun']) {
|
|
if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
|
|
while (Module['postRun'].length) {
|
|
addOnPostRun(Module['postRun'].shift());
|
|
}
|
|
}
|
|
|
|
callRuntimeCallbacks(__ATPOSTRUN__);
|
|
}
|
|
|
|
function addOnPreRun(cb) {
|
|
__ATPRERUN__.unshift(cb);
|
|
}
|
|
|
|
function addOnInit(cb) {
|
|
__ATINIT__.unshift(cb);
|
|
}
|
|
|
|
function addOnExit(cb) {
|
|
}
|
|
|
|
function addOnPostRun(cb) {
|
|
__ATPOSTRUN__.unshift(cb);
|
|
}
|
|
|
|
// include: runtime_math.js
|
|
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
|
|
|
|
assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
|
|
assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
|
|
assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
|
|
assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
|
|
|
|
// end include: runtime_math.js
|
|
// A counter of dependencies for calling run(). If we need to
|
|
// do asynchronous work before running, increment this and
|
|
// decrement it. Incrementing must happen in a place like
|
|
// Module.preRun (used by emcc to add file preloading).
|
|
// Note that you can add dependencies in preRun, even though
|
|
// it happens right before run - run will be postponed until
|
|
// the dependencies are met.
|
|
var runDependencies = 0;
|
|
var runDependencyWatcher = null;
|
|
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
|
|
var runDependencyTracking = {};
|
|
|
|
function getUniqueRunDependency(id) {
|
|
var orig = id;
|
|
while (1) {
|
|
if (!runDependencyTracking[id]) return id;
|
|
id = orig + Math.random();
|
|
}
|
|
}
|
|
|
|
function addRunDependency(id) {
|
|
runDependencies++;
|
|
|
|
if (Module['monitorRunDependencies']) {
|
|
Module['monitorRunDependencies'](runDependencies);
|
|
}
|
|
|
|
if (id) {
|
|
assert(!runDependencyTracking[id]);
|
|
runDependencyTracking[id] = 1;
|
|
if (runDependencyWatcher === null && typeof setInterval != 'undefined') {
|
|
// Check for missing dependencies every few seconds
|
|
runDependencyWatcher = setInterval(function() {
|
|
if (ABORT) {
|
|
clearInterval(runDependencyWatcher);
|
|
runDependencyWatcher = null;
|
|
return;
|
|
}
|
|
var shown = false;
|
|
for (var dep in runDependencyTracking) {
|
|
if (!shown) {
|
|
shown = true;
|
|
err('still waiting on run dependencies:');
|
|
}
|
|
err('dependency: ' + dep);
|
|
}
|
|
if (shown) {
|
|
err('(end of list)');
|
|
}
|
|
}, 10000);
|
|
}
|
|
} else {
|
|
err('warning: run dependency added without ID');
|
|
}
|
|
}
|
|
|
|
function removeRunDependency(id) {
|
|
runDependencies--;
|
|
|
|
if (Module['monitorRunDependencies']) {
|
|
Module['monitorRunDependencies'](runDependencies);
|
|
}
|
|
|
|
if (id) {
|
|
assert(runDependencyTracking[id]);
|
|
delete runDependencyTracking[id];
|
|
} else {
|
|
err('warning: run dependency removed without ID');
|
|
}
|
|
if (runDependencies == 0) {
|
|
if (runDependencyWatcher !== null) {
|
|
clearInterval(runDependencyWatcher);
|
|
runDependencyWatcher = null;
|
|
}
|
|
if (dependenciesFulfilled) {
|
|
var callback = dependenciesFulfilled;
|
|
dependenciesFulfilled = null;
|
|
callback(); // can add another dependenciesFulfilled
|
|
}
|
|
}
|
|
}
|
|
|
|
/** @param {string|number=} what */
|
|
function abort(what) {
|
|
if (Module['onAbort']) {
|
|
Module['onAbort'](what);
|
|
}
|
|
|
|
what = 'Aborted(' + what + ')';
|
|
// TODO(sbc): Should we remove printing and leave it up to whoever
|
|
// catches the exception?
|
|
err(what);
|
|
|
|
ABORT = true;
|
|
EXITSTATUS = 1;
|
|
|
|
// Use a wasm runtime error, because a JS error might be seen as a foreign
|
|
// exception, which means we'd run destructors on it. We need the error to
|
|
// simply make the program stop.
|
|
// FIXME This approach does not work in Wasm EH because it currently does not assume
|
|
// all RuntimeErrors are from traps; it decides whether a RuntimeError is from
|
|
// a trap or not based on a hidden field within the object. So at the moment
|
|
// we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that
|
|
// allows this in the wasm spec.
|
|
|
|
// Suppress closure compiler warning here. Closure compiler's builtin extern
|
|
// defintion for WebAssembly.RuntimeError claims it takes no arguments even
|
|
// though it can.
|
|
// TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed.
|
|
/** @suppress {checkTypes} */
|
|
var e = new WebAssembly.RuntimeError(what);
|
|
|
|
readyPromiseReject(e);
|
|
// Throw the error whether or not MODULARIZE is set because abort is used
|
|
// in code paths apart from instantiation where an exception is expected
|
|
// to be thrown when abort is called.
|
|
throw e;
|
|
}
|
|
|
|
// {{MEM_INITIALIZER}}
|
|
|
|
// include: memoryprofiler.js
|
|
|
|
|
|
// end include: memoryprofiler.js
|
|
// show errors on likely calls to FS when it was not included
|
|
var FS = {
|
|
error: function() {
|
|
abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM');
|
|
},
|
|
init: function() { FS.error() },
|
|
createDataFile: function() { FS.error() },
|
|
createPreloadedFile: function() { FS.error() },
|
|
createLazyFile: function() { FS.error() },
|
|
open: function() { FS.error() },
|
|
mkdev: function() { FS.error() },
|
|
registerDevice: function() { FS.error() },
|
|
analyzePath: function() { FS.error() },
|
|
loadFilesFromDB: function() { FS.error() },
|
|
|
|
ErrnoError: function ErrnoError() { FS.error() },
|
|
};
|
|
Module['FS_createDataFile'] = FS.createDataFile;
|
|
Module['FS_createPreloadedFile'] = FS.createPreloadedFile;
|
|
|
|
// include: URIUtils.js
|
|
|
|
|
|
// Prefix of data URIs emitted by SINGLE_FILE and related options.
|
|
var dataURIPrefix = 'data:application/octet-stream;base64,';
|
|
|
|
// Indicates whether filename is a base64 data URI.
|
|
function isDataURI(filename) {
|
|
// Prefix of data URIs emitted by SINGLE_FILE and related options.
|
|
return filename.startsWith(dataURIPrefix);
|
|
}
|
|
|
|
// Indicates whether filename is delivered via file protocol (as opposed to http/https)
|
|
function isFileURI(filename) {
|
|
return filename.startsWith('file://');
|
|
}
|
|
|
|
// end include: URIUtils.js
|
|
/** @param {boolean=} fixedasm */
|
|
function createExportWrapper(name, fixedasm) {
|
|
return function() {
|
|
var displayName = name;
|
|
var asm = fixedasm;
|
|
if (!fixedasm) {
|
|
asm = Module['asm'];
|
|
}
|
|
assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization');
|
|
if (!asm[name]) {
|
|
assert(asm[name], 'exported native function `' + displayName + '` not found');
|
|
}
|
|
return asm[name].apply(null, arguments);
|
|
};
|
|
}
|
|
|
|
var wasmBinaryFile;
|
|
wasmBinaryFile = 'crc64.wasm';
|
|
if (!isDataURI(wasmBinaryFile)) {
|
|
wasmBinaryFile = locateFile(wasmBinaryFile);
|
|
}
|
|
|
|
var binaryInString = ["AGFzbQEAAAABzYCAgAAMYAF/AX9gAAF/YAF/AGAAAGADf35/AX5gA39/fwBgBH9/f38AYAN/f38Bf2AFf39",
|
|
"/f38Bf2AEf39/fwF/YAR/f35/AX5gBH9+f38BfwKPgYCAAAUDZW52BWFib3J0AAMDZW52FmVtc2NyaXB0ZW",
|
|
"5fcmVzaXplX2hlYXAAABZ3YXNpX3NuYXBzaG90X3ByZXZpZXcxCGZkX2Nsb3NlAAAWd2FzaV9zbmFwc2hvd",
|
|
"F9wcmV2aWV3MQhmZF93cml0ZQAJFndhc2lfc25hcHNob3RfcHJldmlldzEHZmRfc2VlawAIA62AgIAALAMF",
|
|
"BgIBAAUGAgEBAAACAAIAAAAHBAQCAgEDAAIAAQIBAQIAAQMBAQEACggLBIWAgIAAAXABBAQFh4CAgAABAYA",
|
|
"CgIACBsiAgIAACn8BQYCAwAILfwFBAAt/AUEAC38BQQALfwBBnJHBAgt/AEGwkcECC38AQZyRwQILfwBBsJ",
|
|
"HBAgt/AEGwkcECC38AQZKSwQILB/qEgIAAGwZtZW1vcnkCABFfX3dhc21fY2FsbF9jdG9ycwAFJWVtc2Nya",
|
|
"XB0ZW5fYmluZF9Wb2lkUHRyX19fZGVzdHJveV9fXzAACCVlbXNjcmlwdGVuX2JpbmRfQ3JjNjRIYXNoX0Ny",
|
|
"YzY0SGFzaF8wAAkkZW1zY3JpcHRlbl9iaW5kX0NyYzY0SGFzaF9PbkFwcGVuZF8yAAsjZW1zY3JpcHRlbl9",
|
|
"iaW5kX0NyYzY0SGFzaF9PbkZpbmFsXzMADCdlbXNjcmlwdGVuX2JpbmRfQ3JjNjRIYXNoX19fZGVzdHJveV",
|
|
"9fXzAADRtfX2VtX2xpYl9kZXBzX3dlYmlkbF9iaW5kZXIDBCFfX2VtX2pzX19hcnJheV9ib3VuZHNfY2hlY",
|
|
"2tfZXJyb3IDBRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQAQX19lcnJub19sb2NhdGlvbgAPBmZmbHVz",
|
|
"aAAtBm1hbGxvYwARBGZyZWUAEhVlbXNjcmlwdGVuX3N0YWNrX2luaXQAKRllbXNjcmlwdGVuX3N0YWNrX2d",
|
|
"ldF9mcmVlACoZZW1zY3JpcHRlbl9zdGFja19nZXRfYmFzZQArGGVtc2NyaXB0ZW5fc3RhY2tfZ2V0X2VuZA",
|
|
"AsCXN0YWNrU2F2ZQAlDHN0YWNrUmVzdG9yZQAmCnN0YWNrQWxsb2MAJxxlbXNjcmlwdGVuX3N0YWNrX2dld",
|
|
"F9jdXJyZW50ACgTX19zdGFydF9lbV9saWJfZGVwcwMGEl9fc3RvcF9lbV9saWJfZGVwcwMHDV9fc3RhcnRf",
|
|
"ZW1fanMDCAxfX3N0b3BfZW1fanMDCQxkeW5DYWxsX2ppamkALwmJgICAAAEAQQELAxYYGgqtkYGAACwEABA",
|
|
"pC81IAvcCf6EFfiMAIQNBgAEhBCADIARrIQUgBSAANgJ8IAUgATYCeCAFIAI2AnQgBSgCfCEGIAUoAnghBy",
|
|
"AFIAc2AnAgBSgCdCEIIAghCSAJrCH6AiAGKQMIIfsCIPsCIPoCfCH8AiAGIPwCNwMIIAYpAwAh/QJCfyH+A",
|
|
"iD9AiD+AoUh/wIgBSD/AjcDaEIAIYADIAUggAM3A2AgBSgCdCEKIAUoAnQhC0EgIQwgCyAMbyENIAogDWsh",
|
|
"DiAFIA42AlwgBSgCXCEPQcAAIRAgDyERIBAhEiARIBJPIRNBASEUIBMgFHEhFQJAIBVFDQAgBSgCcCEWIAU",
|
|
"gFjYCWEIAIYEDIAUggQM3A1BCACGCAyAFIIIDNwNIQgAhgwMgBSCDAzcDQEIAIYQDIAUghAM3AzggBSkDYC",
|
|
"GFAyAFKAJcIRcgFyEYIBitIYYDIIUDIIYDfCGHA0IgIYgDIIcDIIgDfSGJAyAFIIkDNwMwIAUoAlwhGSAFK",
|
|
"AJ0IRogGiAZayEbIAUgGzYCdCAFKQNoIYoDIAUgigM3A1ACQANAIAUpA2AhiwMgBSkDMCGMAyCLAyGNAyCM",
|
|
"AyGOAyCNAyCOA1QhHEEBIR0gHCAdcSEeIB5FDQEgBSgCWCEfIB8pAwAhjwMgBSkDUCGQAyCPAyCQA4UhkQM",
|
|
"gBSCRAzcDKCAFKAJYISAgICkDCCGSAyAFKQNIIZMDIJIDIJMDhSGUAyAFIJQDNwMgIAUoAlghISAhKQMQIZ",
|
|
"UDIAUpA0AhlgMglQMglgOFIZcDIAUglwM3AxggBSgCWCEiICIpAxghmAMgBSkDOCGZAyCYAyCZA4UhmgMgB",
|
|
"SCaAzcDECAFKQMoIZsDQv8BIZwDIJsDIJwDgyGdA0KADiGeAyCdAyCeA3whnwMgnwOnISNBgIDAAiEkQQMh",
|
|
"JSAjICV0ISYgJCAmaiEnICcpAwAhoAMgBSCgAzcDUCAFKQMoIaEDQgghogMgoQMgogOIIaMDIAUgowM3Ayg",
|
|
"gBSkDICGkA0L/ASGlAyCkAyClA4MhpgNCgA4hpwMgpgMgpwN8IagDIKgDpyEoQYCAwAIhKUEDISogKCAqdC",
|
|
"ErICkgK2ohLCAsKQMAIakDIAUgqQM3A0ggBSkDICGqA0IIIasDIKoDIKsDiCGsAyAFIKwDNwMgIAUpAxghr",
|
|
"QNC/wEhrgMgrQMgrgODIa8DQoAOIbADIK8DILADfCGxAyCxA6chLUGAgMACIS5BAyEvIC0gL3QhMCAuIDBq",
|
|
"ITEgMSkDACGyAyAFILIDNwNAIAUpAxghswNCCCG0AyCzAyC0A4ghtQMgBSC1AzcDGCAFKQMQIbYDQv8BIbc",
|
|
"DILYDILcDgyG4A0KADiG5AyC4AyC5A3whugMgugOnITJBgIDAAiEzQQMhNCAyIDR0ITUgMyA1aiE2IDYpAw",
|
|
"AhuwMgBSC7AzcDOCAFKQMQIbwDQgghvQMgvAMgvQOIIb4DIAUgvgM3AxAgBSkDKCG/A0L/ASHAAyC/AyDAA",
|
|
"4MhwQNCgAwhwgMgwQMgwgN8IcMDIMMDpyE3QYCAwAIhOEEDITkgNyA5dCE6IDggOmohOyA7KQMAIcQDIAUp",
|
|
"A1AhxQMgxQMgxAOFIcYDIAUgxgM3A1AgBSkDKCHHA0IIIcgDIMcDIMgDiCHJAyAFIMkDNwMoIAUpAyAhygN",
|
|
"C/wEhywMgygMgywODIcwDQoAMIc0DIMwDIM0DfCHOAyDOA6chPEGAgMACIT1BAyE+IDwgPnQhPyA9ID9qIU",
|
|
"AgQCkDACHPAyAFKQNIIdADINADIM8DhSHRAyAFINEDNwNIIAUpAyAh0gNCCCHTAyDSAyDTA4gh1AMgBSDUA",
|
|
"zcDICAFKQMYIdUDQv8BIdYDINUDINYDgyHXA0KADCHYAyDXAyDYA3wh2QMg2QOnIUFBgIDAAiFCQQMhQyBB",
|
|
"IEN0IUQgQiBEaiFFIEUpAwAh2gMgBSkDQCHbAyDbAyDaA4Uh3AMgBSDcAzcDQCAFKQMYId0DQggh3gMg3QM",
|
|
"g3gOIId8DIAUg3wM3AxggBSkDECHgA0L/ASHhAyDgAyDhA4Mh4gNCgAwh4wMg4gMg4wN8IeQDIOQDpyFGQY",
|
|
"CAwAIhR0EDIUggRiBIdCFJIEcgSWohSiBKKQMAIeUDIAUpAzgh5gMg5gMg5QOFIecDIAUg5wM3AzggBSkDE",
|
|
"CHoA0IIIekDIOgDIOkDiCHqAyAFIOoDNwMQIAUpAygh6wNC/wEh7AMg6wMg7AODIe0DQoAKIe4DIO0DIO4D",
|
|
"fCHvAyDvA6chS0GAgMACIUxBAyFNIEsgTXQhTiBMIE5qIU8gTykDACHwAyAFKQNQIfEDIPEDIPADhSHyAyA",
|
|
"FIPIDNwNQIAUpAygh8wNCCCH0AyDzAyD0A4gh9QMgBSD1AzcDKCAFKQMgIfYDQv8BIfcDIPYDIPcDgyH4A0",
|
|
"KACiH5AyD4AyD5A3wh+gMg+gOnIVBBgIDAAiFRQQMhUiBQIFJ0IVMgUSBTaiFUIFQpAwAh+wMgBSkDSCH8A",
|
|
"yD8AyD7A4Uh/QMgBSD9AzcDSCAFKQMgIf4DQggh/wMg/gMg/wOIIYAEIAUggAQ3AyAgBSkDGCGBBEL/ASGC",
|
|
"BCCBBCCCBIMhgwRCgAohhAQggwQghAR8IYUEIIUEpyFVQYCAwAIhVkEDIVcgVSBXdCFYIFYgWGohWSBZKQM",
|
|
"AIYYEIAUpA0AhhwQghwQghgSFIYgEIAUgiAQ3A0AgBSkDGCGJBEIIIYoEIIkEIIoEiCGLBCAFIIsENwMYIA",
|
|
"UpAxAhjARC/wEhjQQgjAQgjQSDIY4EQoAKIY8EII4EII8EfCGQBCCQBKchWkGAgMACIVtBAyFcIFogXHQhX",
|
|
"SBbIF1qIV4gXikDACGRBCAFKQM4IZIEIJIEIJEEhSGTBCAFIJMENwM4IAUpAxAhlARCCCGVBCCUBCCVBIgh",
|
|
"lgQgBSCWBDcDECAFKQMoIZcEQv8BIZgEIJcEIJgEgyGZBEKACCGaBCCZBCCaBHwhmwQgmwSnIV9BgIDAAiF",
|
|
"gQQMhYSBfIGF0IWIgYCBiaiFjIGMpAwAhnAQgBSkDUCGdBCCdBCCcBIUhngQgBSCeBDcDUCAFKQMoIZ8EQg",
|
|
"ghoAQgnwQgoASIIaEEIAUgoQQ3AyggBSkDICGiBEL/ASGjBCCiBCCjBIMhpARCgAghpQQgpAQgpQR8IaYEI",
|
|
"KYEpyFkQYCAwAIhZUEDIWYgZCBmdCFnIGUgZ2ohaCBoKQMAIacEIAUpA0ghqAQgqAQgpwSFIakEIAUgqQQ3",
|
|
"A0ggBSkDICGqBEIIIasEIKoEIKsEiCGsBCAFIKwENwMgIAUpAxghrQRC/wEhrgQgrQQgrgSDIa8EQoAIIbA",
|
|
"EIK8EILAEfCGxBCCxBKchaUGAgMACIWpBAyFrIGkga3QhbCBqIGxqIW0gbSkDACGyBCAFKQNAIbMEILMEIL",
|
|
"IEhSG0BCAFILQENwNAIAUpAxghtQRCCCG2BCC1BCC2BIghtwQgBSC3BDcDGCAFKQMQIbgEQv8BIbkEILgEI",
|
|
"LkEgyG6BEKACCG7BCC6BCC7BHwhvAQgvASnIW5BgIDAAiFvQQMhcCBuIHB0IXEgbyBxaiFyIHIpAwAhvQQg",
|
|
"BSkDOCG+BCC+BCC9BIUhvwQgBSC/BDcDOCAFKQMQIcAEQgghwQQgwAQgwQSIIcIEIAUgwgQ3AxAgBSkDKCH",
|
|
"DBEL/ASHEBCDDBCDEBIMhxQRCgAYhxgQgxQQgxgR8IccEIMcEpyFzQYCAwAIhdEEDIXUgcyB1dCF2IHQgdm",
|
|
"ohdyB3KQMAIcgEIAUpA1AhyQQgyQQgyASFIcoEIAUgygQ3A1AgBSkDKCHLBEIIIcwEIMsEIMwEiCHNBCAFI",
|
|
"M0ENwMoIAUpAyAhzgRC/wEhzwQgzgQgzwSDIdAEQoAGIdEEINAEINEEfCHSBCDSBKcheEGAgMACIXlBAyF6",
|
|
"IHggenQheyB5IHtqIXwgfCkDACHTBCAFKQNIIdQEINQEINMEhSHVBCAFINUENwNIIAUpAyAh1gRCCCHXBCD",
|
|
"WBCDXBIgh2AQgBSDYBDcDICAFKQMYIdkEQv8BIdoEINkEINoEgyHbBEKABiHcBCDbBCDcBHwh3QQg3QSnIX",
|
|
"1BgIDAAiF+QQMhfyB9IH90IYABIH4ggAFqIYEBIIEBKQMAId4EIAUpA0Ah3wQg3wQg3gSFIeAEIAUg4AQ3A",
|
|
"0AgBSkDGCHhBEIIIeIEIOEEIOIEiCHjBCAFIOMENwMYIAUpAxAh5ARC/wEh5QQg5AQg5QSDIeYEQoAGIecE",
|
|
"IOYEIOcEfCHoBCDoBKchggFBgIDAAiGDAUEDIYQBIIIBIIQBdCGFASCDASCFAWohhgEghgEpAwAh6QQgBSk",
|
|
"DOCHqBCDqBCDpBIUh6wQgBSDrBDcDOCAFKQMQIewEQggh7QQg7AQg7QSIIe4EIAUg7gQ3AxAgBSkDKCHvBE",
|
|
"L/ASHwBCDvBCDwBIMh8QRCgAQh8gQg8QQg8gR8IfMEIPMEpyGHAUGAgMACIYgBQQMhiQEghwEgiQF0IYoBI",
|
|
"IgBIIoBaiGLASCLASkDACH0BCAFKQNQIfUEIPUEIPQEhSH2BCAFIPYENwNQIAUpAygh9wRCCCH4BCD3BCD4",
|
|
"BIgh+QQgBSD5BDcDKCAFKQMgIfoEQv8BIfsEIPoEIPsEgyH8BEKABCH9BCD8BCD9BHwh/gQg/gSnIYwBQYC",
|
|
"AwAIhjQFBAyGOASCMASCOAXQhjwEgjQEgjwFqIZABIJABKQMAIf8EIAUpA0ghgAUggAUg/wSFIYEFIAUggQ",
|
|
"U3A0ggBSkDICGCBUIIIYMFIIIFIIMFiCGEBSAFIIQFNwMgIAUpAxghhQVC/wEhhgUghQUghgWDIYcFQoAEI",
|
|
"YgFIIcFIIgFfCGJBSCJBachkQFBgIDAAiGSAUEDIZMBIJEBIJMBdCGUASCSASCUAWohlQEglQEpAwAhigUg",
|
|
"BSkDQCGLBSCLBSCKBYUhjAUgBSCMBTcDQCAFKQMYIY0FQgghjgUgjQUgjgWIIY8FIAUgjwU3AxggBSkDECG",
|
|
"QBUL/ASGRBSCQBSCRBYMhkgVCgAQhkwUgkgUgkwV8IZQFIJQFpyGWAUGAgMACIZcBQQMhmAEglgEgmAF0IZ",
|
|
"kBIJcBIJkBaiGaASCaASkDACGVBSAFKQM4IZYFIJYFIJUFhSGXBSAFIJcFNwM4IAUpAxAhmAVCCCGZBSCYB",
|
|
"SCZBYghmgUgBSCaBTcDECAFKQMoIZsFQv8BIZwFIJsFIJwFgyGdBUKAAiGeBSCdBSCeBXwhnwUgnwWnIZsB",
|
|
"QYCAwAIhnAFBAyGdASCbASCdAXQhngEgnAEgngFqIZ8BIJ8BKQMAIaAFIAUpA1AhoQUgoQUgoAWFIaIFIAU",
|
|
"gogU3A1AgBSkDKCGjBUIIIaQFIKMFIKQFiCGlBSAFIKUFNwMoIAUpAyAhpgVC/wEhpwUgpgUgpwWDIagFQo",
|
|
"ACIakFIKgFIKkFfCGqBSCqBachoAFBgIDAAiGhAUEDIaIBIKABIKIBdCGjASChASCjAWohpAEgpAEpAwAhq",
|
|
"wUgBSkDSCGsBSCsBSCrBYUhrQUgBSCtBTcDSCAFKQMgIa4FQgghrwUgrgUgrwWIIbAFIAUgsAU3AyAgBSkD",
|
|
"GCGxBUL/ASGyBSCxBSCyBYMhswVCgAIhtAUgswUgtAV8IbUFILUFpyGlAUGAgMACIaYBQQMhpwEgpQEgpwF",
|
|
"0IagBIKYBIKgBaiGpASCpASkDACG2BSAFKQNAIbcFILcFILYFhSG4BSAFILgFNwNAIAUpAxghuQVCCCG6BS",
|
|
"C5BSC6BYghuwUgBSC7BTcDGCAFKQMQIbwFQv8BIb0FILwFIL0FgyG+BUKAAiG/BSC+BSC/BXwhwAUgwAWnI",
|
|
"aoBQYCAwAIhqwFBAyGsASCqASCsAXQhrQEgqwEgrQFqIa4BIK4BKQMAIcEFIAUpAzghwgUgwgUgwQWFIcMF",
|
|
"IAUgwwU3AzggBSkDECHEBUIIIcUFIMQFIMUFiCHGBSAFIMYFNwMQIAUpAyghxwVC/wEhyAUgxwUgyAWDIck",
|
|
"FQgAhygUgyQUgygV8IcsFIMsFpyGvAUGAgMACIbABQQMhsQEgrwEgsQF0IbIBILABILIBaiGzASCzASkDAC",
|
|
"HMBSAFKQNQIc0FIM0FIMwFhSHOBSAFIM4FNwNQIAUpAyAhzwVC/wEh0AUgzwUg0AWDIdEFQgAh0gUg0QUg0",
|
|
"gV8IdMFINMFpyG0AUGAgMACIbUBQQMhtgEgtAEgtgF0IbcBILUBILcBaiG4ASC4ASkDACHUBSAFKQNIIdUF",
|
|
"INUFINQFhSHWBSAFINYFNwNIIAUpAxgh1wVC/wEh2AUg1wUg2AWDIdkFQgAh2gUg2QUg2gV8IdsFINsFpyG",
|
|
"5AUGAgMACIboBQQMhuwEguQEguwF0IbwBILoBILwBaiG9ASC9ASkDACHcBSAFKQNAId0FIN0FINwFhSHeBS",
|
|
"AFIN4FNwNAIAUpAxAh3wVC/wEh4AUg3wUg4AWDIeEFQgAh4gUg4QUg4gV8IeMFIOMFpyG+AUGAgMACIb8BQ",
|
|
"QMhwAEgvgEgwAF0IcEBIL8BIMEBaiHCASDCASkDACHkBSAFKQM4IeUFIOUFIOQFhSHmBSAFIOYFNwM4IAUp",
|
|
"A2Ah5wVCICHoBSDnBSDoBXwh6QUgBSDpBTcDYCAFKAJYIcMBQSAhxAEgwwEgxAFqIcUBIAUgxQE2AlgMAAs",
|
|
"AC0IAIeoFIAUg6gU3A2ggBSgCWCHGASDGASkDACHrBSAFKQNQIewFIOsFIOwFhSHtBSAFKQNoIe4FIO4FIO",
|
|
"0FhSHvBSAFIO8FNwNoIAUpA2gh8AVCCCHxBSDwBSDxBYgh8gUgBSkDaCHzBUL/ASH0BSDzBSD0BYMh9QUg9",
|
|
"QWnIccBQYCAwQIhyAFBAyHJASDHASDJAXQhygEgyAEgygFqIcsBIMsBKQMAIfYFIPIFIPYFhSH3BSAFIPcF",
|
|
"NwNoIAUpA2gh+AVCCCH5BSD4BSD5BYgh+gUgBSkDaCH7BUL/ASH8BSD7BSD8BYMh/QUg/QWnIcwBQYCAwQI",
|
|
"hzQFBAyHOASDMASDOAXQhzwEgzQEgzwFqIdABINABKQMAIf4FIPoFIP4FhSH/BSAFIP8FNwNoIAUpA2ghgA",
|
|
"ZCCCGBBiCABiCBBoghggYgBSkDaCGDBkL/ASGEBiCDBiCEBoMhhQYghQanIdEBQYCAwQIh0gFBAyHTASDRA",
|
|
"SDTAXQh1AEg0gEg1AFqIdUBINUBKQMAIYYGIIIGIIYGhSGHBiAFIIcGNwNoIAUpA2ghiAZCCCGJBiCIBiCJ",
|
|
"BoghigYgBSkDaCGLBkL/ASGMBiCLBiCMBoMhjQYgjQanIdYBQYCAwQIh1wFBAyHYASDWASDYAXQh2QEg1wE",
|
|
"g2QFqIdoBINoBKQMAIY4GIIoGII4GhSGPBiAFII8GNwNoIAUpA2ghkAZCCCGRBiCQBiCRBoghkgYgBSkDaC",
|
|
"GTBkL/ASGUBiCTBiCUBoMhlQYglQanIdsBQYCAwQIh3AFBAyHdASDbASDdAXQh3gEg3AEg3gFqId8BIN8BK",
|
|
"QMAIZYGIJIGIJYGhSGXBiAFIJcGNwNoIAUpA2ghmAZCCCGZBiCYBiCZBoghmgYgBSkDaCGbBkL/ASGcBiCb",
|
|
"BiCcBoMhnQYgnQanIeABQYCAwQIh4QFBAyHiASDgASDiAXQh4wEg4QEg4wFqIeQBIOQBKQMAIZ4GIJoGIJ4",
|
|
"GhSGfBiAFIJ8GNwNoIAUpA2ghoAZCCCGhBiCgBiChBoghogYgBSkDaCGjBkL/ASGkBiCjBiCkBoMhpQYgpQ",
|
|
"anIeUBQYCAwQIh5gFBAyHnASDlASDnAXQh6AEg5gEg6AFqIekBIOkBKQMAIaYGIKIGIKYGhSGnBiAFIKcGN",
|
|
"wNoIAUpA2ghqAZCCCGpBiCoBiCpBoghqgYgBSkDaCGrBkL/ASGsBiCrBiCsBoMhrQYgrQanIeoBQYCAwQIh",
|
|
"6wFBAyHsASDqASDsAXQh7QEg6wEg7QFqIe4BIO4BKQMAIa4GIKoGIK4GhSGvBiAFIK8GNwNoIAUoAlgh7wE",
|
|
"g7wEpAwghsAYgBSkDSCGxBiCwBiCxBoUhsgYgBSkDaCGzBiCzBiCyBoUhtAYgBSC0BjcDaCAFKQNoIbUGQg",
|
|
"ghtgYgtQYgtgaIIbcGIAUpA2ghuAZC/wEhuQYguAYguQaDIboGILoGpyHwAUGAgMECIfEBQQMh8gEg8AEg8",
|
|
"gF0IfMBIPEBIPMBaiH0ASD0ASkDACG7BiC3BiC7BoUhvAYgBSC8BjcDaCAFKQNoIb0GQgghvgYgvQYgvgaI",
|
|
"Ib8GIAUpA2ghwAZC/wEhwQYgwAYgwQaDIcIGIMIGpyH1AUGAgMECIfYBQQMh9wEg9QEg9wF0IfgBIPYBIPg",
|
|
"BaiH5ASD5ASkDACHDBiC/BiDDBoUhxAYgBSDEBjcDaCAFKQNoIcUGQgghxgYgxQYgxgaIIccGIAUpA2ghyA",
|
|
"ZC/wEhyQYgyAYgyQaDIcoGIMoGpyH6AUGAgMECIfsBQQMh/AEg+gEg/AF0If0BIPsBIP0BaiH+ASD+ASkDA",
|
|
"CHLBiDHBiDLBoUhzAYgBSDMBjcDaCAFKQNoIc0GQgghzgYgzQYgzgaIIc8GIAUpA2gh0AZC/wEh0QYg0AYg",
|
|
"0QaDIdIGINIGpyH/AUGAgMECIYACQQMhgQIg/wEggQJ0IYICIIACIIICaiGDAiCDAikDACHTBiDPBiDTBoU",
|
|
"h1AYgBSDUBjcDaCAFKQNoIdUGQggh1gYg1QYg1gaIIdcGIAUpA2gh2AZC/wEh2QYg2AYg2QaDIdoGINoGpy",
|
|
"GEAkGAgMECIYUCQQMhhgIghAIghgJ0IYcCIIUCIIcCaiGIAiCIAikDACHbBiDXBiDbBoUh3AYgBSDcBjcDa",
|
|
"CAFKQNoId0GQggh3gYg3QYg3gaIId8GIAUpA2gh4AZC/wEh4QYg4AYg4QaDIeIGIOIGpyGJAkGAgMECIYoC",
|
|
"QQMhiwIgiQIgiwJ0IYwCIIoCIIwCaiGNAiCNAikDACHjBiDfBiDjBoUh5AYgBSDkBjcDaCAFKQNoIeUGQgg",
|
|
"h5gYg5QYg5gaIIecGIAUpA2gh6AZC/wEh6QYg6AYg6QaDIeoGIOoGpyGOAkGAgMECIY8CQQMhkAIgjgIgkA",
|
|
"J0IZECII8CIJECaiGSAiCSAikDACHrBiDnBiDrBoUh7AYgBSDsBjcDaCAFKQNoIe0GQggh7gYg7QYg7gaII",
|
|
"e8GIAUpA2gh8AZC/wEh8QYg8AYg8QaDIfIGIPIGpyGTAkGAgMECIZQCQQMhlQIgkwIglQJ0IZYCIJQCIJYC",
|
|
"aiGXAiCXAikDACHzBiDvBiDzBoUh9AYgBSD0BjcDaCAFKAJYIZgCIJgCKQMQIfUGIAUpA0Ah9gYg9QYg9ga",
|
|
"FIfcGIAUpA2gh+AYg+AYg9waFIfkGIAUg+QY3A2ggBSkDaCH6BkIIIfsGIPoGIPsGiCH8BiAFKQNoIf0GQv",
|
|
"8BIf4GIP0GIP4GgyH/BiD/BqchmQJBgIDBAiGaAkEDIZsCIJkCIJsCdCGcAiCaAiCcAmohnQIgnQIpAwAhg",
|
|
"Acg/AYggAeFIYEHIAUggQc3A2ggBSkDaCGCB0IIIYMHIIIHIIMHiCGEByAFKQNoIYUHQv8BIYYHIIUHIIYH",
|
|
"gyGHByCHB6chngJBgIDBAiGfAkEDIaACIJ4CIKACdCGhAiCfAiChAmohogIgogIpAwAhiAcghAcgiAeFIYk",
|
|
"HIAUgiQc3A2ggBSkDaCGKB0IIIYsHIIoHIIsHiCGMByAFKQNoIY0HQv8BIY4HII0HII4HgyGPByCPB6chow",
|
|
"JBgIDBAiGkAkEDIaUCIKMCIKUCdCGmAiCkAiCmAmohpwIgpwIpAwAhkAcgjAcgkAeFIZEHIAUgkQc3A2ggB",
|
|
"SkDaCGSB0IIIZMHIJIHIJMHiCGUByAFKQNoIZUHQv8BIZYHIJUHIJYHgyGXByCXB6chqAJBgIDBAiGpAkED",
|
|
"IaoCIKgCIKoCdCGrAiCpAiCrAmohrAIgrAIpAwAhmAcglAcgmAeFIZkHIAUgmQc3A2ggBSkDaCGaB0IIIZs",
|
|
"HIJoHIJsHiCGcByAFKQNoIZ0HQv8BIZ4HIJ0HIJ4HgyGfByCfB6chrQJBgIDBAiGuAkEDIa8CIK0CIK8CdC",
|
|
"GwAiCuAiCwAmohsQIgsQIpAwAhoAcgnAcgoAeFIaEHIAUgoQc3A2ggBSkDaCGiB0IIIaMHIKIHIKMHiCGkB",
|
|
"yAFKQNoIaUHQv8BIaYHIKUHIKYHgyGnByCnB6chsgJBgIDBAiGzAkEDIbQCILICILQCdCG1AiCzAiC1Amoh",
|
|
"tgIgtgIpAwAhqAcgpAcgqAeFIakHIAUgqQc3A2ggBSkDaCGqB0IIIasHIKoHIKsHiCGsByAFKQNoIa0HQv8",
|
|
"BIa4HIK0HIK4HgyGvByCvB6chtwJBgIDBAiG4AkEDIbkCILcCILkCdCG6AiC4AiC6AmohuwIguwIpAwAhsA",
|
|
"cgrAcgsAeFIbEHIAUgsQc3A2ggBSkDaCGyB0IIIbMHILIHILMHiCG0ByAFKQNoIbUHQv8BIbYHILUHILYHg",
|
|
"yG3ByC3B6chvAJBgIDBAiG9AkEDIb4CILwCIL4CdCG/AiC9AiC/AmohwAIgwAIpAwAhuAcgtAcguAeFIbkH",
|
|
"IAUguQc3A2ggBSgCWCHBAiDBAikDGCG6ByAFKQM4IbsHILoHILsHhSG8ByAFKQNoIb0HIL0HILwHhSG+ByA",
|
|
"FIL4HNwNoIAUpA2ghvwdCCCHAByC/ByDAB4ghwQcgBSkDaCHCB0L/ASHDByDCByDDB4MhxAcgxAenIcICQY",
|
|
"CAwQIhwwJBAyHEAiDCAiDEAnQhxQIgwwIgxQJqIcYCIMYCKQMAIcUHIMEHIMUHhSHGByAFIMYHNwNoIAUpA",
|
|
"2ghxwdCCCHIByDHByDIB4ghyQcgBSkDaCHKB0L/ASHLByDKByDLB4MhzAcgzAenIccCQYCAwQIhyAJBAyHJ",
|
|
"AiDHAiDJAnQhygIgyAIgygJqIcsCIMsCKQMAIc0HIMkHIM0HhSHOByAFIM4HNwNoIAUpA2ghzwdCCCHQByD",
|
|
"PByDQB4gh0QcgBSkDaCHSB0L/ASHTByDSByDTB4Mh1Acg1AenIcwCQYCAwQIhzQJBAyHOAiDMAiDOAnQhzw",
|
|
"IgzQIgzwJqIdACINACKQMAIdUHINEHINUHhSHWByAFINYHNwNoIAUpA2gh1wdCCCHYByDXByDYB4gh2QcgB",
|
|
"SkDaCHaB0L/ASHbByDaByDbB4Mh3Acg3AenIdECQYCAwQIh0gJBAyHTAiDRAiDTAnQh1AIg0gIg1AJqIdUC",
|
|
"INUCKQMAId0HINkHIN0HhSHeByAFIN4HNwNoIAUpA2gh3wdCCCHgByDfByDgB4gh4QcgBSkDaCHiB0L/ASH",
|
|
"jByDiByDjB4Mh5Acg5AenIdYCQYCAwQIh1wJBAyHYAiDWAiDYAnQh2QIg1wIg2QJqIdoCINoCKQMAIeUHIO",
|
|
"EHIOUHhSHmByAFIOYHNwNoIAUpA2gh5wdCCCHoByDnByDoB4gh6QcgBSkDaCHqB0L/ASHrByDqByDrB4Mh7",
|
|
"Acg7AenIdsCQYCAwQIh3AJBAyHdAiDbAiDdAnQh3gIg3AIg3gJqId8CIN8CKQMAIe0HIOkHIO0HhSHuByAF",
|
|
"IO4HNwNoIAUpA2gh7wdCCCHwByDvByDwB4gh8QcgBSkDaCHyB0L/ASHzByDyByDzB4Mh9Acg9AenIeACQYC",
|
|
"AwQIh4QJBAyHiAiDgAiDiAnQh4wIg4QIg4wJqIeQCIOQCKQMAIfUHIPEHIPUHhSH2ByAFIPYHNwNoIAUpA2",
|
|
"gh9wdCCCH4ByD3ByD4B4gh+QcgBSkDaCH6B0L/ASH7ByD6ByD7B4Mh/Acg/AenIeUCQYCAwQIh5gJBAyHnA",
|
|
"iDlAiDnAnQh6AIg5gIg6AJqIekCIOkCKQMAIf0HIPkHIP0HhSH+ByAFIP4HNwNoIAUpA2Ah/wdCICGACCD/",
|
|
"ByCACHwhgQggBSCBCDcDYAtCACGCCCAFIIIINwMIAkADQCAFKQMIIYMIIAUoAnQh6gIg6gIh6wIg6wKsIYQ",
|
|
"IIIMIIYUIIIQIIYYIIIUIIIYIVCHsAkEBIe0CIOwCIO0CcSHuAiDuAkUNASAFKQNoIYcIQgghiAgghwggiA",
|
|
"iIIYkIIAUpA2ghigggBSgCcCHvAiAFKQNgIYsIIIsIpyHwAiDvAiDwAmoh8QIg8QItAAAh8gJB/wEh8wIg8",
|
|
"gIg8wJxIfQCIPQCrSGMCCCKCCCMCIUhjQhC/wEhjgggjQggjgiDIY8III8IpyH1AkGAgMECIfYCQQMh9wIg",
|
|
"9QIg9wJ0IfgCIPYCIPgCaiH5AiD5AikDACGQCCCJCCCQCIUhkQggBSCRCDcDaCAFKQMIIZIIQgEhkwggkgg",
|
|
"gkwh8IZQIIAUglAg3AwggBSkDYCGVCEIBIZYIIJUIIJYIfCGXCCAFIJcINwNgDAALAAsgBSkDaCGYCEJ/IZ",
|
|
"kIIJgIIJkIhSGaCCAGIJoINwMADwudAgIcfwV+IwAhBEEgIQUgBCAFayEGIAYkACAGIAA2AhwgBiABNgIYI",
|
|
"AYgAjYCFCAGIAM2AhAgBigCHCEHIAYoAhghCCAGKAIUIQkgByAIIAkQBiAGKAIQIQogBiAKNgIMQQAhCyAG",
|
|
"IAs2AggCQANAIAYoAgghDEEIIQ0gDCEOIA0hDyAOIA9JIRBBASERIBAgEXEhEiASRQ0BIAcpAwAhICAGKAI",
|
|
"IIRNBAyEUIBMgFHQhFSAVIRYgFq0hISAgICGIISJC/wEhIyAiICODISQgJKchFyAGKAIMIRggBigCCCEZIB",
|
|
"ggGWohGiAaIBc6AAAgBigCCCEbQQEhHCAbIBxqIR0gBiAdNgIIDAALAAtBICEeIAYgHmohHyAfJAAPC14BD",
|
|
"H8jACEBQRAhAiABIAJrIQMgAyQAIAMgADYCDCADKAIMIQRBACEFIAQhBiAFIQcgBiAHRiEIQQEhCSAIIAlx",
|
|
"IQoCQCAKDQAgBBAUC0EQIQsgAyALaiEMIAwkAA8LNQIEfwF+QRAhACAAEBMhAUIAIQQgASAENwMAQQghAiA",
|
|
"BIAJqIQMgAyAENwMAIAEQChogAQ8LPAIEfwJ+IwAhAUEQIQIgASACayEDIAMgADYCDCADKAIMIQRCACEFIA",
|
|
"QgBTcDAEIAIQYgBCAGNwMIIAQPC1kBCH8jACEDQRAhBCADIARrIQUgBSQAIAUgADYCDCAFIAE2AgggBSACN",
|
|
"gIEIAUoAgwhBiAFKAIIIQcgBSgCBCEIIAYgByAIEAZBECEJIAUgCWohCiAKJAAPC2kBCX8jACEEQRAhBSAE",
|
|
"IAVrIQYgBiQAIAYgADYCDCAGIAE2AgggBiACNgIEIAYgAzYCACAGKAIMIQcgBigCCCEIIAYoAgQhCSAGKAI",
|
|
"AIQogByAIIAkgChAHQRAhCyAGIAtqIQwgDCQADwteAQx/IwAhAUEQIQIgASACayEDIAMkACADIAA2AgwgAy",
|
|
"gCDCEEQQAhBSAEIQYgBSEHIAYgB0YhCEEBIQkgCCAJcSEKAkAgCg0AIAQQFAtBECELIAMgC2ohDCAMJAAPC",
|
|
"wcAPwBBEHQLBwBBlJLBAgtUAQJ/QQAoAoCQwQIiASAAQQdqQXhxIgJqIQACQAJAIAJFDQAgACABTQ0BCwJA",
|
|
"IAAQDk0NACAAEAFFDQELQQAgADYCgJDBAiABDwsQD0EwNgIAQX8LviwBC38jAEEQayIBJAACQAJAAkACQAJ",
|
|
"AAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AUsNAAJAQQAoApiSwQIiAkEQIABBC2pBeHEgAEELSRsiA0EDdi",
|
|
"IEdiIAQQNxRQ0AAkACQCAAQX9zQQFxIARqIgVBA3QiBEHAksECaiIAIARByJLBAmooAgAiBCgCCCIDRw0AQ",
|
|
"QAgAkF+IAV3cTYCmJLBAgwBCyADIAA2AgwgACADNgIICyAEQQhqIQAgBCAFQQN0IgVBA3I2AgQgBCAFaiIE",
|
|
"IAQoAgRBAXI2AgQMDwsgA0EAKAKgksECIgZNDQECQCAARQ0AAkACQCAAIAR0QQIgBHQiAEEAIABrcnEiAEE",
|
|
"AIABrcWgiBEEDdCIAQcCSwQJqIgUgAEHIksECaigCACIAKAIIIgdHDQBBACACQX4gBHdxIgI2ApiSwQIMAQ",
|
|
"sgByAFNgIMIAUgBzYCCAsgACADQQNyNgIEIAAgA2oiByAEQQN0IgQgA2siBUEBcjYCBCAAIARqIAU2AgACQ",
|
|
"CAGRQ0AIAZBeHFBwJLBAmohA0EAKAKsksECIQQCQAJAIAJBASAGQQN2dCIIcQ0AQQAgAiAIcjYCmJLBAiAD",
|
|
"IQgMAQsgAygCCCEICyADIAQ2AgggCCAENgIMIAQgAzYCDCAEIAg2AggLIABBCGohAEEAIAc2AqySwQJBACA",
|
|
"FNgKgksECDA8LQQAoApySwQIiCUUNASAJQQAgCWtxaEECdEHIlMECaigCACIHKAIEQXhxIANrIQQgByEFAk",
|
|
"ADQAJAIAUoAhAiAA0AIAVBFGooAgAiAEUNAgsgACgCBEF4cSADayIFIAQgBSAESSIFGyEEIAAgByAFGyEHI",
|
|
"AAhBQwACwALIAcoAhghCgJAIAcoAgwiCCAHRg0AIAcoAggiAEEAKAKoksECSRogACAINgIMIAggADYCCAwO",
|
|
"CwJAIAdBFGoiBSgCACIADQAgBygCECIARQ0DIAdBEGohBQsDQCAFIQsgACIIQRRqIgUoAgAiAA0AIAhBEGo",
|
|
"hBSAIKAIQIgANAAsgC0EANgIADA0LQX8hAyAAQb9/Sw0AIABBC2oiAEF4cSEDQQAoApySwQIiBkUNAEEAIQ",
|
|
"sCQCADQYACSQ0AQR8hCyADQf///wdLDQAgA0EmIABBCHZnIgBrdkEBcSAAQQF0a0E+aiELC0EAIANrIQQCQ",
|
|
"AJAAkACQCALQQJ0QciUwQJqKAIAIgUNAEEAIQBBACEIDAELQQAhACADQQBBGSALQQF2ayALQR9GG3QhB0EA",
|
|
"IQgDQAJAIAUoAgRBeHEgA2siAiAETw0AIAIhBCAFIQggAg0AQQAhBCAFIQggBSEADAMLIAAgBUEUaigCACI",
|
|
"CIAIgBSAHQR12QQRxakEQaigCACIFRhsgACACGyEAIAdBAXQhByAFDQALCwJAIAAgCHINAEEAIQhBAiALdC",
|
|
"IAQQAgAGtyIAZxIgBFDQMgAEEAIABrcWhBAnRByJTBAmooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIANrIgIgB",
|
|
"EkhBwJAIAAoAhAiBQ0AIABBFGooAgAhBQsgAiAEIAcbIQQgACAIIAcbIQggBSEAIAUNAAsLIAhFDQAgBEEA",
|
|
"KAKgksECIANrTw0AIAgoAhghCwJAIAgoAgwiByAIRg0AIAgoAggiAEEAKAKoksECSRogACAHNgIMIAcgADY",
|
|
"CCAwMCwJAIAhBFGoiBSgCACIADQAgCCgCECIARQ0DIAhBEGohBQsDQCAFIQIgACIHQRRqIgUoAgAiAA0AIA",
|
|
"dBEGohBSAHKAIQIgANAAsgAkEANgIADAsLAkBBACgCoJLBAiIAIANJDQBBACgCrJLBAiEEAkACQCAAIANrI",
|
|
"gVBEEkNAEEAIAU2AqCSwQJBACAEIANqIgc2AqySwQIgByAFQQFyNgIEIAQgAGogBTYCACAEIANBA3I2AgQM",
|
|
"AQtBAEEANgKsksECQQBBADYCoJLBAiAEIABBA3I2AgQgBCAAaiIAIAAoAgRBAXI2AgQLIARBCGohAAwNCwJ",
|
|
"AQQAoAqSSwQIiByADTQ0AQQAgByADayIENgKkksECQQBBACgCsJLBAiIAIANqIgU2ArCSwQIgBSAEQQFyNg",
|
|
"IEIAAgA0EDcjYCBCAAQQhqIQAMDQsCQAJAQQAoAvCVwQJFDQBBACgC+JXBAiEEDAELQQBCfzcC/JXBAkEAQ",
|
|
"oCggICAgAQ3AvSVwQJBACABQQxqQXBxQdiq1aoFczYC8JXBAkEAQQA2AoSWwQJBAEEANgLUlcECQYAgIQQL",
|
|
"QQAhACAEIANBL2oiBmoiAkEAIARrIgtxIgggA00NDEEAIQACQEEAKALQlcECIgRFDQBBACgCyJXBAiIFIAh",
|
|
"qIgkgBU0NDSAJIARLDQ0LAkACQEEALQDUlcECQQRxDQACQAJAAkACQAJAQQAoArCSwQIiBEUNAEHYlcECIQ",
|
|
"ADQAJAIAAoAgAiBSAESw0AIAUgACgCBGogBEsNAwsgACgCCCIADQALC0EAEBAiB0F/Rg0DIAghAgJAQQAoA",
|
|
"vSVwQIiAEF/aiIEIAdxRQ0AIAggB2sgBCAHakEAIABrcWohAgsgAiADTQ0DAkBBACgC0JXBAiIARQ0AQQAo",
|
|
"AsiVwQIiBCACaiIFIARNDQQgBSAASw0ECyACEBAiACAHRw0BDAULIAIgB2sgC3EiAhAQIgcgACgCACAAKAI",
|
|
"EakYNASAHIQALIABBf0YNAQJAIANBMGogAksNACAAIQcMBAsgBiACa0EAKAL4lcECIgRqQQAgBGtxIgQQEE",
|
|
"F/Rg0BIAQgAmohAiAAIQcMAwsgB0F/Rw0CC0EAQQAoAtSVwQJBBHI2AtSVwQILIAgQECEHQQAQECEAIAdBf",
|
|
"0YNBSAAQX9GDQUgByAATw0FIAAgB2siAiADQShqTQ0FC0EAQQAoAsiVwQIgAmoiADYCyJXBAgJAIABBACgC",
|
|
"zJXBAk0NAEEAIAA2AsyVwQILAkACQEEAKAKwksECIgRFDQBB2JXBAiEAA0AgByAAKAIAIgUgACgCBCIIakY",
|
|
"NAiAAKAIIIgANAAwFCwALAkACQEEAKAKoksECIgBFDQAgByAATw0BC0EAIAc2AqiSwQILQQAhAEEAIAI2At",
|
|
"yVwQJBACAHNgLYlcECQQBBfzYCuJLBAkEAQQAoAvCVwQI2ArySwQJBAEEANgLklcECA0AgAEEDdCIEQciSw",
|
|
"QJqIARBwJLBAmoiBTYCACAEQcySwQJqIAU2AgAgAEEBaiIAQSBHDQALQQAgAkFYaiIAQXggB2tBB3FBACAH",
|
|
"QQhqQQdxGyIEayIFNgKkksECQQAgByAEaiIENgKwksECIAQgBUEBcjYCBCAHIABqQSg2AgRBAEEAKAKAlsE",
|
|
"CNgK0ksECDAQLIAAtAAxBCHENAiAEIAVJDQIgBCAHTw0CIAAgCCACajYCBEEAIARBeCAEa0EHcUEAIARBCG",
|
|
"pBB3EbIgBqIgU2ArCSwQJBAEEAKAKkksECIAJqIgcgAGsiADYCpJLBAiAFIABBAXI2AgQgBCAHakEoNgIEQ",
|
|
"QBBACgCgJbBAjYCtJLBAgwDC0EAIQgMCgtBACEHDAgLAkAgB0EAKAKoksECIghPDQBBACAHNgKoksECIAch",
|
|
"CAsgByACaiEFQdiVwQIhAAJAAkACQAJAA0AgACgCACAFRg0BIAAoAggiAA0ADAILAAsgAC0ADEEIcUUNAQt",
|
|
"B2JXBAiEAA0ACQCAAKAIAIgUgBEsNACAFIAAoAgRqIgUgBEsNAwsgACgCCCEADAALAAsgACAHNgIAIAAgAC",
|
|
"gCBCACajYCBCAHQXggB2tBB3FBACAHQQhqQQdxG2oiCyADQQNyNgIEIAVBeCAFa0EHcUEAIAVBCGpBB3Eba",
|
|
"iICIAsgA2oiA2shAAJAIAIgBEcNAEEAIAM2ArCSwQJBAEEAKAKkksECIABqIgA2AqSSwQIgAyAAQQFyNgIE",
|
|
"DAgLAkAgAkEAKAKsksECRw0AQQAgAzYCrJLBAkEAQQAoAqCSwQIgAGoiADYCoJLBAiADIABBAXI2AgQgAyA",
|
|
"AaiAANgIADAgLIAIoAgQiBEEDcUEBRw0GIARBeHEhBgJAIARB/wFLDQAgAigCCCIFIARBA3YiCEEDdEHAks",
|
|
"ECaiIHRhoCQCACKAIMIgQgBUcNAEEAQQAoApiSwQJBfiAId3E2ApiSwQIMBwsgBCAHRhogBSAENgIMIAQgB",
|
|
"TYCCAwGCyACKAIYIQkCQCACKAIMIgcgAkYNACACKAIIIgQgCEkaIAQgBzYCDCAHIAQ2AggMBQsCQCACQRRq",
|
|
"IgUoAgAiBA0AIAIoAhAiBEUNBCACQRBqIQULA0AgBSEIIAQiB0EUaiIFKAIAIgQNACAHQRBqIQUgBygCECI",
|
|
"EDQALIAhBADYCAAwEC0EAIAJBWGoiAEF4IAdrQQdxQQAgB0EIakEHcRsiCGsiCzYCpJLBAkEAIAcgCGoiCD",
|
|
"YCsJLBAiAIIAtBAXI2AgQgByAAakEoNgIEQQBBACgCgJbBAjYCtJLBAiAEIAVBJyAFa0EHcUEAIAVBWWpBB",
|
|
"3EbakFRaiIAIAAgBEEQakkbIghBGzYCBCAIQRBqQQApAuCVwQI3AgAgCEEAKQLYlcECNwIIQQAgCEEIajYC",
|
|
"4JXBAkEAIAI2AtyVwQJBACAHNgLYlcECQQBBADYC5JXBAiAIQRhqIQADQCAAQQc2AgQgAEEIaiEHIABBBGo",
|
|
"hACAHIAVJDQALIAggBEYNACAIIAgoAgRBfnE2AgQgBCAIIARrIgdBAXI2AgQgCCAHNgIAAkAgB0H/AUsNAC",
|
|
"AHQXhxQcCSwQJqIQACQAJAQQAoApiSwQIiBUEBIAdBA3Z0IgdxDQBBACAFIAdyNgKYksECIAAhBQwBCyAAK",
|
|
"AIIIQULIAAgBDYCCCAFIAQ2AgwgBCAANgIMIAQgBTYCCAwBC0EfIQACQCAHQf///wdLDQAgB0EmIAdBCHZn",
|
|
"IgBrdkEBcSAAQQF0a0E+aiEACyAEIAA2AhwgBEIANwIQIABBAnRByJTBAmohBQJAAkACQEEAKAKcksECIgh",
|
|
"BASAAdCICcQ0AQQAgCCACcjYCnJLBAiAFIAQ2AgAgBCAFNgIYDAELIAdBAEEZIABBAXZrIABBH0YbdCEAIA",
|
|
"UoAgAhCANAIAgiBSgCBEF4cSAHRg0CIABBHXYhCCAAQQF0IQAgBSAIQQRxaiICQRBqKAIAIggNAAsgAkEQa",
|
|
"iAENgIAIAQgBTYCGAsgBCAENgIMIAQgBDYCCAwBCyAFKAIIIgAgBDYCDCAFIAQ2AgggBEEANgIYIAQgBTYC",
|
|
"DCAEIAA2AggLQQAoAqSSwQIiACADTQ0AQQAgACADayIENgKkksECQQBBACgCsJLBAiIAIANqIgU2ArCSwQI",
|
|
"gBSAEQQFyNgIEIAAgA0EDcjYCBCAAQQhqIQAMCAsQD0EwNgIAQQAhAAwHC0EAIQcLIAlFDQACQAJAIAIgAi",
|
|
"gCHCIFQQJ0QciUwQJqIgQoAgBHDQAgBCAHNgIAIAcNAUEAQQAoApySwQJBfiAFd3E2ApySwQIMAgsgCUEQQ",
|
|
"RQgCSgCECACRhtqIAc2AgAgB0UNAQsgByAJNgIYAkAgAigCECIERQ0AIAcgBDYCECAEIAc2AhgLIAJBFGoo",
|
|
"AgAiBEUNACAHQRRqIAQ2AgAgBCAHNgIYCyAGIABqIQAgAiAGaiICKAIEIQQLIAIgBEF+cTYCBCADIABBAXI",
|
|
"2AgQgAyAAaiAANgIAAkAgAEH/AUsNACAAQXhxQcCSwQJqIQQCQAJAQQAoApiSwQIiBUEBIABBA3Z0IgBxDQ",
|
|
"BBACAFIAByNgKYksECIAQhAAwBCyAEKAIIIQALIAQgAzYCCCAAIAM2AgwgAyAENgIMIAMgADYCCAwBC0EfI",
|
|
"QQCQCAAQf///wdLDQAgAEEmIABBCHZnIgRrdkEBcSAEQQF0a0E+aiEECyADIAQ2AhwgA0IANwIQIARBAnRB",
|
|
"yJTBAmohBQJAAkACQEEAKAKcksECIgdBASAEdCIIcQ0AQQAgByAIcjYCnJLBAiAFIAM2AgAgAyAFNgIYDAE",
|
|
"LIABBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhBwNAIAciBSgCBEF4cSAARg0CIARBHXYhByAEQQF0IQQgBS",
|
|
"AHQQRxaiIIQRBqKAIAIgcNAAsgCEEQaiADNgIAIAMgBTYCGAsgAyADNgIMIAMgAzYCCAwBCyAFKAIIIgAgA",
|
|
"zYCDCAFIAM2AgggA0EANgIYIAMgBTYCDCADIAA2AggLIAtBCGohAAwCCwJAIAtFDQACQAJAIAggCCgCHCIF",
|
|
"QQJ0QciUwQJqIgAoAgBHDQAgACAHNgIAIAcNAUEAIAZBfiAFd3EiBjYCnJLBAgwCCyALQRBBFCALKAIQIAh",
|
|
"GG2ogBzYCACAHRQ0BCyAHIAs2AhgCQCAIKAIQIgBFDQAgByAANgIQIAAgBzYCGAsgCEEUaigCACIARQ0AIA",
|
|
"dBFGogADYCACAAIAc2AhgLAkACQCAEQQ9LDQAgCCAEIANqIgBBA3I2AgQgCCAAaiIAIAAoAgRBAXI2AgQMA",
|
|
"QsgCCADQQNyNgIEIAggA2oiByAEQQFyNgIEIAcgBGogBDYCAAJAIARB/wFLDQAgBEF4cUHAksECaiEAAkAC",
|
|
"QEEAKAKYksECIgVBASAEQQN2dCIEcQ0AQQAgBSAEcjYCmJLBAiAAIQQMAQsgACgCCCEECyAAIAc2AgggBCA",
|
|
"HNgIMIAcgADYCDCAHIAQ2AggMAQtBHyEAAkAgBEH///8HSw0AIARBJiAEQQh2ZyIAa3ZBAXEgAEEBdGtBPm",
|
|
"ohAAsgByAANgIcIAdCADcCECAAQQJ0QciUwQJqIQUCQAJAAkAgBkEBIAB0IgNxDQBBACAGIANyNgKcksECI",
|
|
"AUgBzYCACAHIAU2AhgMAQsgBEEAQRkgAEEBdmsgAEEfRht0IQAgBSgCACEDA0AgAyIFKAIEQXhxIARGDQIg",
|
|
"AEEddiEDIABBAXQhACAFIANBBHFqIgJBEGooAgAiAw0ACyACQRBqIAc2AgAgByAFNgIYCyAHIAc2AgwgByA",
|
|
"HNgIIDAELIAUoAggiACAHNgIMIAUgBzYCCCAHQQA2AhggByAFNgIMIAcgADYCCAsgCEEIaiEADAELAkAgCk",
|
|
"UNAAJAAkAgByAHKAIcIgVBAnRByJTBAmoiACgCAEcNACAAIAg2AgAgCA0BQQAgCUF+IAV3cTYCnJLBAgwCC",
|
|
"yAKQRBBFCAKKAIQIAdGG2ogCDYCACAIRQ0BCyAIIAo2AhgCQCAHKAIQIgBFDQAgCCAANgIQIAAgCDYCGAsg",
|
|
"B0EUaigCACIARQ0AIAhBFGogADYCACAAIAg2AhgLAkACQCAEQQ9LDQAgByAEIANqIgBBA3I2AgQgByAAaiI",
|
|
"AIAAoAgRBAXI2AgQMAQsgByADQQNyNgIEIAcgA2oiBSAEQQFyNgIEIAUgBGogBDYCAAJAIAZFDQAgBkF4cU",
|
|
"HAksECaiEDQQAoAqySwQIhAAJAAkBBASAGQQN2dCIIIAJxDQBBACAIIAJyNgKYksECIAMhCAwBCyADKAIII",
|
|
"QgLIAMgADYCCCAIIAA2AgwgACADNgIMIAAgCDYCCAtBACAFNgKsksECQQAgBDYCoJLBAgsgB0EIaiEACyAB",
|
|
"QRBqJAAgAAuDDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQE",
|
|
"gASABKAIAIgJrIgFBACgCqJLBAiIESQ0BIAIgAGohAAJAAkACQCABQQAoAqySwQJGDQACQCACQf8BSw0AIA",
|
|
"EoAggiBCACQQN2IgVBA3RBwJLBAmoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKYksECQX4gBXdxNgKYksECD",
|
|
"AULIAIgBkYaIAQgAjYCDCACIAQ2AggMBAsgASgCGCEHAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiACIAY2",
|
|
"AgwgBiACNgIIDAMLAkAgAUEUaiIEKAIAIgINACABKAIQIgJFDQIgAUEQaiEECwNAIAQhBSACIgZBFGoiBCg",
|
|
"CACICDQAgBkEQaiEEIAYoAhAiAg0ACyAFQQA2AgAMAgsgAygCBCICQQNxQQNHDQJBACAANgKgksECIAMgAk",
|
|
"F+cTYCBCABIABBAXI2AgQgAyAANgIADwtBACEGCyAHRQ0AAkACQCABIAEoAhwiBEECdEHIlMECaiICKAIAR",
|
|
"w0AIAIgBjYCACAGDQFBAEEAKAKcksECQX4gBHdxNgKcksECDAILIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZF",
|
|
"DQELIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABQRRqKAIAIgJFDQAgBkEUaiACNgIAIAI",
|
|
"gBjYCGAsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkACQAJAAkAgAkECcQ0AAkAgA0EAKAKwksECRw0AQQAgAT",
|
|
"YCsJLBAkEAQQAoAqSSwQIgAGoiADYCpJLBAiABIABBAXI2AgQgAUEAKAKsksECRw0GQQBBADYCoJLBAkEAQ",
|
|
"QA2AqySwQIPCwJAIANBACgCrJLBAkcNAEEAIAE2AqySwQJBAEEAKAKgksECIABqIgA2AqCSwQIgASAAQQFy",
|
|
"NgIEIAEgAGogADYCAA8LIAJBeHEgAGohAAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEHAksECaiIGRho",
|
|
"CQCADKAIMIgIgBEcNAEEAQQAoApiSwQJBfiAFd3E2ApiSwQIMBQsgAiAGRhogBCACNgIMIAIgBDYCCAwECy",
|
|
"ADKAIYIQcCQCADKAIMIgYgA0YNACADKAIIIgJBACgCqJLBAkkaIAIgBjYCDCAGIAI2AggMAwsCQCADQRRqI",
|
|
"gQoAgAiAg0AIAMoAhAiAkUNAiADQRBqIQQLA0AgBCEFIAIiBkEUaiIEKAIAIgINACAGQRBqIQQgBigCECIC",
|
|
"DQALIAVBADYCAAwCCyADIAJBfnE2AgQgASAAQQFyNgIEIAEgAGogADYCAAwDC0EAIQYLIAdFDQACQAJAIAM",
|
|
"gAygCHCIEQQJ0QciUwQJqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoApySwQJBfiAEd3E2ApySwQIMAgsgB0",
|
|
"EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIANBF",
|
|
"GooAgAiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABBAXI2AgQgASAAaiAANgIAIAFBACgCrJLBAkcNAEEA",
|
|
"IAA2AqCSwQIPCwJAIABB/wFLDQAgAEF4cUHAksECaiECAkACQEEAKAKYksECIgRBASAAQQN2dCIAcQ0AQQA",
|
|
"gBCAAcjYCmJLBAiACIQAMAQsgAigCCCEACyACIAE2AgggACABNgIMIAEgAjYCDCABIAA2AggPC0EfIQICQC",
|
|
"AAQf///wdLDQAgAEEmIABBCHZnIgJrdkEBcSACQQF0a0E+aiECCyABIAI2AhwgAUIANwIQIAJBAnRByJTBA",
|
|
"mohBAJAAkACQAJAQQAoApySwQIiBkEBIAJ0IgNxDQBBACAGIANyNgKcksECIAQgATYCACABIAQ2AhgMAQsg",
|
|
"AEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGA0AgBiIEKAIEQXhxIABGDQIgAkEddiEGIAJBAXQhAiAEIAZ",
|
|
"BBHFqIgNBEGooAgAiBg0ACyADQRBqIAE2AgAgASAENgIYCyABIAE2AgwgASABNgIIDAELIAQoAggiACABNg",
|
|
"IMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAK4ksECQX9qIgFBfyABGzYCuJLBAgsLMQEBf",
|
|
"yAAQQEgABshAQJAA0AgARARIgANAQJAECIiAEUNACAAEQMADAELCxAAAAsgAAsGACAAEBILBAAgAAsLACAA",
|
|
"KAI8EBUQAgsVAAJAIAANAEEADwsQDyAANgIAQX8L4wIBB38jAEEgayIDJAAgAyAAKAIcIgQ2AhAgACgCFCE",
|
|
"FIAMgAjYCHCADIAE2AhggAyAFIARrIgE2AhQgASACaiEGIANBEGohBEECIQcCQAJAAkACQAJAIAAoAjwgA0",
|
|
"EQakECIANBDGoQAxAXRQ0AIAQhBQwBCwNAIAYgAygCDCIBRg0CAkAgAUF/Sg0AIAQhBQwECyAEIAEgBCgCB",
|
|
"CIISyIJQQN0aiIFIAUoAgAgASAIQQAgCRtrIghqNgIAIARBDEEEIAkbaiIEIAQoAgAgCGs2AgAgBiABayEG",
|
|
"IAUhBCAAKAI8IAUgByAJayIHIANBDGoQAxAXRQ0ACwsgBkF/Rw0BCyAAIAAoAiwiATYCHCAAIAE2AhQgACA",
|
|
"BIAAoAjBqNgIQIAIhAQwBC0EAIQEgAEEANgIcIABCADcDECAAIAAoAgBBIHI2AgAgB0ECRg0AIAIgBSgCBG",
|
|
"shAQsgA0EgaiQAIAELNwEBfyMAQRBrIgMkACAAIAEgAkH/AXEgA0EIahAwEBchAiADKQMIIQEgA0EQaiQAQ",
|
|
"n8gASACGwsNACAAKAI8IAEgAhAZCwIACwIACw4AQZCWwQIQG0GUlsECCwkAQZCWwQIQHAsEAEEBCwIACwcA",
|
|
"IAAoAgALCQBBnJbBAhAhCwYAIAAkAQsEACMBCwQAIwALBgAgACQACxIBAn8jACAAa0FwcSIBJAAgAQsEACM",
|
|
"ACxMAQYCAwAIkA0EAQQ9qQXBxJAILBwAjACMCawsEACMDCwQAIwILuAIBA38CQCAADQBBACEBAkBBACgCmJ",
|
|
"bBAkUNAEEAKAKYlsECEC0hAQsCQEEAKAKYkcECRQ0AQQAoApiRwQIQLSABciEBCwJAEB0oAgAiAEUNAANAQ",
|
|
"QAhAgJAIAAoAkxBAEgNACAAEB8hAgsCQCAAKAIUIAAoAhxGDQAgABAtIAFyIQELAkAgAkUNACAAECALIAAo",
|
|
"AjgiAA0ACwsQHiABDwtBACECAkAgACgCTEEASA0AIAAQHyECCwJAAkACQCAAKAIUIAAoAhxGDQAgAEEAQQA",
|
|
"gACgCJBEHABogACgCFA0AQX8hASACDQEMAgsCQCAAKAIEIgEgACgCCCIDRg0AIAAgASADa6xBASAAKAIoEQ",
|
|
"QAGgtBACEBIABBADYCHCAAQgA3AxAgAEIANwIEIAJFDQELIAAQIAsgAQsNACABIAIgAyAAEQQACyMBAX4gA",
|
|
"CABIAKtIAOtQiCGhCAEEC4hBSAFQiCIpxAjIAWnCxMAIAAgAacgAUIgiKcgAiADEAQLC7aSgYAABABBgIDA",
|
|
"AguAkAEAAAAAAAAAADGyfhfBM8W4CfdqdtFBU0U4RRRhEHKW/RLu1eyig6aKI1yr+2OwYzIbGb+ac8L1zyq",
|
|
"rwY2y8TB3T088gRYhlCF+/UKW1xJRmUa4VvfHYMdkdwoo4AZTAtxdoelttKIyq2wTl3p1kfcTVFaDG2XjYe",
|
|
"5l5P0MpNCkVp6eeAItQihDrywGFexx7fuXaRJ0/AN7BqbbbGM9ML6+jHCt7o/Bjsm9wtP5TvJLcYWHx5heg",
|
|
"N2MtDW5j5+zGDTR0USDO2O8YuBjOpT6UHna2CYu9eoi7yfplFDiKxEqn8M/kW+Z4Bro8o3veFjT31DKyPsZ",
|
|
"SKFJrft6hQ6JkowVPD3xBFqEUIYNj48Tm7eVPjXKm3KLxQPDBHjlZUr2xnsu0yTo+Af2DB9hWv85NDO0JyR",
|
|
"OnilGpUkWljCJ6HVg8XNyzYVMpcSnQsCzko2WAR96hafzneSX4ks32eRc11JaYZwYae4mYi1QLmZ+LxWnlW",
|
|
"hrch8/ZzFoWdkMCP5U9NCio4kGd8Z4xZMR9xG29b19q1TjcKaHK4Ca5p1nZ7TuOLBNXOrVRd5Pgf8i/RR2G",
|
|
"/e5ujacBASNCogISIvFN0iy7ey1h2Hn7OTcXsuQoNQpXOQb3/Gwpr+h1amh5nGVehn/AmBrw2RKbs6wHnwC",
|
|
"V4/W9vUKHRIlGSvHR3QK0xbckxPpdVHnLng4IlsLRiYdvYAaHh8nNm8rfSusYTD3XO7FAQegvUWt3rIwtd6",
|
|
"qhJ4bCgjwysuU7I33OUK03FXfSE9cpknQ8Q/sGW0UN8cwPCmhVVEjpiBOv1xk412x4X165E5InDxTjEqTf/",
|
|
"riK5K/jytHv/ZKgs0Z1nYNiF1D/txujXcNU8psUHu8xXNEC1+Vw4SAZyUbLQM+tTIZMtoexoafmdi/aO/28",
|
|
"a4rpqip3DNJlm6yybmupbSn3MzeeJ1gDMI4MdLcTcRa84pPxR1+AeLLz1ukDQyXH/p9JbPMP1Kn0NbkPn7O",
|
|
"YtDhZJopv/2naNkhjkivjzGV6JPwX2689C0v1IRVvaoovh5m+kJ8me0GJiPuI2zre/sXkZA0rdi+Qz06Ubk",
|
|
"fKY40DIgvrt4aS4w0zTvPzmjdcQV/RdgPWxjJYJu41KuLvJ9RKcbDarh5J2ls0qJ6yu/aWN6stbv5KmJydW",
|
|
"04CQgaFUPHEy/IO9+te4IHTthJSVBKMHlZGXqM6LFK/FeQ6AD9gPiCQFHbxUW4vZYhQalTuIkP6DaAmpYAo",
|
|
"6QpuzJrpneSFles81hjz6pTQ83jKvUym+E92iIZMIr+BcDWhsmU3M+3vsFH+lFk9/KqoFeIx5nGQNS3lrsC",
|
|
"IezrFTokSjJW3VlrLeV59+7lHH9M9QthE9SuAVs0OKSrJtLros5d8HAXYJW1D241yC8lgdQfHKM1Hpf/w94",
|
|
"vZo00PD5ObN5W+gWOQFmt7ZNCPctUOL2fBb8MeSovfKzAB2md1yPYfGRRWC+pNBlPoelgar1VCT03FFHYw0",
|
|
"LIDvKse3MCz3r/wttKwXzYu8wHY3KEaLmrvpGeQzYWrmqNVCa4TJOg4x/YM4n+7bciLB2Lsbv51jJei3aAC",
|
|
"YfB821OzqqiRkxBnH65mxA4W4CvuwGjVSw6kN0t/JLnUi1R7uhE9wOvIfU+TBLGsdE2NA2Jqv70xVckfx9X",
|
|
"z0a7QOVM2u/l7XrNV73qmNRfBNqWji8g7BoQu4b8ud3dqG6sR898ZRrvGqaU2aD2K11ksVXqZU4TGHDQRZj",
|
|
"zsyKqDseEqzYLCAHPSjZaBnw5s7Fd92nDxAH2pTznG1U5METbKyYokIFVoCYngvg012QSWDBDy/FvXFdMUV",
|
|
"O5Z5Jt5TJGkoqiKkdO88sge5JddvyN3OFIV+VOuZm98TrBGH8L56owCQSghHFipLmbiLW1wxyzeKhNDY2GC",
|
|
"NJo2tvwvDR2xanpHkiWn7dIGxguP6ctyV/aK+uHn2jdPspZfXqu2qMpC2q4wss+XiWvuhyU+owgMm6J2SzC",
|
|
"yTRTfvtP0fN7SkS/yIpp2dCLyQ05uh7oYvXezAp/ptAn4b/ceOlb4ZWfqB1LLOM1O57zKXOISASJ4OToQE3",
|
|
"wPMz0hfgy2w0NfoqSOQEetSfVSx+L8C7CFmc1CErD63ouIiFpWrF9hx+QX36bgrg/enSicj9SHGlLxtxl/m",
|
|
"HZ0XODyATuE08sQjG2Ey8gipRomneendG641koCYlc4n9bYW0d6EyQ6aZQ32P/jaMsHqul5vEEMaALmheY5",
|
|
"sUCZbOiUoyH1XDzTpPg8pAUQzb2uUszHaayBoGI+U0KZ4HDObC8WWt381XEgQ4nfLbAkHzk6tpwEhA0KtVY",
|
|
"pGfTI/GS7R2wBsNRZ2/cr84RAmKi1/YED5ywk5Kgx7Zxi3GgVxj/82XqYdLB5c5BG/2g4QRdCQZv93P32M4",
|
|
"4tBHgssQddgDxBYGitouLMUN7lmOFTjMb6Lob0XR+RCpaxAwQR7v8Eh/QbQA1LQEjra56wQbouUZJU3Zl1k",
|
|
"zvd/stYaTliVdPvjkAtJcfqn4MRxd1pNoSVKeGmsdV6mVlFfiNBmYv3V1Q7OwWFLkgbOKS+9cnfJiXmBf1X",
|
|
"rXwjaYqaeKfhjU1nm99g4/0o8iv3QOUTsdmcIV2whn8NlYHtMS8Dj0Fk7+MgahvLXcFQr0z1njsRMD62Ncr",
|
|
"dEiUZKzpZVVjiaehFNEgQQKZ1Tfp4JI/FVjm8lHKOf6Y6hfCJvuLgI8rJAeew86U7jtWkWPyfOr5+mVU2wA",
|
|
"AAAAAAAAASEfgaLc09/b7HVeJPU832bNat+GKe8Avnag5Sii4t4bV79kin4xAcGa1bsMV94BfLvKOq6LDd6",
|
|
"lRwuTMA1a2ORmFBKS0YkHPqt+zRT4ZgeDimFMtiS12Fsxq3YYr7gG/hC097pza9kk3d4oPFqE2Zn8wamehl",
|
|
"cGQooTJmQesbHPqwynxsJibhVmZnhA641uqEd5+eI3XrFw/LPDTLxTb9XdrELuYICwDxDGnWhJb7CyMdkcy",
|
|
"pW8b2vNGLVUE+tpKuwHNPbPOLbwIW3rcObXtk0AcmrSOgRplbu4UHyxCbcwmqfR3m3aaOpXzQ5YRDVoV3bS",
|
|
"j/qY5reNECZMzD1jZ5gxOc1u4bC4QvxTEujIX7j/3UyTShSMZydmhqnkn4G5gkeZKEZDUmZYivP3wGq9ZuW",
|
|
"r7HZitm65PFct3/wwOb99djJeXuzqYKe7WIHYxQVgGppHAHoZ1r/CIY061JLbYWcAkrt2Tgi+vc34ZPBn57",
|
|
"4A7OflUrs0YduaNWqoI9LWVrsq6wr/AQmMdkA0jNbuCTFXX7UuCj3W6eyVj4CBMAhMzYoOIl3j15YA4NGkd",
|
|
"AzXKyH/UAao3wjy3T75mC6IDrP8IXg68lvRaTFLp7zbtNHUEFQmHgdnDgyrnhywjGrQqYqBnRJQuQ9zR+tC",
|
|
"lHlWD85m9MM2pYXQF44GxP02Wa/mrxlFX+qKcDxic5rZw2VwgUNsG3sftq9Z+KYh1ZS7cfzZuaB3SGiuJhT",
|
|
"Tf/Fhh66bNcz+U71UcULJDVfNOwN3A+gS1m/n0KjZJXgJ6c4/qGQEZ4hLEux3vL+tsuWZ4akZnrIzR0Uyds",
|
|
"NT2OzBbN12fnLHbWOwDqmlBBXimSjoHiglCmM79DvB8uhgvL3d1MFPyX89HwEHHpdytQexigrAMlOqhhNW2",
|
|
"R/onsBZlX82H1W/39g3o+XAjEMecaklssbNYgHwC/lhGRevay+N0I4Zqo50ri8MXcZyNb6UgYdQGNcUoRUj",
|
|
"W4PHDdnLyqVybMew+NRLB66/GGqeIIgxCzrIf78/CZPX6RelclXWFf4GFxhTSle3ItXIwOiAbRmp2BZlyZ/",
|
|
"su3ULyb8E9TM9XOTJAiXqsp+ANxbb2SsbAQZgEJr4NJqj2rPPQDVeRSXzXM/9FEHEhy+PECWvi/4ppILOgI",
|
|
"6Uf4t4URFaQ/6gDVG+Eedi4SGvjW3OPBQzrlUVi3mxNSwv98lYpmv4RvBx4Lem1tlZcdM8ZHkOYpNLfbdpp",
|
|
"6tDjMrfa7p4cY7mFVlCVXjMr/mU+56GpxVTOD1lGNGhVHInvMfEAn6Ov01jQe3tfjOeUuLjMT6h6yWY2E26",
|
|
"M39OBIdZ72bgoJTJ7YZpTw+gKejyB8uT3H/ytkPQnyQoOxuXXFE9+PvkwVo2jrvRFOR8eykPGQ3HO6TA4zW",
|
|
"3hsrlAeH8tBVaGTrbLJZrk3P2OmYNieoxryXlv/FIQ68pcuP+0FfCDfWhPCQdPR2L3E48mTwinCkAneNBh+",
|
|
"imh4uQPeSm9yclV0PiPmud+KN+rOKDSoJ5AaJ/PVg8UPb7OpmK1R1Pd1nmSlUP0CWo38+lVbLxOil9E3aKa",
|
|
"krwE9OYe1TPa++ScUSoixWmhU33bUeLqIeazFWxlFRxe1tlyzfDUjBaRORp6xCN6pcuO+/C/41XtjG6TR4s",
|
|
"Uo8N+4DjlSGMKizkAUFJ8lPw4Y7ex2AdU03AkV9lvM6Ml6ZlnFMZS1yCh3od8cWYg1hKEMJ37HeD5WsPQ9U",
|
|
"wpFw90MV5e7upgpjx2vjZZ3pdQjywJ19OlV3/Ha+m/ZJGgibhbg9jFBGEZ8BxjsHIwlu9DRtRR+EtWwAsBN",
|
|
"DlPf6E2JfO6ku281p9ttFr6Woghad7u7RvQ8+FGlqkNc2fHFrBLHa6Nwf67UwNaTuV2ykylsAD5BPyxjIr4",
|
|
"RxlsS4V7fNa1l8fpRgzVnvJ3r15y+yMtqMBO1Ak7DGXvICZjPcz6Gt9KQcKoDWpSmKopdZz6nOHCHcj/5zq",
|
|
"zqYX9oEjTzUWHd3ML6hC67M8wk2NdJE0afGokgtdfjTU0LcTqYGt6w04RRRiEnGU/BlalcDOoksm1DBKRud",
|
|
"NS5v1L8vkO56UQ07l8Uqwk0rmb/pw6GxAlTyikK9uRa+VgYOPLsyZfEpYf06HUh8rTBleUQbww/iTw5M72X",
|
|
"bqF5N+siRY1DbETKYJ7mJ6vcmSAyjx49hhGk3Z5Zs8Xkj1TWTEhL38lCaSv7JWMgYMwCUyk0mzpNAT+uheI",
|
|
"2wi+fz6VX887YAlLyWNxPbXLq4i+yjl6VaMcvEk8iiDiQpbHiRPCZwIqIfN+5b1XaE2AZr919RCIJTdSSIN",
|
|
"GSj/EvSmIrA4N36wKHX9aIP9RB6jeCPNouLFvH+r/BdviBo6VkT8qk6Xm5iKlyNwKGNYri8S82UJfNkM88E",
|
|
"sv8QWBoraLiwC5QmHKAb989pew72GjfAtf3/cPCRRI/KlsrbjonjM8hiTqWIApB8twW9oy54iSCuATndKPP",
|
|
"6b9FqDHZW613T056ICFBgLpys/GcgutoCq9Zo4168UXHkqQPW9cJJ1lir91KLxMKlF9SaicH7KMaNCq4Nv/",
|
|
"2jtcJ1xTgUg7sSfncxvGqFMGExCFNTQm+KTQZyx9c8aQE+SQ2s4pcXGZn1D1hm6RGS6rpwP5Xvt+jz5mk7E",
|
|
"ZGxY4CpFlAkOs97JxUUpKBEyfBUWmvGT2wjSnhtEVLLEiXBCyJuOf65W9msnmzNesddUt/RE6AAAAAAAAAA",
|
|
"BdMxKlPcGwcbpmJEp7gmHj51U270ZD0ZIfXt/MpSIa8kJtzWmY46qDpTj7ht6gexH4C+kj42HLYFUvKcEYY",
|
|
"+3QCBw7ZCWiXaHvSQ2LY+GMM7J6Hy5eIDxCSnH2Db1B9yIXQuSogIBHU/AX0kfGw5bBrSTA4vsCJrDBzcXa",
|
|
"YuADlZz+139fIbPke6vhkBliYnYmmPM1JKPSB96TGhbHwhlng6AIs/oDqRZk9T5cvEB4hDnGLPmBgcj1lOL",
|
|
"sG3qD7kXJ0f6+R0JeNC6EyFEBAY+mc7fa9DzAP9eLvDPX36H0t9aPIXLiYETGMdoXnaQjlVRs6QU4meIlJe",
|
|
"kIHO2W5t4etDsOSKsnbm9Tbjin7WS//Q5dKgLQpQ+M9lbDITPExOyrZdGEDgV0nUww52tIRqUPEQP1znWHF",
|
|
"X68JzUsjoUzzuEUJ4mzRIO/BkERZvUHUi1bcgPDyMbiXKN56uArpyk8/kr4RRZmmU0ZH86qUCVI30Qs3A9t",
|
|
"5PiuKMXZN/QG3Yt19suSycdt+pKj/X2PhLxoz5Dv2LJFDBk3mwb7USTHeWqoFF5s5XcIjf0isSqmpprQzjA",
|
|
"UF2cW633q8PbsZTBbINniU9GkgCrHjNS8l+dRuJq/xhmqJuHJYrQvOklHKqk/hz2fdIaa2NjSC3AyxUtKhe",
|
|
"EZ1Q8E+zvSETjaLc29PY8iKn8QDA1MaHcckFZP3N41RA41a45sr81P5xaI76fPkHz1s7UuF753KcNc823GL",
|
|
"Coa0fnOrHZdhz4RGzWuUO3aDQO+CG/gnD1YNVFOLDEOYGsn9HPtgX+YYM7XkIxKH8VT3HKtTfpuIgbqnesO",
|
|
"K/x/Nfg41s+bjRPc/QBPLb6oTu/vpXLsDtmputlKNK/fS/SJy+8Jbm86DIIizOoPpFpRsTBp184UK7bkBoa",
|
|
"RjcW569cUI6xMdchG89TBV05TeBvAxmRqj+MJ/JXwiyzMMpuhpuIuEQ2C6lmtCw3ybEmKBJ4ZqM+t+fvjyy",
|
|
"9Hie4oab74PeK0L5gYOxkkN7srYyNmKjaShurTUoF/AH3AqQLA3EwS2P1osrEkR/v7Hgl50Xl06V4jyMmgn",
|
|
"iHfsWWLGDLDEs0UWEqoQ242DfajSI7zMwUfU56JPoLUUCm82MrvEIljOxnlC19hcWjSOgZqlAEsW8CfO6sk",
|
|
"cMsO9nB96PXilj3k1UApRZP61OHt2ctgtqfn80jkCtDHQLLFp6JJAVUdgdcCn4ixJOWKPiF86XpEuLkshEE",
|
|
"oyjVf7BprB2sbpwLfCM46qqvWr/vILMGojWbyyNqJ/Gk9FxWd7Ga6KuyFSK7+w4frXPSwpRfgZIqXlO2WBU",
|
|
"VZSyflCsMzqh8I9ndX8CEPIslGBqQjcLRbmnt7+RBiEWZbywoeRVT+IBgamEN2Rlsd2arpu32veP64YYnmT",
|
|
"r3dw3nR+AEbizKFOgBqXCiZl7j7sBvxDFl1Q/mWq6w/S9B+OCbaS2p9Pzh790gWWW+aBbpHOe5Shrnm24xZ",
|
|
"s2GUHNsaPChUNKLznVntugkHsFagmF3LZe61bjl6eO443afLBLvIn9+IkSRC+BkNgruDgX85qXx6sGqinFh",
|
|
"iHCeDeAehmdJtwNZO6OfaA/+d5VxN2huzjjDBnK8hGZU+bfKOChzYJU+Kp7jlWpv03deUqkBnWkSsL59DY4",
|
|
"Q7j8xyrFHGufo/vZX5Zyn/ue4vyMp1jMJ4Xl5NK2xZzXylZRAYfvzwvRUU901IE7b+xIaqflq2iz9091J1s",
|
|
"5VoXr+XD0ahMFWfD+boE5ffE9zedLUghXouHW4FGARFmNUfSLVFN1c96N74xKJiYdKunSlW/1Fzd5NcmScH",
|
|
"WppUcD1SR1ppiPFN/OI2vTy+Hgu/M6TgD6y7Nn6D1YzmqYOvnKbw0dW7JpJdFoE2gI3J1B7HE2uzn2zp33d",
|
|
"ik7h2Twq+vALOi2TqN38McyneUgVxPN3hdO1AoEz9bZDZyYBCt/9LIIT6kueKPvtRY6+kCMx9KsM+nLat8b",
|
|
"yassaXX44S3VHSm6RNKy8c4aN88XvEaV8wMSHCaWFUnoBAdjJIbnZXxkYrAVrLS5Z2N8xUbCQN1aelkWd+g",
|
|
"TAUF9RpbJei03XctDRfhQfutGzF0wqz6Kj3vVeOOaFNlTYNJiMdYa9uNCuWfi5zClP1m+eZe0XlFbZKdcRI",
|
|
"V0Aod/oEPEO+Y8sWMWRhcKzG9teBFYYlmimwlFCH2xaIjI1V4Pa3/420FLfF0+rMnxEpdnWiDZmp/m81pDB",
|
|
"QqrtbUvQUQaihUnixld8h9ZJA3YxUb1ASx3Yyyhe+wk/0ZJf31g6z4tCkdQzUKAO/47bQMRWYcli2gD93Vk",
|
|
"ngBYWSmkqX+ZH9jnu5qfYy8aC9aRyUN4KAR+hf89J0UxIa201W77XjY586VIPgsRhYwglGJt1wqCklXHDJm",
|
|
"zN5u3hvYmym8snKgGSLT0WTAqrdV5nqeFKy2zoCrwU+EWNJZzG9oAPQ0zjKFX1C+NL1iJcmb+fFE0X5cHNZ",
|
|
"CINQlGstQEutvpEkGtVLoo5d8O96iHiwK2AxXwtvLYbEJnKOmTIelGEbsz7oXveRWYJRG80DxIP8v5CrvOS",
|
|
"RtRP503ouuaKntsQSyl9BqU6VJ3MBPxyaXDAasrFO+89q31zxYNym/Hh6YTDQrQvYuJiaMvYdVuuqPafzRm",
|
|
"yxvpzS4bCX/uyNjnfccSePFIZnVD8Q7O9JtXXxAtFcnq7gQx5Eko0M89NRu3lTPX0AAAAAAAAAAF6RFQ9Ib",
|
|
"Nu/17G8RsP+b0uJIKlJi5K09K5jeY2G/d+W8PJsgs6RBCl50sXLRQOw3SdD0MQNb2tiN1RlQl7dZhlpxXBN",
|
|
"FrG9puDl2QSdIwlSvnTMC9VP0u2ZNxzP2CC5j8emCcCQTGIwToagiRve1sQQF7WGU7INe26oyoS8us0yMDn",
|
|
"fi/TWFo25GXbCf0SieeeIY803KHnGwMuzCTpHEqSeWqYGcivJGxd6D0/5uX3vSesaQLHVplBZ/K/G4merKw",
|
|
"dtusmqC3CUjk0TgCGZxGDQ3AaPafUf3/ef1ktkmnS9qQ7DRCz2rwIgLmoNp2Qb9n6/fwLvCMBJ3FCVCXl1m",
|
|
"2WCwYAGMRlA2gvhKU+6i/QuVXA8QPLnL5FyM+yE/4hE8yyi+Yu35J9MpYJQwjx2K7j7E0XNdBrwB+sE8Esn",
|
|
"qP18tZXlRG/EJsM8tUwN5FaSN2IkWQKsOkmIRWeJxqFVIuob9pzJ6Tn5VZLWNYBiq02hzEcgjyrHlh6y+F+",
|
|
"Nxc9WV+xpSoKNo43oZUnjywYxORw72PbETl3ioxybJgBDMonBQgozDwteUn7LKppGgMzmipW7j0nIoD01ha",
|
|
"w6z5sSME7bPS/A037r8VIdholY7F8FDIyThhCAhLorz0NCHe/v2HVeVk1VgzRn/H7/BN4RgJOi7+oLln1bL",
|
|
"LihKhPy6jbL5jA/HLqG7XRvEJZVMRRZgDGBg1p5eII/FsJTnnQX6V1IU0aRPHsy4sFz79i36YYWn+L61/+F",
|
|
"XamP9U9RrDdQ0tFkWl7kW4ttWETzF2/JP5kG1eYYJ6XkJiGWNtwqyo9Efwcj02KmVPv2J4qa6TTgD6i2n5W",
|
|
"hWDuw1gngl05Q+/mImPWYBjwgRgG4XNGNrpSyXylJ3sXCTw14apkayK0kbyb7jBWAwf/Qr9slXAtTSyTxSj",
|
|
"BTQz+Qm+FdhdUQjZ3gv8yQ2ljhRl827DmT03Pyq2h9LJybHykUTz78WJZwQnYRr+lX3hyZyZiPQB5Vji09x",
|
|
"h5VER3i9oJk8b8ai5+trjpgqhXD83YRs0ADXEhhwuXt0RZTAA0ZWsqSxpcNYnI4lAPTmEUOqYcdI3rRzpwd",
|
|
"c0Oyb96G8MbMU6XaWNVCy7cNNM9XnS4QCIQUZh4WvKT82oVzEV7Qf0P9xqPVU78UIaNXttob08+eKncfk5B",
|
|
"Be2p05gqc2C2g1QpZdZ43JWCcVMhgkX9JuyPd6MnY9NsP14N53Ne8t9RopDoME7HYvwr6qxkc+bRktXOLsF",
|
|
"VyJtBBLRqlWjpKC/49DRDcafgGhWOcBdMhlN066rysmqoGac60LbmV4mqycZNuaVHvBdkTzf98XqdpAqxE3",
|
|
"9UXLPu2WBpOwBhkl23nG9DCfrfztKJFQddx/59vHcxhfjh0DdvpkvBrNzxhAFa1s7vzMQ5rNOsirvx5YrCL",
|
|
"YgIHtfLwBH88kxK6upzfwCyEpzzpLtK7chWyM6FCCQT7NRt6KtC98KWkDnVivGZPgufesW/TDS3cdsu+J7/",
|
|
"WklVWYvesLWJmC8d3+ORBudl1eAj6C0l5kCvpHfVDJaIvosm0vMi3Ftv8WKGzgNvNZNsbcXeNtKYGhYpkeM",
|
|
"XYfbkMqs0xTkrJTVI72D4GJhLyQixtuFWUH4kcvXi3HfjENpWd0f6WanDCywzE8d4Gq33sTxQ102nAH7LeA",
|
|
"TqbBRugO/6ocxCXr1Rlb718WPt068eAV3fOhi/HmRFCeIbq9HgQMesxDXhAjE6g/j5FFJszaeMu+kh78FE3",
|
|
"cjv1ABcr7r5SkryLhZ8a4MOHs8PpRKXw1DI1kFtJ3q5FJzrYN5JhJ2WOc1OlJpV59Jt8G8n9Kl63S7gWppZ",
|
|
"IACZet17KTfeJBvf+1Vj5A9eX4vGdNCK8qSid83I84vX3uYj8OlA5Sn6ZIbWxwo2+IAg0uvmuVgEHS+R+9M",
|
|
"E9Y1na8XG8rebc0PpYODc/UiiOa003f1OJl558+LEs4YTswO3tvmSNX1NJzUT37x/rpxdcUfinczAYMB+BP",
|
|
"KocW3pujpQz4nCAxeeuPXpp4jQxuT8odSGO746jcehtRRmCaf3g/WINdVnWdMBUK4bn7SIqUUEkzos2nQ0S",
|
|
"keDD5F3/U4OE74uIhkDaoy2mABoytIQyOKlIdukLlCWNLxvE5HDKtJggU6g/z0OUMWnYOos7HQUkZpBWUIQ",
|
|
"6RvSinTk75mTX4a3VVeBZ7fdI5F7HVK2zZl3rFquPEs3ZIun5o09bk0g35rHPlOQaaJ6vOl0gEET5i6ByMf",
|
|
"uvY7pbZH9ekM09K05rNzJLcrQL5yK8oP+G6pryLfTMJDn6jUerp34pQqQcUqTvEvL9LTz77WSARglzre7iL",
|
|
"OydtlTuPiYhg/bUCn8rKWnvLWuDX4Jg4n2Zn93Ol2+qEUIgfyF9ZDxsGQwhsGhrdADCs6iQwSL/knZH9gHU",
|
|
"Lbf+rfjRQgTpupHGmo/TEeby/R0lBvO4r3lvqdFYYq2gMQNybkh1GCZisX8VFuQNKSrdpKqfxKRgoU8QXsF",
|
|
"VsW/pI8vh5hZhq+RMoIO4h3SkrCB7PDGn3e0nss/IbzbI4m/eFHcRibfggNbUPk8You/Iug+BxjgLpkMou3",
|
|
"WYqR6pC0Rgyr/qzm0GKwuo4XvbYk5H0BdoW3IrxdVk4zbKZySNub9cJt3Sot4Lsid4TMetlmdpmPFsbuQd9",
|
|
"d1sr/1761WZBtOIvqsvWPZtsdYvviAQmrYOXw8XaZsIAvoBngJm02TZRQAAAAAAAAAAdw3hKr0Wpj7uGsJV",
|
|
"ei1MfZkXI3/HO+pD3DWEq/RamPqrOGWBSUw+xDIvRv6Od9SHRSKn1DNhcrnT+J8PupPpwaT1fiUHhU//PeJ",
|
|
"dWsC+pbxK77xwfagDgg/NG6ROyXE7eMD6jvPf1wXh19nxNOQ9RpbaONuJ8pt4zWKoRycBCre6b0ltmhesiS",
|
|
"N4ahJdLEbKVHWLOOA64PQRVyzs01uSTWZazcZuTTRz/03uual23jCIQA+TFGB4Dh6aN0idkuN2aZfWYiCER",
|
|
"UjwgPUd57+vC4eNFDdaqQk1wq+z42nIe4y1olLJ1N7dsiy1cbYT5TfxW7iQnK7zkc/xVsfXHSTNWoZbJv2g",
|
|
"MmtkH0wFgmcJgSdoQeSo2h8nGS1jQ3zpflWgWm6iVlRo857DeYEpk1MZ3bR0YAMuRb/jIq5Y2Ke3JJtVo7n",
|
|
"yGqGCpcy0mo3dmmjmu7l7p2CMztj+m9xzU+28YYmWPVnu+xpfEIEeJinA8BxnjP8MlNZWIjw0b5A6JcftSz",
|
|
"mOuoczYdPSLq3FQAiLkKUjTO/9Hi2u4AHrO85/XxeXDAoRc2n5KQ4bKW60UhNqeRbIRAlEtVTvzPCfgLYuL",
|
|
"JjBEbU9oIgSAdYyyvqbYlF229PgR43EbzP5dDR07LbWRPSVHsn6EOjd47ZhDsH6q6ruV0uz11yV4q2OrztI",
|
|
"mrWVoG+Fhl48iwy3TPpBZdbIe7qt0PxzcPY+mAoEzxICT0mV6y5yBKRx0ILIUbU/TjKnjyl7CCnoDDFVEaC",
|
|
"B23N0RljwijzN1UrfT9P1+/Y/CahCMt9G4Jk37WCVC3WB646abXQhyJdNsAN6V14PrKfzdHe2dLK6Ac0vzy",
|
|
"boHEmQAljCx8KhXzY8wdXkvWZk3H+22AWX23J6QfP6okPoEwj4hPdDaVUFrsYd4GAWkj5EhWrtgTwvKOK7/",
|
|
"De556baecOLOljNG8zf/RIte7Lc9zW+ZSCamGHhk4AgAj1MUoDhOVcP3GbvlkcHzhj/GSitrUS5FR4zlbsL",
|
|
"ehP7SXgmbFfvZPaoUpt68dH94YstXEEbkorsagfhV72sz87N09I2zxW4wyz5byBpKyHUD4aoG4NoVtnurBU",
|
|
"NJVbAA9Z3nP++LrcON10h6RgQLhkUIubS8lNZFPUIW8RUbRw2UtxopSbUazuz9tWzgOryLJCJEohqqYUhca",
|
|
"OvnsyX3pnhPwFtXViplAAVvHv7ZjCDI2p7QBElR47CQMZWtxsCrGWU9TfFonWhhL5IIWOc7LanwY8aid+bu",
|
|
"0brMgwv4Q1hfjC7/rSZemyfGgboEqfje7xlwdP45JR2XU98xV7a0VT6m0+kLGOmWRux8rKKXT9OOM41iWAe",
|
|
"SEPZ5IifxiCvyIoHJLbtX9jFay2ZoEthQdJIUl6boSI236l4440HHHP9DqzQ7HWlBPDvhm3605ud58z5qsE",
|
|
"52OrqLdMX15/mfDAVCJ4lBJ4LPfQiIzOioJIq113kCEjj5Sc2d1ke7t2gBZGjan+cZNcIcInXaTpaTh9T9h",
|
|
"BS0Bk5ErLcrUR2J2KqIkADt+foFafDar6hQdaMsOAVeZqrlfu9AT/EjA2rvp+m6/ftfxLJkkfBSvvZLFCFZ",
|
|
"L6NwDNvJ4iFlDDWlVGxUr1PuSQOKcZfXGUEMqgXX0h/GsMJQlQoRZ4wfh/kam1nOeRNfpbTGmrYzvBoMO2D",
|
|
"ffuxN1ParvRwGpuKRXyQXp5N0DmSIAUpk6z6hISGO7CEj4VDv2x4x4lur/6pykaCq8l7zci4//WmKFFw3h7",
|
|
"BbLELLrfl9IIbvOoECvNSvI1m0t+DAcnE+msz9T4Xb/pjfBCK+SyFuRRx8aBEOiOHUVNWdHdbUT4mXrdeyk",
|
|
"33AL9JlCENdh1DyER1C7Bgu32T/OWXHpMqsuTxBL2jhYyMfeYnwmS+Zs8K68bo2ajA8U/JYTzqybJIOMSAF",
|
|
"lffFHah06NpkOT+NdbeQkMt8lgLQAR6mKQAw3M3CZuyGRZlTa4euM3eLY8O2RNZ52M7KTCcMf4zUFpbies8",
|
|
"HxntTP23cis8Zip3F/QFJt1Ml2Gxyk1lBKgf/nfqOmjlgqLo0dSjf8b9ZdM7l9RyJ9fYxZ2pkVCAA+uk7xD",
|
|
"mXWEpVrJJLn9KQlaRiaNtCEejfCyfBVOenZunpW2eK+mQeo0YezgVcIdZ8t9A0lYHirjYYlZ0aEKoHwxRNw",
|
|
"bRNaX+JuwhoO+sst1ZKxpKrNu/PHOWDOySgAes7zj/fV33Ck3FhenbY24dbrpC0jEgGRCPkP/Elx5cMihEz",
|
|
"KXlpys/yW5xs0OZsijqEbaIqdrFJQs7C54P5FP/M+CCbJScJPLSyj96MqK95fG1+EHY4croEJ9FV37fj8q3",
|
|
"S3Y2DGb4x1ZhyyCqWGHQdR4MG0AbFt2UNLEN5iW8M8N/Atq6sMs+IlW/zByOUikBKnj39s0lJOAAxeFQ82A",
|
|
"GR9T2gCJKFwum/kuWhHSOHIWBjK1uN/kRZKsxu8gJb8tccLhJU3EYxr1aBV/1T4HRniXCZB8M9tx/D39yuT",
|
|
"Kz/tjbTBPLi8TzOfHxBW21XeQajjY+h/Yq6fukiyghyHFRazgl27AHBlyKEpjNFjmfS6ltX/b8euhGSEfi4",
|
|
"FpErWTvk9GBKP3aaQ65bJeOw0N+LcarrGSANHPM7Ba6wr6iqfQ3n0hZxtWkFR0iXv/4TLM2YuVlFbs7vtdI",
|
|
"WHOzhX6ccJxrEsE8CZGRttYEZwKQhrLJET+NQeeLU+OsKSt/AAAAAAAAAADlUZmWzImUFsqjMi2ZEyktL/K",
|
|
"ru1WavTuUR2VaMidSWnEW/Mz+rsZMXuRXd6s0e3e7tc7hZ73vYSiPyrRkTqS0zd5TIqjHMKLiLPiZ/V2NmQ",
|
|
"d9YQ8x1BmPvMiv7lZp9u5ZmTZ4muBi+HZrncPPet/DkzoEVQPzS9U7jQIxmrqRXd7cm6dWMwVL8S4wHAOpu",
|
|
"HAUf6mKzyAsZq/KZ2uoncMHSpv+/WQUVxFlaVVGMY7qKoA4zND9B348EwLIhf70Nen2U1ETMn2h/9mh+qhn",
|
|
"5xzEPPBjPqtuiNKHRa3fzNNns2IUNEkAWvOlTeaf8lXATp6otwZkmUnaiHYaBWI0dSO7k0uc9Pj8t628uTd",
|
|
"PrWYKllnortlh756A4l1gOAZSceEHDPmuytvl9yj+UhWfQVjMza/Lg1PIzNpelc/WUDuHD7vEVkCcshMZlD",
|
|
"b9+8koriJxZ2RtBaE6NMrSqoxiHNVVL4MzGq6VQUMAcZih+w/8eOUgATc3hmhuTZcHU67Psuaoxp7FYkYm8",
|
|
"Ic0NX433JvLYmWs6PtVD93Z0GIJnOjgvDyB+59QYXSqE3NQJAX7yZH2IsmyyXJdh2UYzefKgRZSgElUcQYI",
|
|
"gkSvu//KU5I/f0rqZlyfG6tp8V+ovfimRAgUDjErNC/QHjv8mpBhtW0l3q0DBq08+TOHp52cO8yfQmL2BAr",
|
|
"3RQtUTQSvsaLftm+oVTYnblYieRPg+MYJ680Y9rFhUMViWQ7ZQ8rrkPjkNTwSU31ccXAjryhXKF+CO/ZKec",
|
|
"6+kwuv4GWLZQXGkRLbgNr8kwoYhs07bzJybaVprN4+q+ShLP268cwAX/S2QIEUnZnJOD/Ul7wqn62hdg4fW",
|
|
"XsGO23/mgl2ia2AOGUnMpPYNBb07LMkKG3695NRXEXNPGNhX9jIU+LOyNoKQnVoB59RTMbL4X6UpVUZxTiq",
|
|
"q3H0zI8JsT69XgZnNFwrg4a7V/6ikKIXkADiMEP3H/jx5bOp1TuWbOfKQQJubgzR3C8Qm/iihUXK8b2Y/g+",
|
|
"5vPkU7AFowzAo7zseqtOWqpXU3k8zRVojAcJl+v2kPZ7uo4CrZDLxF3q1r1nPiaSNx45KCFYfaARTmNkyUk",
|
|
"pr9xhNPGPL3Kd+jFsTkWBn8uQxYPbA+fE+baV2TXU3EFnQSheoJK6GlVneAYfWBT3Aw2M6YoecqwxK9yzKM",
|
|
"JrPlQMtpC9hA1lZirmyAJOo4gwQBInlwjF0wJmQn153/5WnJH/+uyZmA2ut6+iU1M24PjdW03GFVC7yvsLF",
|
|
"4r9Qe/FNiRAH7sntPcQdBigcYlZoXqA9zU37wKTXNCt2+DUhw2rbSpOprLcP409cvFsHDFp58mdZCp6alvB",
|
|
"mcQ5POzl3mD+F6x6ir7sRq5PE7AkU7osWqCG9kIIiAoK+mgheY0W/bd9/Wcf1iTb5yVCrbE7crETytfr12B",
|
|
"Al0OQmwPGNE9abMcORaBvfXw8n7GPDoIrFshwJMlo2RkwmCrKHlNch8clrV9YNQe14XX14JKb6uOLgRp11P",
|
|
"2x0a3RQNcI5CO0irtjQk6CeIas6zv9hCyV0MYf1GjCSs7i4E+OhhVxS3wX8gkTUxcQTjGiUayZuf0YW1a+O",
|
|
"d/fpip9BuR1N87yJbAps+BxqKkXlnnrX7sGREH8jQTK/WAfc9rdXiQqW5rtLWDZsWw9wd8LMIEOppMsiWHE",
|
|
"bpvg9Xe7R5Q14VT5bQ+0cPp0Ep82PZIgosvYMdtr+NRNXp5XgFnehBewSWwFxyk5kCUPCl71D2nImsWks6N",
|
|
"lnScPg8LokUPNfUNr07yejuIq1i2156yosnJp5xsK+sJGnfyhfVHI5BbHEnZG1FYTq0CHMCCPZDX7GDj6jm",
|
|
"IyXw/3rbzoOQB5X60PYPGrZV41jpoml/BXeGXWJew5HQESkTmwql9GMzTBY159ZMOtw3zkyzsCmJ/lLLx08",
|
|
"ax1yY/YU+G3yi77qYgJrV/bevRkp144Gb0hxkL3BofTE8yQKAPpEpV1l6IOU7P8Qk4SPPnuNGkEKEkO375s",
|
|
"1s6GpFi1SoNDiOD/apMa2ieimpUxUoMdsuT8zgN000UNLlIjVR4nqphoNHhnOHfwdr8P/fnPynfj+Wmmy+m",
|
|
"aL1wzx0udg27AyXWhEK+lPpqFnbBEoGgRzRDb1h+STkGVrxF48sQktXo6Vx6p9gLlINSAJSxo9VinQcZDd1",
|
|
"rTCP/+DO2aDLn8EGtKi8E+n6xKyZaSU1u4xmlc0PQIaZ6WMeMaWuU/9GLedlw8vg3SMoSYiwc7kyWPAw3NY",
|
|
"WChA99bsgfPjfdpK7QnQanWxU977mupuILKglS5/u/e2fikBOFBJXA0rs7wDtRjFm+c6KBUOrQt6gIfHdOv",
|
|
"8kuxMDlNixA45VxmU7lkhX6DB1R16T//yo8d4IYN8GqM6UbSoF2o1UZHq4TKqUdAACHwtuz5Ha7XGnUoG0S",
|
|
"aO5F8Lho9FMKEW9LDTFfgLREdtJh+cbB3XfWlzHG8nyDIs8OXQ5rPeHd5bXoV8DuX4j8LISfWa80M6DCkuS",
|
|
"HWSpmuVv+LB4YSJmT4Et1tcv2zIp5J70sipxH+h9uKbEiEhLjhgLhKGNw7ck9t7iDsM640KTbcBrxpQOMSs",
|
|
"0LxAe7VpXTocNdRtmpv2gUmvaVZ/ym8XhSb9QOzwa0KG1baVCaHy1EpcIoMmU1lvH8afuMMCwPnTTwuueLc",
|
|
"OGLTy5M+d5peOeHtw2bIUPDUt4c3iV0Wlo+FoWfQAAAAAAAAAAH+du6PRNu0K/jp3R6Nt2hWBp8zkcls3H/",
|
|
"x17o5G27Qrg+hVLZftWSECT5nJ5bZuPn3SImo0gIM0+OvcHY22aVeHdme+XICEXQbRq1ou27NCeUwQ+f/tX",
|
|
"kgEnjKTy23dfHsDiTAaWzB2+qRF1GgAB2mFOf53uTbqY/DXuTsabdOuj0oCmMtbPqQO7c58uQAJu3Fwdd9o",
|
|
"NuSxDKJXtVy2Z4VzP+wWjYCKj/KYIPL/272QjQWbUS7tUJoIPGUml9u6+Xeh3oVG7Vfz9gYSYTS2YOyJm6n",
|
|
"C5YCN5vRJi6jRAA7Si9QwCwA249gKc/zvcm3Ux3XuR0yjWznNizzkL2f8f2n0oV+MtsqSY3UGk2jEkaV8Cp",
|
|
"soyxWnSHZ3SQqhISfLQgjUsQLwESZIiXN95oJKEVf27sZFU3z8XXPXODLqShY+DEqDkTt8+zSN7U91SSfMK",
|
|
"/Jw9NaYESEhj6LWvKyRohXwP20ffadPH3GYofsP/HgADgUaWN7KlQp7610UfZGsxwR25resp0HNhdEqU978",
|
|
"dtL6TJHwD8qb2Iees5o7Shjs+AMIOep89eZ5pMTdmCfC+QY5f35JES/zgwCBCfAnxZD8nTqqIREomn069k5",
|
|
"TSh+FAqdN7YJ88o9/dW+HtvxxuwDo1CRnypyxgU8YwBWRq67+0qNjxKdGpBZ5yF/O+P/SaeRz/B/OEtjoQ7",
|
|
"8YbZUlx5feBLu8o8jN6gwm0YgjS/mVkZ1yWRWm8xQ2UZYrTpHsa6vqNfp4fObukhRCQ06WhZEPr+GSeHuPE",
|
|
"KhjBeAjTJBvNdimMRWhmhLn+swFlSKubXpBb9Sjz6Ts3Y2Lpvj4u5NANih3zhWx5q5xZNSVLHyZM8rHBaPB",
|
|
"dhiUBiN3+PZpZwm9gKbOG2Ma25/qkk6YV2VGJElDeHVd5OHorTEjQkKbfFMO4BWvSB5FrXlZI0UrYdgW2og",
|
|
"VqCHgf9o++k6fPp/iYZ0reHI04jBD9x/48QCdrfhUzs4cChwKNLC8lSsVY5ePE22jxh+dRSxwqQSAu+LYl9",
|
|
"N4Mm2xY39bNwppWq4c4uCU21+3pGEwwv7v3zSQHq15XT7p2ZqfCrW5TLLuheCXDhqdhAOPZa7wbSSy6ewaM",
|
|
"0vO9YQE5puUhyqH3zP55Ak8iVbp3vOZ2x7jYmldx+ZGpUCzX7DNZ+FppMEEh9IYfNIHEDJq2G2SlUuzaVMV",
|
|
"Eg8u6GJfvh+TqOIMEASJAOw1Wa/BMmQKked7xfWy5z7uesBmJIQKNG/dDIJW3z0rEEC3IYfp0CGVeUlWPt8",
|
|
"6Qurk8vXv6ddIa0M+EZ2y4FcU3oWyTIQNXWkMp9h4BI5pFpEce6kyY2OXNtCf22lUfOirazwKX7l2R2EH58",
|
|
"/XJpE4/LxEHuHLm7lbcKBsuvyExsbLA72MEY67FOlpiQySusSJUspYOn+wRS6eLiphSK86syWN+1elpb+K2",
|
|
"/pCYU/GwBdgWZNXosxBsKy94QyV0z4tFx4wOnjZQ/81dAS6++08Yo7X1YwW573FQjOn1yH4wlj5kHbhzPK3",
|
|
"tr7c1br1P8grBX8EjBg1SYzJm3bXLyo2EXI4p+HCIEvDUFKTYUEUNF7r8UJXrB61+ScVMAybAcpknLbhOnY",
|
|
"LT11iwVgMnGgwwNliiTpxYrFnFYb7YUZ9zvquJSpXq3ezKIxPHtcoQ8y1N+zP4cVJTRL7CL268lYyj0CrbI",
|
|
"wfXMxd48ioK1n4s8BYa3kdtPIyZ5SPC0aD7U36LyzacG7nMCgNRu7w7dNPtbblP8YA2c4SegFNnTfGsY/Bo",
|
|
"pyr2sw0tj/VJZ0wr0srhHb0q92lyoxIkobw6rq1EfMxV8YHsMjD0VtjRoSEt15q+LJwaY42+aYcwCtekUlk",
|
|
"Hb8RHbObPIpa87JGilZDF+FQY3BnXMKwLbQRK1BDvS2WF8AdvUnA/7R99J0+fb9iD94lq9N3PsXDOlfw5Gh",
|
|
"BWHiZhsYJYsRhhu4/8OMBu/w9Te7GDgs6W/GpnJ05FEXGSgpNq9QeOBRoYHkrVypHidPDqB26IMYuHyfaRo",
|
|
"0/ubOkhAtwYDVRGM+4AS/ZQy6FdBvQGTRJryK4/6JCA1bQvwNcc3TuXK1tITZH9G1o0vCalZbCgGJTV1Zx5",
|
|
"Jm3fSzK7dI1r1p3qfMTpYyZsBTWbqgGXa9dHlfJZOIv9GoBKFTfQf7ChwtVhv0rykIEPyobRogbdOk1q7yK",
|
|
"bGkv3irUITHPuBkzIKHPdoMbQgrt3lLNIMp05+df9QHEuC/Q+CBoumdpGT3yXbqYDV2ZvsYiJyOujK9TzKO",
|
|
"A70r+9GTT3B1U6S/CidlZJKqelvRjuia5ET1Hwo6wpx7d2TWZua/Yg2Z65K9UpaVRRBDQL9eR2sz/swEZOp",
|
|
"tbazNXc0INhCT2iPSidOCO2iQrl2bTpiqluZA0t+VLICQeXNDFvnw/W4PncxSIkTUmUcUZIAgSAVnMfrrxP",
|
|
"v8L2GuyXoNlyBSn9gn9UlMlHiLP94rrZc99XVJMKTpTInfc9YDNSAgVaKNoO26ZPvhi3roZBK2+e1ahJ6Kn",
|
|
"fIiWXCCAbkMO06FDXx3V4N/lTEkq85KsfL51hFVuKQ+tiJiO1Mnl69/Tr5GrVF5IDuVCm9aGfCI6ZcGvqRv",
|
|
"HgetTLKUovAtlmQgbulchsMZIPvaw0hhOsfEIHNOthfUSID7x2SwiOfZSZcbGU7+CVYNTK8wubaA/t9Oo+F",
|
|
"HwG5xm5UXy0FfXeBS+cu2vymzbxYif5wAAAAAAAAAAAPUEklguvLBreZ584nqhVWuMmu66VB3l1vI8+cT1Q",
|
|
"qvWBzhrnNv+G72LooUmj+P+vX6mF36hX07Hdu6q2s1cYseD6jiC4+DSrA9w1ji3/Tes+nREYJlBhxGE0lMe",
|
|
"OB7JEXHWwUYWonl6/Uwv/EK/nHoISL2kbAMsju3cVbWbucSOGNjH7bUFdOWUQilX4RiR5WFGuw/PpCFYH+C",
|
|
"scW77b1jq5D4pQEffM2Z+0JMUWjozk3pCyzrmikmbMv9vVuWmSW42bTd4WRYi4qyDjSxE8yIXqBHVAvhDn2",
|
|
"kOBqujpw2fnAqU840bvfQQkHpJ2QZY9OWU6BH3uuh3SC7zORGqvXe9KmFhPxYNHDGwj9trC+gcxLQdg0W3W",
|
|
"KG6Egr95OgWoU8WmKXKVKbKw4x2H55JQ8o2iORHsPXzsD7AWePc9t+wy8TLu/JKb9tHXiUBpleK27Jat1mI",
|
|
"6zpmzPygJym0dGY5+DJ/BwjEDbVi3MVTFSENQGZOnX2pkfml8qaMihN5+VD2NNSkr8mS3GzabvCyLJIpaEg",
|
|
"23g6cL1fOX0h/UdIvosrNEFHtYkQuUCOqBfCHRNtUsfIrTDc+0xwMVkdPGz4mGJ4OafOrVaqCcLQ97k5VX4",
|
|
"bi7BNS/ughIPWSsg2w6NQkZ8qcsQCDWL6JcMis5YOtuhso5hBVhQPLviAEjU+F9s8seCox/+56VcLCfiwa7",
|
|
"o9RUJpQkKpT8fdH5PHP5FME89W833NUOIhpOwaLbrE4fW2pXqXSAUJ1JRT6ydEtQoAhhqLnbZ0pDLtoGLNw",
|
|
"eCn5v/pAnczIlIcZ7T48k4aUch1/ZhIvNv/+h5HcRjLT/wuDA4RojmML7hfrlZ80iwsbE3nNsYg7YJeJl3f",
|
|
"lld5gYo0FL8spbt0cKxJRanYg3ekvgAlEypC2ZbVusxDXdbaQsfzrPmvFzJj5QU9SaOnMbf3TF3zUWafhZz",
|
|
"2tKMm8pxRjr/UGdQwaasW4i6cqQhqfwSrTiZbycRNbxGndixdx5l9WMfM3p/JL5U0ZFSfy8r7h30E7m0KZM",
|
|
"nsx+2+Gp5nHf6OjQToXJLnZtN3gZVkkTN0mhc7Z6U/AR8g/msQMTzVDWme0eLw1PQvnw9h7kDXID3Wb9scg",
|
|
"XkSVmyGi2sVesZEJeYxmdePPNx4HLTk74zozjF8DhYuItqli5VeYbohDrfC9eSTefKY5GKyOnjZ8Uz2K9KA",
|
|
"ihhffp2RO9D9jFyqj9hbag9OqVAXhaHvcnaqhAXMwVWAtwS2bnYoBfcjB2J8P0i/BeLvQ17J2Q8JUuyXTIC",
|
|
"5tfuTQqUnOlDljAdBcTVzMF9+xbSLrS7K2gP9t1+/Z6pg8TwZbdTdQzCGqBq5xpQjinRoKB5Z9QQganwryk",
|
|
"u8ZJqYvYX4IAaNyu8phiwyT+1wHetz1qoSF/Vg03ACuFt3T5IS3jDT4Z4f5Ybd5MGo/qUXRzXF415vFRv3N",
|
|
"hHxFw+v6TaYI5qt5v+eopv3iOSGRWxgbg0QuXzAEVht2QLwHHrjmcPraUr1KpQNwD97A5WQZs4TqSij0k6N",
|
|
"bhB9Ouqy9H+vvk9RUFukCDu9m0MZOx76+Uhh20TBm4fBS7XJDaEhdQDlh6K3SHEClOZTsP4oy/BVDnKSCLl",
|
|
"7/OUNpoBB2cEOJKOU6/swkXmwoED5slAri3JVumHvqq72SlZuc6bKFASL+FwYHCNEcx/7iApVQ/6B3fU+4j",
|
|
"ngZsCJ9urwcIDcMkhY2JvKaYxF3FsMiYMJNrcervYR3vOzyiatIgOXkwk45wMQaC16WU9zAMR6ZBrjvbLo5",
|
|
"ViSi1OxAusxStvr6UPDRQMhYQK5NFdG1zMoYgPGlbMtq3WYhrutsPm5PPg8SWwey9KGEWw++B0fwM9x1sw7",
|
|
"zomTbzYIJ5vNXYEmVrLVWmNv6py/4qLOYLv41d9YUAyVQWCIJd0tNJaVcsFFZ9/1OKcZe6w3qGE7cwsyzI1",
|
|
"aoNNSKcRdPVYQ0IY7jT2HpNF+tFA31NfTRX1gQn60bSGHiJraI07oXL+LTshqLlKufiV8o9DHAtnqJqixma",
|
|
"e4Kyo8EXcNhDJfQj/FZUTkiK2DkfcO/g3Y2heSIxy3bWIo1WfZhOqX51XtZA2Wo/ddpyzKP/0ZHg3QuMnr7",
|
|
"1B+tyJ5IcrNpu8HLskiHt/vj73cCIwstFVm7aucj/imHAZXWV56Aj5B/NIkZnnWLAicaNan1+RHsnU4oTPU",
|
|
"MFX7FYJT8AemBltSXLhQBHIUEjLmSpGqQH+o27Y9BamUbeG7DM/HXG71vEGJsv9fuuf1ITNAPvGIjE/IYze",
|
|
"q8lyeBqjZxWsafbzwOWnJ2xmprrlZ0zsat5vFA7CDTI60T9dK0Dm+TEG1TxcqvMN0QmFdXkoGMbXsUzbko1",
|
|
"ZGIe+HJK3D7LTj4THMwWB09bfi5d6IAM4HdkzXtTLpnnDiTwOne4kkgiC6+T8mc6H/GLktLW8TGw3ZFx9G1",
|
|
"fpLek0Uy1ScmvGIjPzqdmoLQYQ8/z5kI2v7dv1RDA+ZgqsBaVLYHdDiEfOrpyKFjRiUjpOk9pfEeC58UgrE",
|
|
"/H6RfgvGCRDuN/HE+QXahr2XthoSpdlSr97WoOBkd2DEZD/wl/B0tNYtX0plMoFOTnClzxgKgppcOcV16ss",
|
|
"sqDeDLCWdXy98JcpMn2+ex10HPN0vYy7EiRV1vZWR72q7fs9UxeZ7aW9shjR/FLmclfTbzvppgZ9B5pKuQJ",
|
|
"tAMXONKEcQ7NQyp59hJ6oeFAAAAAAAAAAB5iTUwyPBuf/ISa2CQ4d3+i5teUFgRs4GPtkGYc+ViyfY/dKi7",
|
|
"FQy2faQq+OMEvzcELR/IK/TRSHX+FGi07BymDHchWHwcctmH7H8IJA3BWP5lSjjs/a8n+khV8McJfm+DwWD",
|
|
"AD/kQEAhaPpBX6KORcdMLoJ8Yze6Bb76IO//gePjmi7jzD44Hc33V6KsePYYK9ODYY+5T+Q7Z/xBIGoKxd1",
|
|
"DKIIDq7M78y5Rw2PtfT4VCoUAQCzEw9JGq4I8T/N6NGJ/QR+OSoQaDwYAf8iEgfwr0sNcCT197J+t4/PaeF",
|
|
"wKu3kg0BvBoiTWAGGwXQ+nwvLUopOctlgLffBF3/sHxe1ZJIb8Or47wzRdx5x8cD4lEIkEv73JwjWk9iQQb",
|
|
"ozj04Ai5zOvNR397VumU+n7GBvJj2VwKELl3IWh5wxLdVw6oXUkL4rMohTMDGVPzAKn8ujYpmwNu1viXKeG",
|
|
"w97+egR4c0XgH0eEKhUKBIBZiYHMMd7Ho5gwfg7DCmUwBIYn6OfephPFP9nGiqfnc4Px3CCucyRQQkggMBo",
|
|
"MBP+RDQHWPtjH3FC0//hToYa8Fnr6Hnd1RZ/XwwfZO1vH47T0vj8fjwTAdU1AEXL2RaAzg0X3ViKGg/I6ue",
|
|
"fiXaYsIX+YAcaJZQ/gxmYvq/Akb6YIY8mPJOdMZ7GdvLW56vdpa1xakW0p1KjSonT8FGi07hynktjAq5cvp",
|
|
"VuCbL+LOPzgemRIa0gbPVmESiUSCXt7l4GsAcbKWLoufGtN6Egk2RnFjWk8iwcYoDujBEXKZ15uPkUgkQlE",
|
|
"n9fCVZTuKetMkuOzsDrqyI0rHZ3dQ6uoy+UYe/mXaIsKXOe5C0PKGJbqvl8vlwk7V1NAcULuSFsRnUWXZjq",
|
|
"LeNAkuYfSRavXA2GYYfaRaPTC2GZPm+gplIQWY6m/POq3Ra+ebvMSaMsmmCeI18ar6Och2aa6v+qIoe/cQJ",
|
|
"5rKatgViBQKhQJBLMTAbYOwMoncqr/mGO5i0c0ZPp+R21IZPXdBbfISa8okmyYUeydbAtT1WZ/geQtaxUbY",
|
|
"5mlMO5I1KKfiRFPzucH575vNZsNxMZeQEFY4kykgJBFp3w2j4dBKbhgMBgN+yIeAYYUzM7Y46f/qHm1j7il",
|
|
"afpOXWFMm2TQBl7pHmw0t5UnuM3Krxd2LNmWoLPudzDi3HCEZy1U8Vsjsnazj8dt7XpUUmdM5KxUhHo/Hg2",
|
|
"E6pqBnBvKzqcrI32Mr7XuCPhmXGqLYS0rOd+iROYYbEt/EaeiwsyvaL6oWmWO4i0U3Z/jg6o27jccJh2tx0",
|
|
"+vV1roGEvjm2x0m1HkW1fkTNtIFMW9czCP+ImtO5MeSc6Yz2M+dTqdDbsO2sLXJS6wpk2yazEB+nOFjAuVH",
|
|
"2yDMuXKxZD5SFfxxgt8bOn8KNFp2DlND9j8EkoZgLMhtYVTKl9OtseRUZAJnvdLAN1/EnX9wPLm+avRVjx5",
|
|
"DMiU0pA2ercJLrAGUxW7DvU+BHlzumhL1NggrbCZqfIq9k3U8fnvPC8QaQAy2i6F0NKb1JBJsjOJNL8AU2p",
|
|
"zinca0nkSCjVEcvz2rdEp9P2O7ELS8YYnuK8KZgYypeYBUSQLf3PFoM9Uwi+rsOZhdqkFY4UymgJBEONHUf",
|
|
"G5w/juzSoosNmFNusrDvxz+kSPFzu6g1NVl8o23Z5XkHZWc8jz8y7RFhC9zRXX+hI10QQy3Fje9Xm2ta86f",
|
|
"Ao2WncMURQRc3c6McJU8jWntBnwe6jigdiUtiM+iQSlDFeV4od3Ksh1FvWkSXLM7KHV1mXwjwugj1eqBsc2",
|
|
"7YRblInHfsjD6SLV6YGwzSXN9hbKQAkxNXmJNmWTTBDTXV31RlL17v0wJLQmFDvrGxTwdwXVghTZ5iTVlkk",
|
|
"0TT/C8Ba1iI2zEa+JV9XOQ7b3i12U9g/6Suc/IrRZ3L9rARv2d3odBpUvdo82GlvIkMlSW/U5mnFtDh51d0",
|
|
"X5RtToOqG0Zjj/KsZX2PUGfjEvIHMMNiW/iNMwx3MWimzN8tbjp9WprXQM+I7elMnrugkeqgpX6ioD92uQl",
|
|
"1pRJNk2jbRDmXLlYMij2TrYEqOuzUX97hsxYhcxVUmRO56xUhCzbUX4vXDr7p0APLndNiXreyToev73nBa8",
|
|
"aMb4gpSrr1pMEjuhVRJRdCFresET3FSSBb+54tJlqIKxwJlNASCJZJUUWm7AmXdK+G0bDoZXcqzcudgtR+6",
|
|
"Nbi5ter7bWNSICrm5nRrhKqZnwPj9XC8vQEMUO96dltNQ92sbcU7T8rbTv9hSj2oMmL7GmTLJpAl+mhJaEQ",
|
|
"gd9LnWPNhtaypNX/LoG06qk7Nxn5FaLuxdtpe7RZkNLeRKhw86uaL+oWthK+56gT8YlU9GlzvhedaQqWJD+",
|
|
"MK4b29g7Wcfjt/e8obJs9ytHmcMqKTKnc1YqQlOgB5e7pkQ9V40YX5BSlXUuBC1vWKL7CqWfcz8As0iL3BZ",
|
|
"GD8hDJvStxU2vV1vrGtRMeJ+fq4VlX9cmz8e6NuQmXhP/D0pYmyJzDDckvonTW/o5B+xO56zQYWdXtF9ULa",
|
|
"noUmd8rzpSWVTnT9hIF8Qg3dJ/ELh5u6tGjC9Iqco60s+5H4BZpEXW4qbXq611Da9rk+djXRtyJPDNtztMq",
|
|
"PNdefiH87zGjCyq8ydspAtiVSPGF6RUZR3euJhH/EXWnKcxrXc0tbjjoxyyvx9BaavalYeP17EH1FEO2d+P",
|
|
"oLRVKIfs70dQ2ioAQYCQwQILnAEgS1AAAAAAAAUAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
|
|
"AAAIAAAADAAAAEEtQAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAA",
|
|
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhIUAAAQZyRwQILFCRpb",
|
|
"nRBcnJheUZyb21TdHJpbmcAAEGwkcECC2Ioc2l6ZV90IGlkeCwgc2l6ZV90IHNpemUpPDo6PnsgdGhyb3cg",
|
|
"J0FycmF5IGluZGV4ICcgKyBpZHggKyAnIG91dCBvZiBib3VuZHM6IFswLCcgKyBzaXplICsgJyknOyB9AA=="
|
|
].join("");
|
|
|
|
function _base64ToArrayBuffer(base64) {
|
|
var binary_string = window.atob(base64);
|
|
var len = binary_string.length;
|
|
var bytes = new Uint8Array(len);
|
|
for (var i = 0; i < len; i++) {
|
|
bytes[i] = binary_string.charCodeAt(i);
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
function getBinary(file) {
|
|
if (typeof Buffer == "function"){
|
|
return Buffer.from(binaryInString, "base64");
|
|
}
|
|
else {
|
|
return _base64ToArrayBuffer(binaryInString);
|
|
}
|
|
}
|
|
|
|
function getBinaryPromise() {
|
|
// If we don't have the binary yet, try to to load it asynchronously.
|
|
// Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
|
|
// See https://github.com/github/fetch/pull/92#issuecomment-140665932
|
|
// Cordova or Electron apps are typically loaded from a file:// url.
|
|
// So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
|
|
// if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
|
|
// if (typeof fetch == 'function'
|
|
// && !isFileURI(wasmBinaryFile)
|
|
// ) {
|
|
// return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
|
|
// if (!response['ok']) {
|
|
// throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
|
|
// }
|
|
// return response['arrayBuffer']();
|
|
// }).catch(function () {
|
|
// return getBinary(wasmBinaryFile);
|
|
// });
|
|
// }
|
|
// else {
|
|
// if (readAsync) {
|
|
// // fetch is not available or url is file => try XHR (readAsync uses XHR internally)
|
|
// return new Promise(function(resolve, reject) {
|
|
// readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject)
|
|
// });
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// Otherwise, getBinary should be able to get it synchronously
|
|
return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); });
|
|
}
|
|
|
|
// Create the wasm instance.
|
|
// Receives the wasm imports, returns the exports.
|
|
function createWasm() {
|
|
// prepare imports
|
|
var info = {
|
|
'env': asmLibraryArg,
|
|
'wasi_snapshot_preview1': asmLibraryArg,
|
|
};
|
|
// Load the wasm module and create an instance of using native support in the JS engine.
|
|
// handle a generated wasm instance, receiving its exports and
|
|
// performing other necessary setup
|
|
/** @param {WebAssembly.Module=} module*/
|
|
function receiveInstance(instance, module) {
|
|
var exports = instance.exports;
|
|
|
|
Module['asm'] = exports;
|
|
|
|
wasmMemory = Module['asm']['memory'];
|
|
assert(wasmMemory, "memory not found in wasm exports");
|
|
// This assertion doesn't hold when emscripten is run in --post-link
|
|
// mode.
|
|
// TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
|
|
//assert(wasmMemory.buffer.byteLength === 16777216);
|
|
updateGlobalBufferAndViews(wasmMemory.buffer);
|
|
|
|
wasmTable = Module['asm']['__indirect_function_table'];
|
|
assert(wasmTable, "table not found in wasm exports");
|
|
|
|
addOnInit(Module['asm']['__wasm_call_ctors']);
|
|
|
|
removeRunDependency('wasm-instantiate');
|
|
|
|
}
|
|
// we can't run yet (except in a pthread, where we have a custom sync instantiator)
|
|
addRunDependency('wasm-instantiate');
|
|
|
|
// Prefer streaming instantiation if available.
|
|
// Async compilation can be confusing when an error on the page overwrites Module
|
|
// (for example, if the order of elements is wrong, and the one defining Module is
|
|
// later), so we save Module and check it later.
|
|
var trueModule = Module;
|
|
function receiveInstantiationResult(result) {
|
|
// 'result' is a ResultObject object which has both the module and instance.
|
|
// receiveInstance() will swap in the exports (to Module.asm) so they can be called
|
|
assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
|
|
trueModule = null;
|
|
// TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
|
|
// When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
|
|
receiveInstance(result['instance']);
|
|
}
|
|
|
|
function instantiateArrayBuffer(receiver) {
|
|
return getBinaryPromise().then(function(binary) {
|
|
return WebAssembly.instantiate(binary, info);
|
|
}).then(function (instance) {
|
|
return instance;
|
|
}).then(receiver, function(reason) {
|
|
err('failed to asynchronously prepare wasm: ' + reason);
|
|
|
|
// Warn on some common problems.
|
|
if (isFileURI(wasmBinaryFile)) {
|
|
err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing');
|
|
}
|
|
abort(reason);
|
|
});
|
|
}
|
|
|
|
function instantiateAsync() {
|
|
// if (!wasmBinary &&
|
|
// typeof WebAssembly.instantiateStreaming == 'function' &&
|
|
// !isDataURI(wasmBinaryFile) &&
|
|
// // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
|
|
// !isFileURI(wasmBinaryFile) &&
|
|
// // Avoid instantiateStreaming() on Node.js environment for now, as while
|
|
// // Node.js v18.1.0 implements it, it does not have a full fetch()
|
|
// // implementation yet.
|
|
// //
|
|
// // Reference:
|
|
// // https://github.com/emscripten-core/emscripten/pull/16917
|
|
// !ENVIRONMENT_IS_NODE &&
|
|
// typeof fetch == 'function') {
|
|
// return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
|
|
// // Suppress closure warning here since the upstream definition for
|
|
// // instantiateStreaming only allows Promise<Repsponse> rather than
|
|
// // an actual Response.
|
|
// // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed.
|
|
// /** @suppress {checkTypes} */
|
|
// var result = WebAssembly.instantiateStreaming(response, info);
|
|
|
|
// return result.then(
|
|
// receiveInstantiationResult,
|
|
// function(reason) {
|
|
// // We expect the most common failure cause to be a bad MIME type for the binary,
|
|
// // in which case falling back to ArrayBuffer instantiation should work.
|
|
// err('wasm streaming compile failed: ' + reason);
|
|
// err('falling back to ArrayBuffer instantiation');
|
|
// return instantiateArrayBuffer(receiveInstantiationResult);
|
|
// });
|
|
// });
|
|
// } else {
|
|
return instantiateArrayBuffer(receiveInstantiationResult);
|
|
//}
|
|
}
|
|
|
|
// User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
|
|
// to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
|
|
// to any other async startup actions they are performing.
|
|
// Also pthreads and wasm workers initialize the wasm instance through this path.
|
|
if (Module['instantiateWasm']) {
|
|
try {
|
|
var exports = Module['instantiateWasm'](info, receiveInstance);
|
|
return exports;
|
|
} catch(e) {
|
|
err('Module.instantiateWasm callback failed with error: ' + e);
|
|
// If instantiation fails, reject the module ready promise.
|
|
readyPromiseReject(e);
|
|
}
|
|
}
|
|
|
|
// If instantiation fails, reject the module ready promise.
|
|
instantiateAsync().catch(readyPromiseReject);
|
|
return {}; // no exports yet; we'll fill them in later
|
|
}
|
|
|
|
// Globals used by JS i64 conversions (see makeSetValue)
|
|
var tempDouble;
|
|
var tempI64;
|
|
|
|
// === Body ===
|
|
|
|
var ASM_CONSTS = {
|
|
|
|
};
|
|
function array_bounds_check_error(idx,size) { throw 'Array index ' + idx + ' out of bounds: [0,' + size + ')'; }
|
|
|
|
|
|
|
|
|
|
/** @constructor */
|
|
function ExitStatus(status) {
|
|
this.name = 'ExitStatus';
|
|
this.message = 'Program terminated with exit(' + status + ')';
|
|
this.status = status;
|
|
}
|
|
|
|
function callRuntimeCallbacks(callbacks) {
|
|
while (callbacks.length > 0) {
|
|
// Pass the module as the first argument.
|
|
callbacks.shift()(Module);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @param {number} ptr
|
|
* @param {string} type
|
|
*/
|
|
function getValue(ptr, type = 'i8') {
|
|
if (type.endsWith('*')) type = '*';
|
|
switch (type) {
|
|
case 'i1': return HEAP8[((ptr)>>0)];
|
|
case 'i8': return HEAP8[((ptr)>>0)];
|
|
case 'i16': return HEAP16[((ptr)>>1)];
|
|
case 'i32': return HEAP32[((ptr)>>2)];
|
|
case 'i64': return HEAP32[((ptr)>>2)];
|
|
case 'float': return HEAPF32[((ptr)>>2)];
|
|
case 'double': return HEAPF64[((ptr)>>3)];
|
|
case '*': return HEAPU32[((ptr)>>2)];
|
|
default: abort('invalid type for getValue: ' + type);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function ptrToString(ptr) {
|
|
return '0x' + ptr.toString(16).padStart(8, '0');
|
|
}
|
|
|
|
|
|
/**
|
|
* @param {number} ptr
|
|
* @param {number} value
|
|
* @param {string} type
|
|
*/
|
|
function setValue(ptr, value, type = 'i8') {
|
|
if (type.endsWith('*')) type = '*';
|
|
switch (type) {
|
|
case 'i1': HEAP8[((ptr)>>0)] = value; break;
|
|
case 'i8': HEAP8[((ptr)>>0)] = value; break;
|
|
case 'i16': HEAP16[((ptr)>>1)] = value; break;
|
|
case 'i32': HEAP32[((ptr)>>2)] = value; break;
|
|
case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break;
|
|
case 'float': HEAPF32[((ptr)>>2)] = value; break;
|
|
case 'double': HEAPF64[((ptr)>>3)] = value; break;
|
|
case '*': HEAPU32[((ptr)>>2)] = value; break;
|
|
default: abort('invalid type for setValue: ' + type);
|
|
}
|
|
}
|
|
|
|
function warnOnce(text) {
|
|
if (!warnOnce.shown) warnOnce.shown = {};
|
|
if (!warnOnce.shown[text]) {
|
|
warnOnce.shown[text] = 1;
|
|
if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text;
|
|
err(text);
|
|
}
|
|
}
|
|
|
|
function _abort() {
|
|
abort('native code called abort()');
|
|
}
|
|
|
|
function getHeapMax() {
|
|
// Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate
|
|
// full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side
|
|
// for any code that deals with heap sizes, which would require special
|
|
// casing all heap size related code to treat 0 specially.
|
|
return 2147483648;
|
|
}
|
|
|
|
function emscripten_realloc_buffer(size) {
|
|
try {
|
|
// round size grow request up to wasm page size (fixed 64KB per spec)
|
|
wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size
|
|
updateGlobalBufferAndViews(wasmMemory.buffer);
|
|
return 1 /*success*/;
|
|
} catch(e) {
|
|
err('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e);
|
|
}
|
|
// implicit 0 return to save code size (caller will cast "undefined" into 0
|
|
// anyhow)
|
|
}
|
|
function _emscripten_resize_heap(requestedSize) {
|
|
var oldSize = HEAPU8.length;
|
|
requestedSize = requestedSize >>> 0;
|
|
// With multithreaded builds, races can happen (another thread might increase the size
|
|
// in between), so return a failure, and let the caller retry.
|
|
assert(requestedSize > oldSize);
|
|
|
|
// Memory resize rules:
|
|
// 1. Always increase heap size to at least the requested size, rounded up
|
|
// to next page multiple.
|
|
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap
|
|
// geometrically: increase the heap size according to
|
|
// MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most
|
|
// overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).
|
|
// 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap
|
|
// linearly: increase the heap size by at least
|
|
// MEMORY_GROWTH_LINEAR_STEP bytes.
|
|
// 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by
|
|
// MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest
|
|
// 4. If we were unable to allocate as much memory, it may be due to
|
|
// over-eager decision to excessively reserve due to (3) above.
|
|
// Hence if an allocation fails, cut down on the amount of excess
|
|
// growth, in an attempt to succeed to perform a smaller allocation.
|
|
|
|
// A limit is set for how much we can grow. We should not exceed that
|
|
// (the wasm binary specifies it, so if we tried, we'd fail anyhow).
|
|
var maxHeapSize = getHeapMax();
|
|
if (requestedSize > maxHeapSize) {
|
|
err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + maxHeapSize + ' bytes!');
|
|
return false;
|
|
}
|
|
|
|
let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;
|
|
|
|
// Loop through potential heap size increases. If we attempt a too eager
|
|
// reservation that fails, cut down on the attempted size and reserve a
|
|
// smaller bump instead. (max 3 times, chosen somewhat arbitrarily)
|
|
for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
|
var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth
|
|
// but limit overreserving (default to capping at +96MB overgrowth at most)
|
|
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 );
|
|
|
|
var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));
|
|
|
|
var replacement = emscripten_realloc_buffer(newSize);
|
|
if (replacement) {
|
|
|
|
return true;
|
|
}
|
|
}
|
|
err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!');
|
|
return false;
|
|
}
|
|
|
|
var SYSCALLS = {varargs:undefined,get:function() {
|
|
assert(SYSCALLS.varargs != undefined);
|
|
SYSCALLS.varargs += 4;
|
|
var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
|
|
return ret;
|
|
},getStr:function(ptr) {
|
|
var ret = UTF8ToString(ptr);
|
|
return ret;
|
|
}};
|
|
function _fd_close(fd) {
|
|
abort('fd_close called without SYSCALLS_REQUIRE_FILESYSTEM');
|
|
}
|
|
|
|
function convertI32PairToI53Checked(lo, hi) {
|
|
assert(lo == (lo >>> 0) || lo == (lo|0)); // lo should either be a i32 or a u32
|
|
assert(hi === (hi|0)); // hi should be a i32
|
|
return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN;
|
|
}
|
|
function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
|
|
return 70;
|
|
}
|
|
|
|
var printCharBuffers = [null,[],[]];
|
|
function printChar(stream, curr) {
|
|
var buffer = printCharBuffers[stream];
|
|
assert(buffer);
|
|
if (curr === 0 || curr === 10) {
|
|
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
|
|
buffer.length = 0;
|
|
} else {
|
|
buffer.push(curr);
|
|
}
|
|
}
|
|
function flush_NO_FILESYSTEM() {
|
|
// flush anything remaining in the buffers during shutdown
|
|
_fflush(0);
|
|
if (printCharBuffers[1].length) printChar(1, 10);
|
|
if (printCharBuffers[2].length) printChar(2, 10);
|
|
}
|
|
function _fd_write(fd, iov, iovcnt, pnum) {
|
|
// hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
|
|
var num = 0;
|
|
for (var i = 0; i < iovcnt; i++) {
|
|
var ptr = HEAPU32[((iov)>>2)];
|
|
var len = HEAPU32[(((iov)+(4))>>2)];
|
|
iov += 8;
|
|
for (var j = 0; j < len; j++) {
|
|
printChar(fd, HEAPU8[ptr+j]);
|
|
}
|
|
num += len;
|
|
}
|
|
HEAPU32[((pnum)>>2)] = num;
|
|
return 0;
|
|
}
|
|
|
|
/** @type {function(string, boolean=, number=)} */
|
|
function intArrayFromString(stringy, dontAddNull, length) {
|
|
var len = length > 0 ? length : lengthBytesUTF8(stringy)+1;
|
|
var u8array = new Array(len);
|
|
var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
|
|
if (dontAddNull) u8array.length = numBytesWritten;
|
|
return u8array;
|
|
}
|
|
var ASSERTIONS = true;
|
|
|
|
function checkIncomingModuleAPI() {
|
|
ignoredModuleProp('fetchSettings');
|
|
}
|
|
var asmLibraryArg = {
|
|
"abort": _abort,
|
|
"array_bounds_check_error": array_bounds_check_error,
|
|
"emscripten_resize_heap": _emscripten_resize_heap,
|
|
"fd_close": _fd_close,
|
|
"fd_seek": _fd_seek,
|
|
"fd_write": _fd_write
|
|
};
|
|
var asm = createWasm();
|
|
/** @type {function(...*):?} */
|
|
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_bind_VoidPtr___destroy___0 = Module["_emscripten_bind_VoidPtr___destroy___0"] = createExportWrapper("emscripten_bind_VoidPtr___destroy___0");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_bind_Crc64Hash_Crc64Hash_0 = Module["_emscripten_bind_Crc64Hash_Crc64Hash_0"] = createExportWrapper("emscripten_bind_Crc64Hash_Crc64Hash_0");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_bind_Crc64Hash_OnAppend_2 = Module["_emscripten_bind_Crc64Hash_OnAppend_2"] = createExportWrapper("emscripten_bind_Crc64Hash_OnAppend_2");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_bind_Crc64Hash_OnFinal_3 = Module["_emscripten_bind_Crc64Hash_OnFinal_3"] = createExportWrapper("emscripten_bind_Crc64Hash_OnFinal_3");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_bind_Crc64Hash___destroy___0 = Module["_emscripten_bind_Crc64Hash___destroy___0"] = createExportWrapper("emscripten_bind_Crc64Hash___destroy___0");
|
|
|
|
/** @type {function(...*):?} */
|
|
var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _fflush = Module["_fflush"] = createExportWrapper("fflush");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _malloc = Module["_malloc"] = createExportWrapper("malloc");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _free = Module["_free"] = createExportWrapper("free");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() {
|
|
return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments);
|
|
};
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() {
|
|
return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments);
|
|
};
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function() {
|
|
return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments);
|
|
};
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() {
|
|
return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments);
|
|
};
|
|
|
|
/** @type {function(...*):?} */
|
|
var stackSave = Module["stackSave"] = createExportWrapper("stackSave");
|
|
|
|
/** @type {function(...*):?} */
|
|
var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore");
|
|
|
|
/** @type {function(...*):?} */
|
|
var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc");
|
|
|
|
/** @type {function(...*):?} */
|
|
var _emscripten_stack_get_current = Module["_emscripten_stack_get_current"] = function() {
|
|
return (_emscripten_stack_get_current = Module["_emscripten_stack_get_current"] = Module["asm"]["emscripten_stack_get_current"]).apply(null, arguments);
|
|
};
|
|
|
|
/** @type {function(...*):?} */
|
|
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");
|
|
|
|
var ___start_em_js = Module['___start_em_js'] = 5261488;
|
|
var ___stop_em_js = Module['___stop_em_js'] = 5261586;
|
|
|
|
|
|
|
|
// === Auto-generated postamble setup entry stuff ===
|
|
|
|
|
|
var unexportedRuntimeSymbols = [
|
|
'run',
|
|
'UTF8ArrayToString',
|
|
'UTF8ToString',
|
|
'stringToUTF8Array',
|
|
'stringToUTF8',
|
|
'lengthBytesUTF8',
|
|
'addOnPreRun',
|
|
'addOnInit',
|
|
'addOnPreMain',
|
|
'addOnExit',
|
|
'addOnPostRun',
|
|
'addRunDependency',
|
|
'removeRunDependency',
|
|
'FS_createFolder',
|
|
'FS_createPath',
|
|
'FS_createDataFile',
|
|
'FS_createPreloadedFile',
|
|
'FS_createLazyFile',
|
|
'FS_createLink',
|
|
'FS_createDevice',
|
|
'FS_unlink',
|
|
'getLEB',
|
|
'getFunctionTables',
|
|
'alignFunctionTables',
|
|
'registerFunctions',
|
|
'prettyPrint',
|
|
'getCompilerSetting',
|
|
'out',
|
|
'err',
|
|
'callMain',
|
|
'abort',
|
|
'keepRuntimeAlive',
|
|
'wasmMemory',
|
|
'stackAlloc',
|
|
'stackSave',
|
|
'stackRestore',
|
|
'getTempRet0',
|
|
'setTempRet0',
|
|
'writeStackCookie',
|
|
'checkStackCookie',
|
|
'ptrToString',
|
|
'zeroMemory',
|
|
'stringToNewUTF8',
|
|
'exitJS',
|
|
'getHeapMax',
|
|
'emscripten_realloc_buffer',
|
|
'ENV',
|
|
'ERRNO_CODES',
|
|
'ERRNO_MESSAGES',
|
|
'setErrNo',
|
|
'inetPton4',
|
|
'inetNtop4',
|
|
'inetPton6',
|
|
'inetNtop6',
|
|
'readSockaddr',
|
|
'writeSockaddr',
|
|
'DNS',
|
|
'getHostByName',
|
|
'Protocols',
|
|
'Sockets',
|
|
'getRandomDevice',
|
|
'warnOnce',
|
|
'traverseStack',
|
|
'UNWIND_CACHE',
|
|
'convertPCtoSourceLocation',
|
|
'readEmAsmArgsArray',
|
|
'readEmAsmArgs',
|
|
'runEmAsmFunction',
|
|
'runMainThreadEmAsm',
|
|
'jstoi_q',
|
|
'jstoi_s',
|
|
'getExecutableName',
|
|
'listenOnce',
|
|
'autoResumeAudioContext',
|
|
'dynCallLegacy',
|
|
'getDynCaller',
|
|
'dynCall',
|
|
'handleException',
|
|
'runtimeKeepalivePush',
|
|
'runtimeKeepalivePop',
|
|
'callUserCallback',
|
|
'maybeExit',
|
|
'safeSetTimeout',
|
|
'asmjsMangle',
|
|
'asyncLoad',
|
|
'alignMemory',
|
|
'mmapAlloc',
|
|
'writeI53ToI64',
|
|
'writeI53ToI64Clamped',
|
|
'writeI53ToI64Signaling',
|
|
'writeI53ToU64Clamped',
|
|
'writeI53ToU64Signaling',
|
|
'readI53FromI64',
|
|
'readI53FromU64',
|
|
'convertI32PairToI53',
|
|
'convertI32PairToI53Checked',
|
|
'convertU32PairToI53',
|
|
'getCFunc',
|
|
'ccall',
|
|
'cwrap',
|
|
'uleb128Encode',
|
|
'sigToWasmTypes',
|
|
'generateFuncType',
|
|
'convertJsFunctionToWasm',
|
|
'freeTableIndexes',
|
|
'functionsInTableMap',
|
|
'getEmptyTableSlot',
|
|
'updateTableMap',
|
|
'addFunction',
|
|
'removeFunction',
|
|
'reallyNegative',
|
|
'unSign',
|
|
'strLen',
|
|
'reSign',
|
|
'formatString',
|
|
'setValue',
|
|
'getValue',
|
|
'PATH',
|
|
'PATH_FS',
|
|
'intArrayFromString',
|
|
'intArrayToString',
|
|
'AsciiToString',
|
|
'stringToAscii',
|
|
'UTF16Decoder',
|
|
'UTF16ToString',
|
|
'stringToUTF16',
|
|
'lengthBytesUTF16',
|
|
'UTF32ToString',
|
|
'stringToUTF32',
|
|
'lengthBytesUTF32',
|
|
'allocateUTF8',
|
|
'allocateUTF8OnStack',
|
|
'writeStringToMemory',
|
|
'writeArrayToMemory',
|
|
'writeAsciiToMemory',
|
|
'SYSCALLS',
|
|
'getSocketFromFD',
|
|
'getSocketAddress',
|
|
'JSEvents',
|
|
'registerKeyEventCallback',
|
|
'specialHTMLTargets',
|
|
'maybeCStringToJsString',
|
|
'findEventTarget',
|
|
'findCanvasEventTarget',
|
|
'getBoundingClientRect',
|
|
'fillMouseEventData',
|
|
'registerMouseEventCallback',
|
|
'registerWheelEventCallback',
|
|
'registerUiEventCallback',
|
|
'registerFocusEventCallback',
|
|
'fillDeviceOrientationEventData',
|
|
'registerDeviceOrientationEventCallback',
|
|
'fillDeviceMotionEventData',
|
|
'registerDeviceMotionEventCallback',
|
|
'screenOrientation',
|
|
'fillOrientationChangeEventData',
|
|
'registerOrientationChangeEventCallback',
|
|
'fillFullscreenChangeEventData',
|
|
'registerFullscreenChangeEventCallback',
|
|
'JSEvents_requestFullscreen',
|
|
'JSEvents_resizeCanvasForFullscreen',
|
|
'registerRestoreOldStyle',
|
|
'hideEverythingExceptGivenElement',
|
|
'restoreHiddenElements',
|
|
'setLetterbox',
|
|
'currentFullscreenStrategy',
|
|
'restoreOldWindowedStyle',
|
|
'softFullscreenResizeWebGLRenderTarget',
|
|
'doRequestFullscreen',
|
|
'fillPointerlockChangeEventData',
|
|
'registerPointerlockChangeEventCallback',
|
|
'registerPointerlockErrorEventCallback',
|
|
'requestPointerLock',
|
|
'fillVisibilityChangeEventData',
|
|
'registerVisibilityChangeEventCallback',
|
|
'registerTouchEventCallback',
|
|
'fillGamepadEventData',
|
|
'registerGamepadEventCallback',
|
|
'registerBeforeUnloadEventCallback',
|
|
'fillBatteryEventData',
|
|
'battery',
|
|
'registerBatteryEventCallback',
|
|
'setCanvasElementSize',
|
|
'getCanvasElementSize',
|
|
'demangle',
|
|
'demangleAll',
|
|
'jsStackTrace',
|
|
'stackTrace',
|
|
'ExitStatus',
|
|
'getEnvStrings',
|
|
'checkWasiClock',
|
|
'flush_NO_FILESYSTEM',
|
|
'dlopenMissingError',
|
|
'createDyncallWrapper',
|
|
'setImmediateWrapped',
|
|
'clearImmediateWrapped',
|
|
'polyfillSetImmediate',
|
|
'uncaughtExceptionCount',
|
|
'exceptionLast',
|
|
'exceptionCaught',
|
|
'ExceptionInfo',
|
|
'exception_addRef',
|
|
'exception_decRef',
|
|
'Browser',
|
|
'setMainLoop',
|
|
'wget',
|
|
'FS',
|
|
'MEMFS',
|
|
'TTY',
|
|
'PIPEFS',
|
|
'SOCKFS',
|
|
'_setNetworkCallback',
|
|
'tempFixedLengthArray',
|
|
'miniTempWebGLFloatBuffers',
|
|
'heapObjectForWebGLType',
|
|
'heapAccessShiftForWebGLHeap',
|
|
'GL',
|
|
'emscriptenWebGLGet',
|
|
'computeUnpackAlignedImageSize',
|
|
'emscriptenWebGLGetTexPixelData',
|
|
'emscriptenWebGLGetUniform',
|
|
'webglGetUniformLocation',
|
|
'webglPrepareUniformLocationsBeforeFirstUse',
|
|
'webglGetLeftBracePos',
|
|
'emscriptenWebGLGetVertexAttrib',
|
|
'writeGLArray',
|
|
'AL',
|
|
'SDL_unicode',
|
|
'SDL_ttfContext',
|
|
'SDL_audio',
|
|
'SDL',
|
|
'SDL_gfx',
|
|
'GLUT',
|
|
'EGL',
|
|
'GLFW_Window',
|
|
'GLFW',
|
|
'GLEW',
|
|
'IDBStore',
|
|
'runAndAbortIfError',
|
|
'ALLOC_NORMAL',
|
|
'ALLOC_STACK',
|
|
'allocate',
|
|
];
|
|
unexportedRuntimeSymbols.forEach(unexportedRuntimeSymbol);
|
|
var missingLibrarySymbols = [
|
|
'zeroMemory',
|
|
'stringToNewUTF8',
|
|
'exitJS',
|
|
'setErrNo',
|
|
'inetPton4',
|
|
'inetNtop4',
|
|
'inetPton6',
|
|
'inetNtop6',
|
|
'readSockaddr',
|
|
'writeSockaddr',
|
|
'getHostByName',
|
|
'getRandomDevice',
|
|
'traverseStack',
|
|
'convertPCtoSourceLocation',
|
|
'readEmAsmArgs',
|
|
'runEmAsmFunction',
|
|
'runMainThreadEmAsm',
|
|
'jstoi_q',
|
|
'jstoi_s',
|
|
'getExecutableName',
|
|
'listenOnce',
|
|
'autoResumeAudioContext',
|
|
'dynCallLegacy',
|
|
'getDynCaller',
|
|
'dynCall',
|
|
'handleException',
|
|
'runtimeKeepalivePush',
|
|
'runtimeKeepalivePop',
|
|
'callUserCallback',
|
|
'maybeExit',
|
|
'safeSetTimeout',
|
|
'asmjsMangle',
|
|
'asyncLoad',
|
|
'alignMemory',
|
|
'mmapAlloc',
|
|
'writeI53ToI64',
|
|
'writeI53ToI64Clamped',
|
|
'writeI53ToI64Signaling',
|
|
'writeI53ToU64Clamped',
|
|
'writeI53ToU64Signaling',
|
|
'readI53FromI64',
|
|
'readI53FromU64',
|
|
'convertI32PairToI53',
|
|
'convertU32PairToI53',
|
|
'getCFunc',
|
|
'ccall',
|
|
'cwrap',
|
|
'uleb128Encode',
|
|
'sigToWasmTypes',
|
|
'generateFuncType',
|
|
'convertJsFunctionToWasm',
|
|
'getEmptyTableSlot',
|
|
'updateTableMap',
|
|
'addFunction',
|
|
'removeFunction',
|
|
'reallyNegative',
|
|
'unSign',
|
|
'strLen',
|
|
'reSign',
|
|
'formatString',
|
|
'intArrayToString',
|
|
'AsciiToString',
|
|
'stringToAscii',
|
|
'UTF16ToString',
|
|
'stringToUTF16',
|
|
'lengthBytesUTF16',
|
|
'UTF32ToString',
|
|
'stringToUTF32',
|
|
'lengthBytesUTF32',
|
|
'allocateUTF8',
|
|
'allocateUTF8OnStack',
|
|
'writeStringToMemory',
|
|
'writeArrayToMemory',
|
|
'writeAsciiToMemory',
|
|
'getSocketFromFD',
|
|
'getSocketAddress',
|
|
'registerKeyEventCallback',
|
|
'maybeCStringToJsString',
|
|
'findEventTarget',
|
|
'findCanvasEventTarget',
|
|
'getBoundingClientRect',
|
|
'fillMouseEventData',
|
|
'registerMouseEventCallback',
|
|
'registerWheelEventCallback',
|
|
'registerUiEventCallback',
|
|
'registerFocusEventCallback',
|
|
'fillDeviceOrientationEventData',
|
|
'registerDeviceOrientationEventCallback',
|
|
'fillDeviceMotionEventData',
|
|
'registerDeviceMotionEventCallback',
|
|
'screenOrientation',
|
|
'fillOrientationChangeEventData',
|
|
'registerOrientationChangeEventCallback',
|
|
'fillFullscreenChangeEventData',
|
|
'registerFullscreenChangeEventCallback',
|
|
'JSEvents_requestFullscreen',
|
|
'JSEvents_resizeCanvasForFullscreen',
|
|
'registerRestoreOldStyle',
|
|
'hideEverythingExceptGivenElement',
|
|
'restoreHiddenElements',
|
|
'setLetterbox',
|
|
'softFullscreenResizeWebGLRenderTarget',
|
|
'doRequestFullscreen',
|
|
'fillPointerlockChangeEventData',
|
|
'registerPointerlockChangeEventCallback',
|
|
'registerPointerlockErrorEventCallback',
|
|
'requestPointerLock',
|
|
'fillVisibilityChangeEventData',
|
|
'registerVisibilityChangeEventCallback',
|
|
'registerTouchEventCallback',
|
|
'fillGamepadEventData',
|
|
'registerGamepadEventCallback',
|
|
'registerBeforeUnloadEventCallback',
|
|
'fillBatteryEventData',
|
|
'battery',
|
|
'registerBatteryEventCallback',
|
|
'setCanvasElementSize',
|
|
'getCanvasElementSize',
|
|
'demangle',
|
|
'demangleAll',
|
|
'jsStackTrace',
|
|
'stackTrace',
|
|
'getEnvStrings',
|
|
'checkWasiClock',
|
|
'createDyncallWrapper',
|
|
'setImmediateWrapped',
|
|
'clearImmediateWrapped',
|
|
'polyfillSetImmediate',
|
|
'ExceptionInfo',
|
|
'exception_addRef',
|
|
'exception_decRef',
|
|
'setMainLoop',
|
|
'_setNetworkCallback',
|
|
'heapObjectForWebGLType',
|
|
'heapAccessShiftForWebGLHeap',
|
|
'emscriptenWebGLGet',
|
|
'computeUnpackAlignedImageSize',
|
|
'emscriptenWebGLGetTexPixelData',
|
|
'emscriptenWebGLGetUniform',
|
|
'webglGetUniformLocation',
|
|
'webglPrepareUniformLocationsBeforeFirstUse',
|
|
'webglGetLeftBracePos',
|
|
'emscriptenWebGLGetVertexAttrib',
|
|
'writeGLArray',
|
|
'SDL_unicode',
|
|
'SDL_ttfContext',
|
|
'SDL_audio',
|
|
'GLFW_Window',
|
|
'runAndAbortIfError',
|
|
'ALLOC_NORMAL',
|
|
'ALLOC_STACK',
|
|
'allocate',
|
|
];
|
|
missingLibrarySymbols.forEach(missingLibrarySymbol)
|
|
|
|
|
|
var calledRun;
|
|
|
|
dependenciesFulfilled = function runCaller() {
|
|
// If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
|
|
if (!calledRun) run();
|
|
if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
|
|
};
|
|
|
|
function stackCheckInit() {
|
|
// This is normally called automatically during __wasm_call_ctors but need to
|
|
// get these values before even running any of the ctors so we call it redundantly
|
|
// here.
|
|
_emscripten_stack_init();
|
|
// TODO(sbc): Move writeStackCookie to native to to avoid this.
|
|
writeStackCookie();
|
|
}
|
|
|
|
/** @type {function(Array=)} */
|
|
function run(args) {
|
|
args = args || arguments_;
|
|
|
|
if (runDependencies > 0) {
|
|
return;
|
|
}
|
|
|
|
stackCheckInit();
|
|
|
|
preRun();
|
|
|
|
// a preRun added a dependency, run will be called later
|
|
if (runDependencies > 0) {
|
|
return;
|
|
}
|
|
|
|
function doRun() {
|
|
// run may have just been called through dependencies being fulfilled just in this very frame,
|
|
// or while the async setStatus time below was happening
|
|
if (calledRun) return;
|
|
calledRun = true;
|
|
Module['calledRun'] = true;
|
|
|
|
if (ABORT) return;
|
|
|
|
initRuntime();
|
|
|
|
readyPromiseResolve(Module);
|
|
if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
|
|
|
|
assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]');
|
|
|
|
postRun();
|
|
}
|
|
|
|
if (Module['setStatus']) {
|
|
Module['setStatus']('Running...');
|
|
setTimeout(function() {
|
|
setTimeout(function() {
|
|
Module['setStatus']('');
|
|
}, 1);
|
|
doRun();
|
|
}, 1);
|
|
} else
|
|
{
|
|
doRun();
|
|
}
|
|
checkStackCookie();
|
|
}
|
|
|
|
function checkUnflushedContent() {
|
|
// Compiler settings do not allow exiting the runtime, so flushing
|
|
// the streams is not possible. but in ASSERTIONS mode we check
|
|
// if there was something to flush, and if so tell the user they
|
|
// should request that the runtime be exitable.
|
|
// Normally we would not even include flush() at all, but in ASSERTIONS
|
|
// builds we do so just for this check, and here we see if there is any
|
|
// content to flush, that is, we check if there would have been
|
|
// something a non-ASSERTIONS build would have not seen.
|
|
// How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
|
|
// mode (which has its own special function for this; otherwise, all
|
|
// the code is inside libc)
|
|
var oldOut = out;
|
|
var oldErr = err;
|
|
var has = false;
|
|
out = err = (x) => {
|
|
has = true;
|
|
}
|
|
try { // it doesn't matter if it fails
|
|
flush_NO_FILESYSTEM();
|
|
} catch(e) {}
|
|
out = oldOut;
|
|
err = oldErr;
|
|
if (has) {
|
|
warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.');
|
|
warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)');
|
|
}
|
|
}
|
|
|
|
if (Module['preInit']) {
|
|
if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
|
|
while (Module['preInit'].length > 0) {
|
|
Module['preInit'].pop()();
|
|
}
|
|
}
|
|
|
|
run();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Bindings utilities
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function WrapperObject() {
|
|
}
|
|
WrapperObject.prototype = Object.create(WrapperObject.prototype);
|
|
WrapperObject.prototype.constructor = WrapperObject;
|
|
WrapperObject.prototype.__class__ = WrapperObject;
|
|
WrapperObject.__cache__ = {};
|
|
Module['WrapperObject'] = WrapperObject;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant)
|
|
@param {*=} __class__ */
|
|
function getCache(__class__) {
|
|
return (__class__ || WrapperObject).__cache__;
|
|
}
|
|
Module['getCache'] = getCache;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant)
|
|
@param {*=} __class__ */
|
|
function wrapPointer(ptr, __class__) {
|
|
var cache = getCache(__class__);
|
|
var ret = cache[ptr];
|
|
if (ret) return ret;
|
|
ret = Object.create((__class__ || WrapperObject).prototype);
|
|
ret.ptr = ptr;
|
|
return cache[ptr] = ret;
|
|
}
|
|
Module['wrapPointer'] = wrapPointer;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function castObject(obj, __class__) {
|
|
return wrapPointer(obj.ptr, __class__);
|
|
}
|
|
Module['castObject'] = castObject;
|
|
|
|
Module['NULL'] = wrapPointer(0);
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function destroy(obj) {
|
|
if (!obj['__destroy__']) throw 'Error: Cannot destroy object. (Did you create it yourself?)';
|
|
obj['__destroy__']();
|
|
// Remove from cache, so the object can be GC'd and refs added onto it released
|
|
delete getCache(obj.__class__)[obj.ptr];
|
|
}
|
|
Module['destroy'] = destroy;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function compare(obj1, obj2) {
|
|
return obj1.ptr === obj2.ptr;
|
|
}
|
|
Module['compare'] = compare;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function getPointer(obj) {
|
|
return obj.ptr;
|
|
}
|
|
Module['getPointer'] = getPointer;
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function getClass(obj) {
|
|
return obj.__class__;
|
|
}
|
|
Module['getClass'] = getClass;
|
|
|
|
// Converts big (string or array) values into a C-style storage, in temporary space
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
var ensureCache = {
|
|
buffer: 0, // the main buffer of temporary storage
|
|
size: 0, // the size of buffer
|
|
pos: 0, // the next free offset in buffer
|
|
temps: [], // extra allocations
|
|
needed: 0, // the total size we need next time
|
|
|
|
prepare: function() {
|
|
if (ensureCache.needed) {
|
|
// clear the temps
|
|
for (var i = 0; i < ensureCache.temps.length; i++) {
|
|
Module['_free'](ensureCache.temps[i]);
|
|
}
|
|
ensureCache.temps.length = 0;
|
|
// prepare to allocate a bigger buffer
|
|
Module['_free'](ensureCache.buffer);
|
|
ensureCache.buffer = 0;
|
|
ensureCache.size += ensureCache.needed;
|
|
// clean up
|
|
ensureCache.needed = 0;
|
|
}
|
|
if (!ensureCache.buffer) { // happens first time, or when we need to grow
|
|
ensureCache.size += 128; // heuristic, avoid many small grow events
|
|
ensureCache.buffer = Module['_malloc'](ensureCache.size);
|
|
assert(ensureCache.buffer);
|
|
}
|
|
ensureCache.pos = 0;
|
|
},
|
|
alloc: function(array, view) {
|
|
assert(ensureCache.buffer);
|
|
var bytes = view.BYTES_PER_ELEMENT;
|
|
var len = array.length * bytes;
|
|
len = (len + 7) & -8; // keep things aligned to 8 byte boundaries
|
|
var ret;
|
|
if (ensureCache.pos + len >= ensureCache.size) {
|
|
// we failed to allocate in the buffer, ensureCache time around :(
|
|
assert(len > 0); // null terminator, at least
|
|
ensureCache.needed += len;
|
|
ret = Module['_malloc'](len);
|
|
ensureCache.temps.push(ret);
|
|
} else {
|
|
// we can allocate in the buffer
|
|
ret = ensureCache.buffer + ensureCache.pos;
|
|
ensureCache.pos += len;
|
|
}
|
|
return ret;
|
|
},
|
|
copy: function(array, view, offset) {
|
|
offset >>>= 0;
|
|
var bytes = view.BYTES_PER_ELEMENT;
|
|
switch (bytes) {
|
|
case 2: offset >>>= 1; break;
|
|
case 4: offset >>>= 2; break;
|
|
case 8: offset >>>= 3; break;
|
|
}
|
|
for (var i = 0; i < array.length; i++) {
|
|
view[offset + i] = array[i];
|
|
}
|
|
},
|
|
};
|
|
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureString(value) {
|
|
if (typeof value === 'string') {
|
|
var intArray = intArrayFromString(value);
|
|
var offset = ensureCache.alloc(intArray, HEAP8);
|
|
ensureCache.copy(intArray, HEAP8, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureInt8(value) {
|
|
if (typeof value === 'object') {
|
|
var offset = ensureCache.alloc(value, HEAP8);
|
|
ensureCache.copy(value, HEAP8, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureInt16(value) {
|
|
if (typeof value === 'object') {
|
|
var offset = ensureCache.alloc(value, HEAP16);
|
|
ensureCache.copy(value, HEAP16, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureInt32(value) {
|
|
if (typeof value === 'object') {
|
|
var offset = ensureCache.alloc(value, HEAP32);
|
|
ensureCache.copy(value, HEAP32, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureFloat32(value) {
|
|
if (typeof value === 'object') {
|
|
var offset = ensureCache.alloc(value, HEAPF32);
|
|
ensureCache.copy(value, HEAPF32, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
/** @suppress {duplicate} (TODO: avoid emitting this multiple times, it is redundant) */
|
|
function ensureFloat64(value) {
|
|
if (typeof value === 'object') {
|
|
var offset = ensureCache.alloc(value, HEAPF64);
|
|
ensureCache.copy(value, HEAPF64, offset);
|
|
return offset;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
|
|
// VoidPtr
|
|
/** @suppress {undefinedVars, duplicate} @this{Object} */function VoidPtr() { throw "cannot construct a VoidPtr, no constructor in IDL" }
|
|
VoidPtr.prototype = Object.create(WrapperObject.prototype);
|
|
VoidPtr.prototype.constructor = VoidPtr;
|
|
VoidPtr.prototype.__class__ = VoidPtr;
|
|
VoidPtr.__cache__ = {};
|
|
Module['VoidPtr'] = VoidPtr;
|
|
|
|
VoidPtr.prototype['__destroy__'] = VoidPtr.prototype.__destroy__ = /** @suppress {undefinedVars, duplicate} @this{Object} */function() {
|
|
var self = this.ptr;
|
|
_emscripten_bind_VoidPtr___destroy___0(self);
|
|
};
|
|
// Crc64Hash
|
|
/** @suppress {undefinedVars, duplicate} @this{Object} */function Crc64Hash() {
|
|
this.ptr = _emscripten_bind_Crc64Hash_Crc64Hash_0();
|
|
getCache(Crc64Hash)[this.ptr] = this;
|
|
};;
|
|
Crc64Hash.prototype = Object.create(WrapperObject.prototype);
|
|
Crc64Hash.prototype.constructor = Crc64Hash;
|
|
Crc64Hash.prototype.__class__ = Crc64Hash;
|
|
Crc64Hash.__cache__ = {};
|
|
Module['Crc64Hash'] = Crc64Hash;
|
|
|
|
Crc64Hash.prototype['OnAppend'] = Crc64Hash.prototype.OnAppend = /** @suppress {undefinedVars, duplicate} @this{Object} */function(data, length) {
|
|
var self = this.ptr;
|
|
if (data && typeof data === 'object') data = data.ptr;
|
|
if (length && typeof length === 'object') length = length.ptr;
|
|
_emscripten_bind_Crc64Hash_OnAppend_2(self, data, length);
|
|
};;
|
|
|
|
Crc64Hash.prototype['OnFinal'] = Crc64Hash.prototype.OnFinal = /** @suppress {undefinedVars, duplicate} @this{Object} */function(data, length, result) {
|
|
var self = this.ptr;
|
|
if (data && typeof data === 'object') data = data.ptr;
|
|
if (length && typeof length === 'object') length = length.ptr;
|
|
if (result && typeof result === 'object') result = result.ptr;
|
|
_emscripten_bind_Crc64Hash_OnFinal_3(self, data, length, result);
|
|
};;
|
|
|
|
Crc64Hash.prototype['__destroy__'] = Crc64Hash.prototype.__destroy__ = /** @suppress {undefinedVars, duplicate} @this{Object} */function() {
|
|
var self = this.ptr;
|
|
_emscripten_bind_Crc64Hash___destroy___0(self);
|
|
};
|
|
|
|
return NativeCRC64.ready
|
|
}
|
|
);
|
|
})();
|
|
// if (typeof exports === 'object' && typeof module === 'object')
|
|
// module.exports = NativeCRC64;
|
|
// else if (typeof define === 'function' && define['amd'])
|
|
// define([], function() { return NativeCRC64; });
|
|
// else if (typeof exports === 'object')
|
|
// exports["NativeCRC64"] = NativeCRC64;
|
|
|
|
// ESM-EXPORT-START (rewritten to `module.exports = NativeCRC64;` in dist/commonjs by copyJSFiles.cjs)
|
|
/* harmony default export */ const crc64 = (NativeCRC64);
|
|
// ESM-EXPORT-END
|
|
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StorageCRC64Calculator.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
// @ts-expect-error the crc64 js file is auto generated
|
|
|
|
/**
|
|
* Class used to calculator CRC64 checksum
|
|
*/
|
|
class StorageCRC64Calculator {
|
|
nativeCrc64Hash;
|
|
static nativeInstance;
|
|
constructor() {
|
|
this.nativeCrc64Hash = new StorageCRC64Calculator.nativeInstance.Crc64Hash();
|
|
}
|
|
static initPromise;
|
|
/**
|
|
* Initialize environment for CRC64 checksum calculator
|
|
*/
|
|
static async init() {
|
|
if (!this.initPromise) {
|
|
this.initPromise = crc64().then((instance) => {
|
|
this.nativeInstance = instance;
|
|
return;
|
|
});
|
|
}
|
|
return this.initPromise;
|
|
}
|
|
/**
|
|
* Append data for CRC64 checksum calculator
|
|
* @param body - content to be append
|
|
* @param length - length of the content
|
|
*/
|
|
append(body, length) {
|
|
const ptr = StorageCRC64Calculator.nativeInstance._malloc(length);
|
|
StorageCRC64Calculator.nativeInstance.HEAPU8.set(body, ptr);
|
|
this.nativeCrc64Hash.OnAppend(ptr, length);
|
|
StorageCRC64Calculator.nativeInstance._free(ptr);
|
|
}
|
|
/**
|
|
* Complete CRC64 checksum calculating and get the final result.
|
|
* @param body -
|
|
* @param length -
|
|
* @returns
|
|
*/
|
|
final(body, length) {
|
|
const ptr = StorageCRC64Calculator.nativeInstance._malloc(length);
|
|
StorageCRC64Calculator.nativeInstance.HEAPU8.set(body, ptr);
|
|
const result = StorageCRC64Calculator.nativeInstance._malloc(8);
|
|
this.nativeCrc64Hash.OnFinal(ptr, length, result);
|
|
StorageCRC64Calculator.nativeInstance._free(ptr);
|
|
const resultArray = new Uint8Array(8);
|
|
resultArray.set(StorageCRC64Calculator.nativeInstance.HEAPU8.subarray(result, result + 8));
|
|
StorageCRC64Calculator.nativeInstance._free(result);
|
|
return resultArray;
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageCRC64Calculator.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/streamHelpers.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Signals the end of a stream by pushing null.
|
|
* In Node.js, this is required to signal the end of a Readable stream.
|
|
* @internal
|
|
*/
|
|
function signalStreamEnd(pushData) {
|
|
pushData(null);
|
|
}
|
|
//# sourceMappingURL=streamHelpers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StructuredMessageEncoding.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
const MESSAGE_VERSION = 1;
|
|
const MESSAGE_HEADER_LENGTH = 13;
|
|
const SEGMENT_HEADER_LENGTH = 10;
|
|
const FOOTER_LENGTH = 8;
|
|
const MAX_SEGMENT_CONTENT_LENGTH = 4 * 1024 * 1024;
|
|
var SMRegion;
|
|
(function (SMRegion) {
|
|
SMRegion[SMRegion["StreamHeader"] = 0] = "StreamHeader";
|
|
SMRegion[SMRegion["StreamFooter"] = 1] = "StreamFooter";
|
|
SMRegion[SMRegion["SegmentHeader"] = 2] = "SegmentHeader";
|
|
SMRegion[SMRegion["SegmentFooter"] = 3] = "SegmentFooter";
|
|
SMRegion[SMRegion["SegmentContent"] = 4] = "SegmentContent";
|
|
SMRegion[SMRegion["Completed"] = 5] = "Completed";
|
|
})(SMRegion || (SMRegion = {}));
|
|
class StructuredMessageEncoding {
|
|
pushData;
|
|
contentLength;
|
|
messageLength;
|
|
constructor(pushData, contentLength) {
|
|
this.pushData = pushData;
|
|
this.contentLength = contentLength;
|
|
this.contentOffset = 0;
|
|
this.currentDataOffset = 0;
|
|
this.segmentsCount = Math.ceil(this.contentLength / MAX_SEGMENT_CONTENT_LENGTH);
|
|
this.messageLength =
|
|
this.contentLength +
|
|
MESSAGE_HEADER_LENGTH +
|
|
(SEGMENT_HEADER_LENGTH + FOOTER_LENGTH) * this.segmentsCount +
|
|
FOOTER_LENGTH;
|
|
this.messageHeaderBuffer = new Uint8Array(MESSAGE_HEADER_LENGTH);
|
|
this.segmentNumber = 0;
|
|
this.segmentContentLength = 0;
|
|
this.segmentContentOffset = 0;
|
|
this.state = SMRegion.StreamHeader;
|
|
this.segmentCrc64 = new StorageCRC64Calculator();
|
|
this.messageCrc64 = new StorageCRC64Calculator();
|
|
}
|
|
currentDataOffset;
|
|
contentOffset;
|
|
segmentsCount;
|
|
messageHeaderBuffer;
|
|
segmentNumber;
|
|
segmentContentLength;
|
|
segmentContentOffset;
|
|
segmentCrc64;
|
|
messageCrc64;
|
|
state;
|
|
sourceDataHandler = (data) => {
|
|
this.currentDataOffset = 0;
|
|
if (this.state === SMRegion.StreamHeader) {
|
|
this.handlingMessageHeader();
|
|
}
|
|
while (this.segmentNumber < this.segmentsCount) {
|
|
this.segmentContentLength = Math.min(MAX_SEGMENT_CONTENT_LENGTH, this.contentLength - this.contentOffset);
|
|
if (this.state === SMRegion.SegmentHeader) {
|
|
this.handlingSegmentHeader();
|
|
}
|
|
if (this.state === SMRegion.SegmentContent) {
|
|
this.handlingSegmentContent(data);
|
|
}
|
|
if (this.state === SMRegion.SegmentFooter) {
|
|
this.handlingSegmentFooter();
|
|
this.contentOffset += this.segmentContentLength;
|
|
}
|
|
if (this.currentDataOffset === data.length) {
|
|
break;
|
|
}
|
|
}
|
|
if (this.state === SMRegion.StreamFooter) {
|
|
this.handlingMessageFooter();
|
|
}
|
|
};
|
|
handlingMessageHeader() {
|
|
this.messageHeaderBuffer[0] = MESSAGE_VERSION;
|
|
this.fillInt64(this.messageHeaderBuffer, 1, this.messageLength); // content length
|
|
this.fillInt16(this.messageHeaderBuffer, 9, 1);
|
|
this.fillInt16(this.messageHeaderBuffer, 11, this.segmentsCount);
|
|
this.pushData(this.messageHeaderBuffer);
|
|
this.state = SMRegion.SegmentHeader;
|
|
}
|
|
handlingSegmentHeader() {
|
|
const segmentHeaderBuffer = new Uint8Array(SEGMENT_HEADER_LENGTH);
|
|
this.fillInt16(segmentHeaderBuffer, 0, this.segmentNumber + 1);
|
|
this.fillInt64(segmentHeaderBuffer, 2, this.segmentContentLength);
|
|
this.segmentContentOffset = 0;
|
|
this.pushData(segmentHeaderBuffer);
|
|
this.state = SMRegion.SegmentContent;
|
|
}
|
|
handlingSegmentContent(data) {
|
|
const length = Math.min(this.segmentContentLength - this.segmentContentOffset, data.length - this.currentDataOffset);
|
|
if (length !== 0) {
|
|
const current_content = Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length);
|
|
this.messageCrc64.append(current_content, length);
|
|
this.segmentCrc64.append(current_content, length);
|
|
this.pushData(current_content);
|
|
}
|
|
this.segmentContentOffset += length;
|
|
this.currentDataOffset += length;
|
|
if (this.segmentContentOffset === this.segmentContentLength) {
|
|
this.state = SMRegion.SegmentFooter;
|
|
}
|
|
}
|
|
handlingSegmentFooter() {
|
|
const crc64Result = this.segmentCrc64.final(new Uint8Array([]), 0);
|
|
this.pushData(crc64Result);
|
|
this.segmentCrc64 = new StorageCRC64Calculator();
|
|
++this.segmentNumber;
|
|
if (this.segmentNumber === this.segmentsCount) {
|
|
this.state = SMRegion.StreamFooter;
|
|
}
|
|
else {
|
|
this.state = SMRegion.SegmentHeader;
|
|
}
|
|
}
|
|
handlingMessageFooter() {
|
|
const crc64Result = this.messageCrc64.final(new Uint8Array([]), 0);
|
|
this.pushData(crc64Result);
|
|
signalStreamEnd(this.pushData);
|
|
this.state = SMRegion.Completed;
|
|
}
|
|
fillInt64(buffer, offset, input) {
|
|
if (buffer.length < offset + 8) {
|
|
throw new Error("Uint8Array length is not expected.");
|
|
}
|
|
const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 8);
|
|
view.setBigUint64(0, BigInt(input), true);
|
|
}
|
|
fillInt16(buffer, offset, input) {
|
|
if (buffer.length < offset + 2) {
|
|
throw new Error("Uint8Array length is not expected.");
|
|
}
|
|
const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 2);
|
|
view.setUint16(0, input, true);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StructuredMessageEncoding.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StructuredMessageEncodingStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
function StructuredMessageEncodingStream_isNodeReadableStream(source) {
|
|
return (source !== null &&
|
|
source instanceof external_node_stream_ &&
|
|
typeof source._read === "function" &&
|
|
typeof source._readableState === "object" &&
|
|
typeof source.pipe === "function");
|
|
}
|
|
/**
|
|
*
|
|
* To encode structured body for CRC64 content validtion in storage uploading.
|
|
* @param source -
|
|
* @param contentLength -
|
|
* @returns
|
|
*/
|
|
async function structuredMessageEncoding(source, contentLength) {
|
|
if (source === null) {
|
|
return {
|
|
body: source,
|
|
encodedContentLength: contentLength,
|
|
};
|
|
}
|
|
if (StructuredMessageEncodingStream_isNodeReadableStream(source)) {
|
|
const encodingMessage = new StructuredMessageEncodingStream(source, contentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
if (typeof source === "function") {
|
|
const encodingMessage = new StructuredMessageEncodingStream(source(), contentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
if (source instanceof Blob) {
|
|
const encoding = await BrowserStream(source, contentLength);
|
|
return {
|
|
body: encoding.content,
|
|
encodedContentLength: encoding.encodedContentLength,
|
|
};
|
|
}
|
|
if (typeof source === "string") {
|
|
const s = new external_node_stream_.Readable();
|
|
s._read = () => { };
|
|
s.push(source);
|
|
s.push(null);
|
|
const stringContentLength = Buffer.byteLength(source);
|
|
const encodingMessage = await new StructuredMessageEncodingStream(s, stringContentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
if (source instanceof ArrayBuffer) {
|
|
const stream = external_node_stream_.Readable.from(Buffer.from(source));
|
|
const encodingMessage = await new StructuredMessageEncodingStream(stream, contentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
if (source instanceof Buffer) {
|
|
const stream = external_node_stream_.Readable.from(source);
|
|
const encodingMessage = await new StructuredMessageEncodingStream(stream, contentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
if (ArrayBuffer.isView(source)) {
|
|
const stream = external_node_stream_.Readable.from(Buffer.from(source.buffer, source.byteOffset, source.byteLength));
|
|
const encodingMessage = await new StructuredMessageEncodingStream(stream, contentLength, {});
|
|
return {
|
|
body: encodingMessage,
|
|
encodedContentLength: encodingMessage.messageLength(),
|
|
};
|
|
}
|
|
throw new Error("The specified request body type is not supported for CRC64 checksum");
|
|
}
|
|
async function pump(reader, controller, encodingStream) {
|
|
const { done, value } = await reader.read();
|
|
// When no more data needs to be consumed, close the stream
|
|
if (done) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
// Enqueue the next data chunk into our target stream
|
|
encodingStream.sourceDataHandler(Buffer.from(value));
|
|
}
|
|
async function BrowserStream(source, contentLength) {
|
|
const sourceStream = source instanceof Blob ? source.stream() : source;
|
|
const reader = sourceStream.getReader();
|
|
let encodingStream = undefined;
|
|
const stream = new ReadableStream({
|
|
start(controller) {
|
|
encodingStream = new StructuredMessageEncoding((data) => {
|
|
controller.enqueue(data);
|
|
}, contentLength);
|
|
},
|
|
pull(controller) {
|
|
pump(reader, controller, encodingStream)
|
|
.then(() => {
|
|
return;
|
|
})
|
|
.catch(function (error) {
|
|
controller.error(error);
|
|
});
|
|
},
|
|
});
|
|
const response = new Response(stream);
|
|
return {
|
|
content: await response.blob(),
|
|
encodedContentLength: encodingStream.messageLength,
|
|
};
|
|
}
|
|
class StructuredMessageEncodingStream extends external_node_stream_.Readable {
|
|
source;
|
|
encodingMethods;
|
|
constructor(source, contentLength, options) {
|
|
super({ highWaterMark: options.highWaterMark });
|
|
this.source = source;
|
|
this.encodingMethods = new StructuredMessageEncoding((dataToHandle) => {
|
|
if (!this.push(dataToHandle)) {
|
|
source.pause();
|
|
}
|
|
}, contentLength);
|
|
this.setSourceEventHandlers();
|
|
}
|
|
messageLength() {
|
|
return this.encodingMethods.messageLength;
|
|
}
|
|
setSourceEventHandlers() {
|
|
this.source.on("data", this.sourceDataHandler);
|
|
this.source.on("end", this.sourceErrorOrEndHandler);
|
|
this.source.on("error", this.sourceErrorOrEndHandler);
|
|
// needed for Node14
|
|
this.source.on("aborted", this.sourceAbortedHandler);
|
|
}
|
|
removeSourceEventHandlers() {
|
|
this.source.removeListener("data", this.sourceDataHandler);
|
|
this.source.removeListener("end", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("error", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("aborted", this.sourceAbortedHandler);
|
|
}
|
|
sourceDataHandler = (data) => {
|
|
this.encodingMethods.sourceDataHandler(data);
|
|
};
|
|
sourceAbortedHandler = () => {
|
|
const abortError = new AbortError_AbortError("The operation was aborted.");
|
|
this.destroy(abortError);
|
|
};
|
|
sourceErrorOrEndHandler = (err) => {
|
|
if (err && err.name === "AbortError") {
|
|
this.destroy(err);
|
|
return;
|
|
}
|
|
// console.log(
|
|
// `Source stream emits end or error, offset: ${
|
|
// this.offset
|
|
// }, dest end : ${this.end}`
|
|
// );
|
|
this.removeSourceEventHandlers();
|
|
};
|
|
_read() {
|
|
this.source.resume();
|
|
}
|
|
_destroy(error, callback) {
|
|
// remove listener from source and release source
|
|
this.removeSourceEventHandlers();
|
|
this.source.destroy();
|
|
callback(error === null ? undefined : error);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StructuredMessageEncodingStream.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StructuredMessageDecoding.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
const StructuredMessageDecoding_MESSAGE_VERSION = 1;
|
|
const StructuredMessageDecoding_MESSAGE_HEADER_LENGTH = 13;
|
|
const StructuredMessageDecoding_SEGMENT_HEADER_LENGTH = 10;
|
|
const StructuredMessageDecoding_FOOTER_LENGTH = 8;
|
|
var StructuredMessageDecoding_SMRegion;
|
|
(function (SMRegion) {
|
|
SMRegion[SMRegion["StreamHeader"] = 0] = "StreamHeader";
|
|
SMRegion[SMRegion["StreamFooter"] = 1] = "StreamFooter";
|
|
SMRegion[SMRegion["SegmentHeader"] = 2] = "SegmentHeader";
|
|
SMRegion[SMRegion["SegmentFooter"] = 3] = "SegmentFooter";
|
|
SMRegion[SMRegion["SegmentContent"] = 4] = "SegmentContent";
|
|
})(StructuredMessageDecoding_SMRegion || (StructuredMessageDecoding_SMRegion = {}));
|
|
class StructuredMessageDecoding {
|
|
pushData;
|
|
segmentsCount;
|
|
// private currentState: SMRegion;
|
|
currentOffset;
|
|
currentDataOffset;
|
|
messageHeaderBuffer;
|
|
messageHeaderOffset;
|
|
segmentNumber;
|
|
segmentHeaderOffset;
|
|
segmentHeaderBuffer;
|
|
segmentContentOffset;
|
|
segmentContentLength;
|
|
segmentFooterOffset;
|
|
segmentFooterBuffer;
|
|
messageFooterOffset;
|
|
messageFooterBuffer;
|
|
segmentCrc64;
|
|
messageCrc64;
|
|
state;
|
|
constructor(pushData) {
|
|
this.pushData = pushData;
|
|
this.currentOffset = 0;
|
|
this.segmentsCount = 0;
|
|
this.messageHeaderOffset = 0;
|
|
this.messageHeaderBuffer = new Uint8Array(StructuredMessageDecoding_MESSAGE_HEADER_LENGTH);
|
|
this.currentDataOffset = 0;
|
|
this.segmentNumber = 0;
|
|
this.segmentHeaderOffset = 0;
|
|
this.segmentHeaderBuffer = new Uint8Array(StructuredMessageDecoding_SEGMENT_HEADER_LENGTH);
|
|
this.segmentContentOffset = 0;
|
|
this.segmentContentLength = 0;
|
|
this.state = StructuredMessageDecoding_SMRegion.StreamHeader;
|
|
this.segmentFooterOffset = 0;
|
|
this.segmentFooterBuffer = new Uint8Array(StructuredMessageDecoding_FOOTER_LENGTH);
|
|
this.messageFooterOffset = 0;
|
|
this.messageFooterBuffer = new Uint8Array(StructuredMessageDecoding_FOOTER_LENGTH);
|
|
this.segmentCrc64 = new StorageCRC64Calculator();
|
|
this.messageCrc64 = new StorageCRC64Calculator();
|
|
}
|
|
sourceDataHandler = (data) => {
|
|
this.currentDataOffset = 0;
|
|
if (this.state === StructuredMessageDecoding_SMRegion.StreamHeader) {
|
|
this.parseMessageHeader(data);
|
|
}
|
|
while (this.segmentNumber < this.segmentsCount && this.currentDataOffset < data.length) {
|
|
if (this.state === StructuredMessageDecoding_SMRegion.SegmentHeader) {
|
|
this.parseSegmentHeader(data);
|
|
}
|
|
if (this.state === StructuredMessageDecoding_SMRegion.SegmentContent) {
|
|
this.parseSegmentContent(data);
|
|
}
|
|
if (this.state === StructuredMessageDecoding_SMRegion.SegmentFooter) {
|
|
this.parseSegmentFooter(data);
|
|
}
|
|
}
|
|
if (this.state === StructuredMessageDecoding_SMRegion.StreamFooter) {
|
|
this.parseMessageFooter(data);
|
|
}
|
|
};
|
|
parseMessageHeader(data) {
|
|
const length = Math.min(StructuredMessageDecoding_MESSAGE_HEADER_LENGTH - this.messageHeaderOffset, data.length - this.currentDataOffset);
|
|
this.messageHeaderBuffer.set(Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length), this.messageHeaderOffset);
|
|
this.currentDataOffset += length;
|
|
this.messageHeaderOffset += length;
|
|
this.currentOffset += length;
|
|
if (this.messageHeaderOffset === StructuredMessageDecoding_MESSAGE_HEADER_LENGTH) {
|
|
const currentVersion = this.messageHeaderBuffer[0];
|
|
if (currentVersion !== StructuredMessageDecoding_MESSAGE_VERSION) {
|
|
throw new Error("Unexpected message version");
|
|
}
|
|
this.segmentsCount = this.toInt16(Uint8Array.prototype.slice.call(this.messageHeaderBuffer, 11, 13));
|
|
this.state = StructuredMessageDecoding_SMRegion.SegmentHeader;
|
|
}
|
|
}
|
|
parseSegmentHeader(data) {
|
|
const length = Math.min(StructuredMessageDecoding_SEGMENT_HEADER_LENGTH - this.segmentHeaderOffset, data.length - this.currentDataOffset);
|
|
this.segmentHeaderBuffer.set(Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length), this.segmentHeaderOffset);
|
|
this.currentDataOffset += length;
|
|
this.segmentHeaderOffset += length;
|
|
this.currentOffset += length;
|
|
if (this.segmentHeaderOffset === StructuredMessageDecoding_SEGMENT_HEADER_LENGTH) {
|
|
const currentSegmentNumber = this.toInt16(Uint8Array.prototype.slice.call(this.segmentHeaderBuffer, 0, 2));
|
|
if (currentSegmentNumber !== this.segmentNumber + 1) {
|
|
throw new Error("Segment number is unexpected.");
|
|
}
|
|
this.segmentContentLength = this.toInt64(this.segmentHeaderBuffer, 2);
|
|
this.segmentContentOffset = 0;
|
|
this.state = StructuredMessageDecoding_SMRegion.SegmentContent;
|
|
}
|
|
}
|
|
parseSegmentContent(data) {
|
|
const length = Math.min(this.segmentContentLength - this.segmentContentOffset, data.length - this.currentDataOffset);
|
|
const dataToHandle = Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length);
|
|
this.segmentCrc64.append(dataToHandle, length);
|
|
this.messageCrc64.append(dataToHandle, length);
|
|
this.pushData(dataToHandle);
|
|
this.currentDataOffset += length;
|
|
this.segmentContentOffset += length;
|
|
this.currentOffset += length;
|
|
if (this.segmentContentOffset === this.segmentContentLength) {
|
|
this.state = StructuredMessageDecoding_SMRegion.SegmentFooter;
|
|
}
|
|
}
|
|
parseSegmentFooter(data) {
|
|
const length = Math.min(StructuredMessageDecoding_FOOTER_LENGTH - this.segmentFooterOffset, data.length - this.currentDataOffset);
|
|
this.segmentFooterBuffer.set(Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length), this.segmentFooterOffset);
|
|
this.currentDataOffset += length;
|
|
this.segmentFooterOffset += length;
|
|
this.currentOffset += length;
|
|
if (this.segmentFooterOffset === StructuredMessageDecoding_FOOTER_LENGTH) {
|
|
const crc64Result = this.segmentCrc64.final(new Uint8Array([]), 0);
|
|
if (!this.checkCrc64CheckSum(crc64Result, this.segmentFooterBuffer)) {
|
|
throw new Error(`Segment check sum mismatch, segmentNumber: ${this.segmentNumber}`);
|
|
}
|
|
++this.segmentNumber;
|
|
if (this.segmentNumber === this.segmentsCount) {
|
|
this.state = StructuredMessageDecoding_SMRegion.StreamFooter;
|
|
}
|
|
else {
|
|
this.segmentHeaderOffset = 0;
|
|
this.segmentFooterOffset = 0;
|
|
this.segmentCrc64 = new StorageCRC64Calculator();
|
|
this.state = StructuredMessageDecoding_SMRegion.SegmentHeader;
|
|
}
|
|
}
|
|
}
|
|
parseMessageFooter(data) {
|
|
const length = Math.min(StructuredMessageDecoding_FOOTER_LENGTH - this.messageFooterOffset, data.length - this.currentDataOffset);
|
|
this.messageFooterBuffer.set(Uint8Array.prototype.slice.call(data, this.currentDataOffset, this.currentDataOffset + length), this.messageFooterOffset);
|
|
this.currentDataOffset += length;
|
|
this.messageFooterOffset += length;
|
|
this.currentOffset += length;
|
|
if (this.messageFooterOffset === StructuredMessageDecoding_FOOTER_LENGTH) {
|
|
const crc64Result = this.messageCrc64.final(new Uint8Array([]), 0);
|
|
if (!this.checkCrc64CheckSum(crc64Result, this.messageFooterBuffer)) {
|
|
throw new Error("Check sum mismatch");
|
|
}
|
|
this.pushData(null);
|
|
}
|
|
}
|
|
toInt64(input, offset) {
|
|
if (input.length < offset + 8) {
|
|
throw new Error("CRC64 buffer error, something wrong with crc64 calculator");
|
|
}
|
|
const view = new DataView(input.buffer, input.byteOffset + offset, 8);
|
|
return Number(view.getBigUint64(0, true));
|
|
}
|
|
toInt16(input) {
|
|
if (input.length !== 2) {
|
|
throw new Error("CRC64 buffer error, something wrong with crc64 calculator");
|
|
}
|
|
return input[0] + input[1] * 256;
|
|
}
|
|
checkCrc64CheckSum(first, second) {
|
|
if (first.length !== 8 || second.length !== 8) {
|
|
throw new Error("CRC64 buffer error, something wrong with crc64 calculator");
|
|
}
|
|
for (let index = 0; index < 8; ++index) {
|
|
if (first[index] !== second[index]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
//# sourceMappingURL=StructuredMessageDecoding.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StructuredMessageDecodingStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* To decode structured body for CRC64 content validtion in storage downloading.
|
|
* @param source -
|
|
*/
|
|
async function structuredMessageDecodingBrowser(source) {
|
|
/* eslint-disable no-unused-expressions */
|
|
source;
|
|
throw new Error("structuredMessageDecodingBrowser is only for Browser");
|
|
}
|
|
/**
|
|
* To decode structured body for CRC64 content validtion in storage downloading.
|
|
* @param source -
|
|
* @param options -
|
|
* @returns
|
|
*/
|
|
function structuredMessageDecodingStream(source, options) {
|
|
return new StructuredMessageDecodingStream(source, options);
|
|
}
|
|
class StructuredMessageDecodingStream extends external_node_stream_.Readable {
|
|
source;
|
|
decodingMethods;
|
|
constructor(source, options) {
|
|
super({ highWaterMark: options.highWaterMark });
|
|
this.source = source;
|
|
this.decodingMethods = new StructuredMessageDecoding((dataToHandle) => {
|
|
if (!this.push(dataToHandle)) {
|
|
source.pause();
|
|
}
|
|
});
|
|
this.setSourceEventHandlers();
|
|
}
|
|
_read() {
|
|
this.source.resume();
|
|
}
|
|
setSourceEventHandlers() {
|
|
this.source.on("data", this.sourceDataHandler);
|
|
this.source.on("end", this.sourceErrorOrEndHandler);
|
|
this.source.on("error", this.sourceErrorOrEndHandler);
|
|
// needed for Node14
|
|
this.source.on("aborted", this.sourceAbortedHandler);
|
|
}
|
|
removeSourceEventHandlers() {
|
|
this.source.removeListener("data", this.sourceDataHandler);
|
|
this.source.removeListener("end", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("error", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("aborted", this.sourceAbortedHandler);
|
|
}
|
|
sourceDataHandler = (data) => {
|
|
try {
|
|
this.decodingMethods.sourceDataHandler(data);
|
|
}
|
|
catch (err) {
|
|
this.destroy(err);
|
|
}
|
|
};
|
|
sourceAbortedHandler = () => {
|
|
const abortError = new AbortError_AbortError("The operation was aborted.");
|
|
this.destroy(abortError);
|
|
};
|
|
sourceErrorOrEndHandler = (err) => {
|
|
if (err) {
|
|
this.destroy(err);
|
|
return;
|
|
}
|
|
this.removeSourceEventHandlers();
|
|
};
|
|
_destroy(error, callback) {
|
|
// remove listener from source and release source
|
|
this.removeSourceEventHandlers();
|
|
this.source.destroy();
|
|
callback(error === null ? undefined : error);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StructuredMessageDecodingStream.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/cache.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
let _defaultHttpClient;
|
|
function cache_getCachedDefaultHttpClient() {
|
|
if (!_defaultHttpClient) {
|
|
_defaultHttpClient = esm_defaultHttpClient_createDefaultHttpClient();
|
|
}
|
|
return _defaultHttpClient;
|
|
}
|
|
//# sourceMappingURL=cache.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/RequestPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The base class from which all request policies derive.
|
|
*/
|
|
class BaseRequestPolicy {
|
|
_nextPolicy;
|
|
_options;
|
|
/**
|
|
* The main method to implement that manipulates a request/response.
|
|
*/
|
|
constructor(
|
|
/**
|
|
* The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
|
|
*/
|
|
_nextPolicy,
|
|
/**
|
|
* The options that can be passed to a given request policy.
|
|
*/
|
|
_options) {
|
|
this._nextPolicy = _nextPolicy;
|
|
this._options = _options;
|
|
}
|
|
/**
|
|
* Get whether or not a log with the provided log level should be logged.
|
|
* @param logLevel - The log level of the log that will be logged.
|
|
* @returns Whether or not a log with the provided log level should be logged.
|
|
*/
|
|
shouldLog(logLevel) {
|
|
return this._options.shouldLog(logLevel);
|
|
}
|
|
/**
|
|
* Attempt to log the provided message to the provided logger. If no logger was provided or if
|
|
* the log level does not meat the logger's threshold, then nothing will be logged.
|
|
* @param logLevel - The log level of this log.
|
|
* @param message - The message of this log.
|
|
*/
|
|
log(logLevel, message) {
|
|
this._options.log(logLevel, message);
|
|
}
|
|
}
|
|
//# sourceMappingURL=RequestPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageBrowserPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
|
|
*
|
|
* 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
|
|
* StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
|
|
* thus avoid the browser cache.
|
|
*
|
|
* 2. Remove cookie header for security
|
|
*
|
|
* 3. Remove content-length header to avoid browsers warning
|
|
*
|
|
* In Node.js, this policy is a no-op pass-through.
|
|
*/
|
|
class StorageBrowserPolicy extends BaseRequestPolicy {
|
|
/**
|
|
* Creates an instance of StorageBrowserPolicy.
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
// The base class has a protected constructor. Adding a public one to enable constructing of this class.
|
|
/* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
|
|
constructor(nextPolicy, options) {
|
|
super(nextPolicy, options);
|
|
}
|
|
/**
|
|
* Sends out request.
|
|
*
|
|
* @param request -
|
|
*/
|
|
async sendRequest(request) {
|
|
return this._nextPolicy.sendRequest(request);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageBrowserPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StorageBrowserPolicyFactory.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
|
|
*/
|
|
class StorageBrowserPolicyFactory {
|
|
/**
|
|
* Creates a StorageBrowserPolicyFactory object.
|
|
*
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
create(nextPolicy, options) {
|
|
return new StorageBrowserPolicy(nextPolicy, options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageBrowserPolicyFactory.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/CredentialPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Credential policy used to sign HTTP(S) requests before sending. This is an
|
|
* abstract class.
|
|
*/
|
|
class CredentialPolicy extends BaseRequestPolicy {
|
|
/**
|
|
* Sends out request.
|
|
*
|
|
* @param request -
|
|
*/
|
|
sendRequest(request) {
|
|
return this._nextPolicy.sendRequest(this.signRequest(request));
|
|
}
|
|
/**
|
|
* Child classes must implement this method with request signing. This method
|
|
* will be executed in {@link sendRequest}.
|
|
*
|
|
* @param request -
|
|
*/
|
|
signRequest(request) {
|
|
// Child classes must override this method with request signing. This method
|
|
// will be executed in sendRequest().
|
|
return request;
|
|
}
|
|
}
|
|
//# sourceMappingURL=CredentialPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/AnonymousCredentialPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
|
|
* or for use with Shared Access Signatures (SAS).
|
|
*/
|
|
class AnonymousCredentialPolicy extends CredentialPolicy {
|
|
/**
|
|
* Creates an instance of AnonymousCredentialPolicy.
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
// The base class has a protected constructor. Adding a public one to enable constructing of this class.
|
|
/* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
|
|
constructor(nextPolicy, options) {
|
|
super(nextPolicy, options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=AnonymousCredentialPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/credentials/Credential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Credential is an abstract class for Azure Storage HTTP requests signing. This
|
|
* class will host an credentialPolicyCreator factory which generates CredentialPolicy.
|
|
*/
|
|
class Credential {
|
|
/**
|
|
* Creates a RequestPolicy object.
|
|
*
|
|
* @param _nextPolicy -
|
|
* @param _options -
|
|
*/
|
|
create(_nextPolicy, _options) {
|
|
throw new Error("Method should be implemented in children classes.");
|
|
}
|
|
}
|
|
//# sourceMappingURL=Credential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/credentials/AnonymousCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* AnonymousCredential provides a credentialPolicyCreator member used to create
|
|
* AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
|
|
* HTTP(S) requests that read public resources or for use with Shared Access
|
|
* Signatures (SAS).
|
|
*/
|
|
class AnonymousCredential extends Credential {
|
|
/**
|
|
* Creates an {@link AnonymousCredentialPolicy} object.
|
|
*
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
create(nextPolicy, options) {
|
|
return new AnonymousCredentialPolicy(nextPolicy, options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=AnonymousCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/utils/constants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const utils_constants_SDK_VERSION = "12.4.0";
|
|
const constants_URLConstants = {
|
|
Parameters: {
|
|
FORCE_BROWSER_NO_CACHE: "_",
|
|
SIGNATURE: "sig",
|
|
SNAPSHOT: "snapshot",
|
|
VERSIONID: "versionid",
|
|
TIMEOUT: "timeout",
|
|
},
|
|
};
|
|
const constants_HeaderConstants = {
|
|
AUTHORIZATION: "Authorization",
|
|
AUTHORIZATION_SCHEME: "Bearer",
|
|
CONTENT_ENCODING: "Content-Encoding",
|
|
CONTENT_ID: "Content-ID",
|
|
CONTENT_LANGUAGE: "Content-Language",
|
|
CONTENT_LENGTH: "Content-Length",
|
|
CONTENT_MD5: "Content-Md5",
|
|
CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
|
|
CONTENT_TYPE: "Content-Type",
|
|
COOKIE: "Cookie",
|
|
DATE: "date",
|
|
IF_MATCH: "if-match",
|
|
IF_MODIFIED_SINCE: "if-modified-since",
|
|
IF_NONE_MATCH: "if-none-match",
|
|
IF_UNMODIFIED_SINCE: "if-unmodified-since",
|
|
PREFIX_FOR_STORAGE: "x-ms-",
|
|
RANGE: "Range",
|
|
USER_AGENT: "User-Agent",
|
|
X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
|
|
X_MS_COPY_SOURCE: "x-ms-copy-source",
|
|
X_MS_DATE: "x-ms-date",
|
|
X_MS_ERROR_CODE: "x-ms-error-code",
|
|
X_MS_VERSION: "x-ms-version",
|
|
X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
|
|
};
|
|
const constants_DevelopmentConnectionString = (/* unused pure expression or super */ null && (`DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`));
|
|
/// List of ports used for path style addressing.
|
|
/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
|
|
const constants_PathStylePorts = (/* unused pure expression or super */ null && ([
|
|
"10000",
|
|
"10001",
|
|
"10002",
|
|
"10003",
|
|
"10004",
|
|
"10100",
|
|
"10101",
|
|
"10102",
|
|
"10103",
|
|
"10104",
|
|
"11000",
|
|
"11001",
|
|
"11002",
|
|
"11003",
|
|
"11004",
|
|
"11100",
|
|
"11101",
|
|
"11102",
|
|
"11103",
|
|
"11104",
|
|
]));
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/utils/utils.common.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* Reserved URL characters must be properly escaped for Storage services like Blob or File.
|
|
*
|
|
* ## URL encode and escape strategy for JS SDKs
|
|
*
|
|
* When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
|
|
* But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
|
|
* string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
|
|
*
|
|
* ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
|
|
*
|
|
* This is what legacy V2 SDK does, simple and works for most of the cases.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b:",
|
|
* SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
|
|
* SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
|
|
*
|
|
* But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
|
|
* "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
|
|
* If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
|
|
* V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
|
|
* We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
|
|
*
|
|
* ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
|
|
*
|
|
* This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b:",
|
|
* SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
|
|
* There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
|
|
* There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
|
|
*
|
|
* This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
|
|
* is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
|
|
* If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
|
|
* And following URL strings are invalid:
|
|
* - "http://account.blob.core.windows.net/con/b%"
|
|
* - "http://account.blob.core.windows.net/con/b%2"
|
|
* - "http://account.blob.core.windows.net/con/b%G"
|
|
*
|
|
* Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
|
|
*
|
|
* ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
|
|
*
|
|
* We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
|
|
*
|
|
* @param url -
|
|
*/
|
|
function escapeURLPath(url) {
|
|
const urlParsed = new URL(url);
|
|
let path = urlParsed.pathname;
|
|
path = path || "/";
|
|
path = utils_common_escape(path);
|
|
urlParsed.pathname = path;
|
|
return urlParsed.toString();
|
|
}
|
|
function getProxyUriFromDevConnString(connectionString) {
|
|
// Development Connection String
|
|
// https://learn.microsoft.com/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
|
|
let proxyUri = "";
|
|
if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
|
|
// CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
|
|
const matchCredentials = connectionString.split(";");
|
|
for (const element of matchCredentials) {
|
|
if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
|
|
proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
|
|
}
|
|
}
|
|
}
|
|
return proxyUri;
|
|
}
|
|
function getValueInConnString(connectionString, argument) {
|
|
const elements = connectionString.split(";");
|
|
for (const element of elements) {
|
|
if (element.trim().startsWith(argument)) {
|
|
return element.trim().match(argument + "=(.*)")[1];
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
/**
|
|
* Extracts the parts of an Azure Storage account connection string.
|
|
*
|
|
* @param connectionString - Connection string.
|
|
* @returns String key value pairs of the storage account's url and credentials.
|
|
*/
|
|
function extractConnectionStringParts(connectionString) {
|
|
let proxyUri = "";
|
|
if (connectionString.startsWith("UseDevelopmentStorage=true")) {
|
|
// Development connection string
|
|
proxyUri = getProxyUriFromDevConnString(connectionString);
|
|
connectionString = DevelopmentConnectionString;
|
|
}
|
|
// Matching BlobEndpoint in the Account connection string
|
|
let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint");
|
|
// Slicing off '/' at the end if exists
|
|
// (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
|
|
blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
|
|
if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
|
|
connectionString.search("AccountKey=") !== -1) {
|
|
// Account connection string
|
|
let defaultEndpointsProtocol = "";
|
|
let accountName = "";
|
|
let accountKey = stringToUint8Array("accountKey", "base64");
|
|
let endpointSuffix = "";
|
|
// Get account name and key
|
|
accountName = getValueInConnString(connectionString, "AccountName");
|
|
accountKey = stringToUint8Array(getValueInConnString(connectionString, "AccountKey"), "base64");
|
|
if (!blobEndpoint) {
|
|
// BlobEndpoint is not present in the Account connection string
|
|
// Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
|
|
defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol");
|
|
const protocol = defaultEndpointsProtocol.toLowerCase();
|
|
if (protocol !== "https" && protocol !== "http") {
|
|
throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
|
|
}
|
|
endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix");
|
|
if (!endpointSuffix) {
|
|
throw new Error("Invalid EndpointSuffix in the provided Connection String");
|
|
}
|
|
blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
|
|
}
|
|
if (!accountName) {
|
|
throw new Error("Invalid AccountName in the provided Connection String");
|
|
}
|
|
else if (accountKey.length === 0) {
|
|
throw new Error("Invalid AccountKey in the provided Connection String");
|
|
}
|
|
return {
|
|
kind: "AccountConnString",
|
|
url: blobEndpoint,
|
|
accountName,
|
|
accountKey,
|
|
proxyUri,
|
|
};
|
|
}
|
|
else {
|
|
// SAS connection string
|
|
let accountSas = getValueInConnString(connectionString, "SharedAccessSignature");
|
|
let accountName = getValueInConnString(connectionString, "AccountName");
|
|
// if accountName is empty, try to read it from BlobEndpoint
|
|
if (!accountName) {
|
|
accountName = getAccountNameFromUrl(blobEndpoint);
|
|
}
|
|
if (!blobEndpoint) {
|
|
throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
|
|
}
|
|
else if (!accountSas) {
|
|
throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
|
|
}
|
|
// client constructors assume accountSas does *not* start with ?
|
|
if (accountSas.startsWith("?")) {
|
|
accountSas = accountSas.substring(1);
|
|
}
|
|
return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
|
|
}
|
|
}
|
|
/**
|
|
* Internal escape method implemented Strategy Two mentioned in escapeURL() description.
|
|
*
|
|
* @param text -
|
|
*/
|
|
function utils_common_escape(text) {
|
|
return encodeURIComponent(text)
|
|
.replace(/%2F/g, "/") // Don't escape for "/"
|
|
.replace(/'/g, "%27") // Escape for "'"
|
|
.replace(/\+/g, "%20")
|
|
.replace(/%25/g, "%"); // Revert encoded "%"
|
|
}
|
|
/**
|
|
* Append a string to URL path. Will remove duplicated "/" in front of the string
|
|
* when URL path ends with a "/".
|
|
*
|
|
* @param url - Source URL string
|
|
* @param name - String to be appended to URL
|
|
* @returns An updated URL string
|
|
*/
|
|
function appendToURLPath(url, name) {
|
|
const urlParsed = new URL(url);
|
|
let path = urlParsed.pathname;
|
|
path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
|
|
urlParsed.pathname = path;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Set URL parameter name and value. If name exists in URL parameters, old value
|
|
* will be replaced by name key. If not provide value, the parameter will be deleted.
|
|
*
|
|
* @param url - Source URL string
|
|
* @param name - Parameter name
|
|
* @param value - Parameter value
|
|
* @returns An updated URL string
|
|
*/
|
|
function setURLParameter(url, name, value) {
|
|
const urlParsed = new URL(url);
|
|
const encodedName = encodeURIComponent(name);
|
|
const encodedValue = value ? encodeURIComponent(value) : undefined;
|
|
// mutating searchParams will change the encoding, so we have to do this ourselves
|
|
const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
|
|
const searchPieces = [];
|
|
for (const pair of searchString.slice(1).split("&")) {
|
|
if (pair) {
|
|
const [key] = pair.split("=", 2);
|
|
if (key !== encodedName) {
|
|
searchPieces.push(pair);
|
|
}
|
|
}
|
|
}
|
|
if (encodedValue) {
|
|
searchPieces.push(`${encodedName}=${encodedValue}`);
|
|
}
|
|
urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Get URL parameter by name.
|
|
*
|
|
* @param url -
|
|
* @param name -
|
|
*/
|
|
function getURLParameter(url, name) {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.searchParams.get(name) ?? undefined;
|
|
}
|
|
/**
|
|
* Set URL host.
|
|
*
|
|
* @param url - Source URL string
|
|
* @param host - New host string
|
|
* @returns An updated URL string
|
|
*/
|
|
function setURLHost(url, host) {
|
|
const urlParsed = new URL(url);
|
|
urlParsed.hostname = host;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Get URL path from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function getURLPath(url) {
|
|
try {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.pathname;
|
|
}
|
|
catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
/**
|
|
* Get URL scheme from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function getURLScheme(url) {
|
|
try {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
|
|
}
|
|
catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
/**
|
|
* Get URL path and query from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function getURLPathAndQuery(url) {
|
|
const urlParsed = new URL(url);
|
|
const pathString = urlParsed.pathname;
|
|
if (!pathString) {
|
|
throw new RangeError("Invalid url without valid path.");
|
|
}
|
|
let queryString = urlParsed.search || "";
|
|
queryString = queryString.trim();
|
|
if (queryString !== "") {
|
|
queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
|
|
}
|
|
return `${pathString}${queryString}`;
|
|
}
|
|
/**
|
|
* Get URL query key value pairs from an URL string.
|
|
*
|
|
* @param url -
|
|
*/
|
|
function getURLQueries(url) {
|
|
let queryString = new URL(url).search;
|
|
if (!queryString) {
|
|
return {};
|
|
}
|
|
queryString = queryString.trim();
|
|
queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
|
|
let querySubStrings = queryString.split("&");
|
|
querySubStrings = querySubStrings.filter((value) => {
|
|
const indexOfEqual = value.indexOf("=");
|
|
const lastIndexOfEqual = value.lastIndexOf("=");
|
|
return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
|
|
});
|
|
const queries = {};
|
|
for (const querySubString of querySubStrings) {
|
|
const splitResults = querySubString.split("=");
|
|
const key = splitResults[0];
|
|
const value = splitResults[1];
|
|
queries[key] = value;
|
|
}
|
|
return queries;
|
|
}
|
|
/**
|
|
* Append a string to URL query.
|
|
*
|
|
* @param url - Source URL string.
|
|
* @param queryParts - String to be appended to the URL query.
|
|
* @returns An updated URL string.
|
|
*/
|
|
function appendToURLQuery(url, queryParts) {
|
|
const urlParsed = new URL(url);
|
|
let query = urlParsed.search;
|
|
if (query) {
|
|
query += "&" + queryParts;
|
|
}
|
|
else {
|
|
query = queryParts;
|
|
}
|
|
urlParsed.search = query;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Rounds a date off to seconds.
|
|
*
|
|
* @param date -
|
|
* @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
|
|
* If false, YYYY-MM-DDThh:mm:ssZ will be returned.
|
|
* @returns Date string in ISO8061 format, with or without 7 milliseconds component
|
|
*/
|
|
function truncatedISO8061Date(date, withMilliseconds = true) {
|
|
// Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
|
|
const dateString = date.toISOString();
|
|
return withMilliseconds
|
|
? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
|
|
: dateString.substring(0, dateString.length - 5) + "Z";
|
|
}
|
|
/**
|
|
* Generate a 64 bytes base64 block ID string.
|
|
*
|
|
* @param blockIndex -
|
|
*/
|
|
function generateBlockID(blockIDPrefix, blockIndex) {
|
|
// To generate a 64 bytes base64 string, source string should be 48
|
|
const maxSourceStringLength = 48;
|
|
// A blob can have a maximum of 100,000 uncommitted blocks at any given time
|
|
const maxBlockIndexLength = 6;
|
|
const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
|
|
if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
|
|
blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
|
|
}
|
|
const res = blockIDPrefix +
|
|
padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
|
|
return uint8ArrayToString(stringToUint8Array(res, "utf-8"), "base64");
|
|
}
|
|
/**
|
|
* Delay specified time interval.
|
|
*
|
|
* @param timeInMs -
|
|
* @param aborter -
|
|
* @param abortError -
|
|
*/
|
|
async function utils_common_delay(timeInMs, aborter, abortError) {
|
|
return new Promise((resolve, reject) => {
|
|
/* eslint-disable-next-line prefer-const */
|
|
let timeout;
|
|
const abortHandler = () => {
|
|
if (timeout !== undefined) {
|
|
clearTimeout(timeout);
|
|
}
|
|
reject(abortError);
|
|
};
|
|
const resolveHandler = () => {
|
|
if (aborter !== undefined) {
|
|
aborter.removeEventListener("abort", abortHandler);
|
|
}
|
|
resolve();
|
|
};
|
|
timeout = setTimeout(resolveHandler, timeInMs);
|
|
if (aborter !== undefined) {
|
|
aborter.addEventListener("abort", abortHandler);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* String.prototype.padStart()
|
|
*
|
|
* @param currentString -
|
|
* @param targetLength -
|
|
* @param padString -
|
|
*/
|
|
function padStart(currentString, targetLength, padString = " ") {
|
|
// @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
|
|
if (String.prototype.padStart) {
|
|
return currentString.padStart(targetLength, padString);
|
|
}
|
|
padString = padString || " ";
|
|
if (currentString.length > targetLength) {
|
|
return currentString;
|
|
}
|
|
else {
|
|
targetLength = targetLength - currentString.length;
|
|
if (targetLength > padString.length) {
|
|
padString += padString.repeat(targetLength / padString.length);
|
|
}
|
|
return padString.slice(0, targetLength) + currentString;
|
|
}
|
|
}
|
|
function sanitizeURL(url) {
|
|
let safeURL = url;
|
|
if (getURLParameter(safeURL, URLConstants.Parameters.SIGNATURE)) {
|
|
safeURL = setURLParameter(safeURL, URLConstants.Parameters.SIGNATURE, "*****");
|
|
}
|
|
return safeURL;
|
|
}
|
|
function sanitizeHeaders(originalHeader) {
|
|
const headers = createHttpHeaders();
|
|
for (const [name, value] of originalHeader) {
|
|
if (name.toLowerCase() === HeaderConstants.AUTHORIZATION.toLowerCase()) {
|
|
headers.set(name, "*****");
|
|
}
|
|
else if (name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) {
|
|
headers.set(name, sanitizeURL(value));
|
|
}
|
|
else {
|
|
headers.set(name, value);
|
|
}
|
|
}
|
|
return headers;
|
|
}
|
|
/**
|
|
* If two strings are equal when compared case insensitive.
|
|
*
|
|
* @param str1 -
|
|
* @param str2 -
|
|
*/
|
|
function iEqual(str1, str2) {
|
|
return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
|
|
}
|
|
/**
|
|
* Extracts account name from the url
|
|
* @param url - url to extract the account name from
|
|
* @returns with the account name
|
|
*/
|
|
function getAccountNameFromUrl(url) {
|
|
const parsedUrl = new URL(url);
|
|
let accountName;
|
|
try {
|
|
if (parsedUrl.hostname.split(".")[1] === "blob") {
|
|
// `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
|
|
accountName = parsedUrl.hostname.split(".")[0];
|
|
}
|
|
else if (isIpEndpointStyle(parsedUrl)) {
|
|
// IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
|
|
// Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
|
|
// .getPath() -> /devstoreaccount1/
|
|
accountName = parsedUrl.pathname.split("/")[1];
|
|
}
|
|
else {
|
|
// Custom domain case: "https://customdomain.com/containername/blob".
|
|
accountName = "";
|
|
}
|
|
return accountName;
|
|
}
|
|
catch (error) {
|
|
throw new Error("Unable to extract accountName with provided information.");
|
|
}
|
|
}
|
|
function isIpEndpointStyle(parsedUrl) {
|
|
const host = parsedUrl.host;
|
|
// Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
|
|
// Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
|
|
// Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
|
|
// For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
|
|
return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
|
|
(Boolean(parsedUrl.port) && PathStylePorts.includes(parsedUrl.port)));
|
|
}
|
|
/**
|
|
* Attach a TokenCredential to an object.
|
|
*
|
|
* @param thing -
|
|
* @param credential -
|
|
*/
|
|
function attachCredential(thing, credential) {
|
|
thing.credential = credential;
|
|
return thing;
|
|
}
|
|
function httpAuthorizationToString(httpAuthorization) {
|
|
return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
|
|
}
|
|
/**
|
|
* Escape the blobName but keep path separator ('/').
|
|
*/
|
|
function EscapePath(blobName) {
|
|
const split = blobName.split("/");
|
|
for (let i = 0; i < split.length; i++) {
|
|
split[i] = encodeURIComponent(split[i]);
|
|
}
|
|
return split.join("/");
|
|
}
|
|
/**
|
|
* A typesafe helper for ensuring that a given response object has
|
|
* the original _response attached.
|
|
* @param response - A response object from calling a client operation
|
|
* @returns The same object, but with known _response property
|
|
*/
|
|
function assertResponse(response) {
|
|
if (`_response` in response) {
|
|
return response;
|
|
}
|
|
throw new TypeError(`Unexpected response object ${response}`);
|
|
}
|
|
//# sourceMappingURL=utils.common.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/utils/SharedKeyComparator.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/*
|
|
* We need to imitate .Net culture-aware sorting, which is used in storage service.
|
|
* Below tables contain sort-keys for en-US culture.
|
|
*/
|
|
const table_lv0 = new Uint32Array([
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x71c, 0x0, 0x71f, 0x721,
|
|
0x723, 0x725, 0x0, 0x0, 0x0, 0x72d, 0x803, 0x0, 0x0, 0x733, 0x0, 0xd03, 0xd1a, 0xd1c, 0xd1e,
|
|
0xd20, 0xd22, 0xd24, 0xd26, 0xd28, 0xd2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe02, 0xe09, 0xe0a,
|
|
0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70, 0xe7c, 0xe7e, 0xe89,
|
|
0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x0, 0x0, 0x743, 0x744, 0x748,
|
|
0xe02, 0xe09, 0xe0a, 0xe1a, 0xe21, 0xe23, 0xe25, 0xe2c, 0xe32, 0xe35, 0xe36, 0xe48, 0xe51, 0xe70,
|
|
0xe7c, 0xe7e, 0xe89, 0xe8a, 0xe91, 0xe99, 0xe9f, 0xea2, 0xea4, 0xea6, 0xea7, 0xea9, 0x0, 0x74c,
|
|
0x0, 0x750, 0x0,
|
|
]);
|
|
const table_lv2 = new Uint32Array([
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
|
|
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
|
|
0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
]);
|
|
const table_lv4 = new Uint32Array([
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x8012, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8212, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
]);
|
|
function compareHeader(lhs, rhs) {
|
|
if (isLessThan(lhs, rhs))
|
|
return -1;
|
|
return 1;
|
|
}
|
|
function isLessThan(lhs, rhs) {
|
|
const tables = [table_lv0, table_lv2, table_lv4];
|
|
let curr_level = 0;
|
|
let i = 0;
|
|
let j = 0;
|
|
while (curr_level < tables.length) {
|
|
if (curr_level === tables.length - 1 && i !== j) {
|
|
return i > j;
|
|
}
|
|
const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 0x1;
|
|
const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 0x1;
|
|
if (weight1 === 0x1 && weight2 === 0x1) {
|
|
i = 0;
|
|
j = 0;
|
|
++curr_level;
|
|
}
|
|
else if (weight1 === weight2) {
|
|
++i;
|
|
++j;
|
|
}
|
|
else if (weight1 === 0) {
|
|
++i;
|
|
}
|
|
else if (weight2 === 0) {
|
|
++j;
|
|
}
|
|
else {
|
|
return weight1 < weight2;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
//# sourceMappingURL=SharedKeyComparator.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageSharedKeyCredentialPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key.
|
|
*/
|
|
class StorageSharedKeyCredentialPolicy extends CredentialPolicy {
|
|
/**
|
|
* Reference to StorageSharedKeyCredential which generates StorageSharedKeyCredentialPolicy
|
|
*/
|
|
factory;
|
|
/**
|
|
* Creates an instance of StorageSharedKeyCredentialPolicy.
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
* @param factory -
|
|
*/
|
|
constructor(nextPolicy, options, factory) {
|
|
super(nextPolicy, options);
|
|
this.factory = factory;
|
|
}
|
|
/**
|
|
* Signs request.
|
|
*
|
|
* @param request -
|
|
*/
|
|
signRequest(request) {
|
|
request.headers.set(constants_HeaderConstants.X_MS_DATE, new Date().toUTCString());
|
|
if (request.body &&
|
|
(typeof request.body === "string" || request.body !== undefined) &&
|
|
request.body.length > 0) {
|
|
request.headers.set(constants_HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
|
|
}
|
|
const stringToSign = [
|
|
request.method.toUpperCase(),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LANGUAGE),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_ENCODING),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LENGTH),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_MD5),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_TYPE),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.DATE),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MODIFIED_SINCE),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.IF_MATCH),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.IF_NONE_MATCH),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.IF_UNMODIFIED_SINCE),
|
|
this.getHeaderValueToSign(request, constants_HeaderConstants.RANGE),
|
|
].join("\n") +
|
|
"\n" +
|
|
this.getCanonicalizedHeadersString(request) +
|
|
this.getCanonicalizedResourceString(request);
|
|
const signature = this.factory.computeHMACSHA256(stringToSign);
|
|
request.headers.set(constants_HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`);
|
|
// console.log(`[URL]:${request.url}`);
|
|
// console.log(`[HEADERS]:${request.headers.toString()}`);
|
|
// console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
|
|
// console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
|
|
return request;
|
|
}
|
|
/**
|
|
* Retrieve header value according to shared key sign rules.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
|
|
*
|
|
* @param request -
|
|
* @param headerName -
|
|
*/
|
|
getHeaderValueToSign(request, headerName) {
|
|
const value = request.headers.get(headerName);
|
|
if (!value) {
|
|
return "";
|
|
}
|
|
// When using version 2015-02-21 or later, if Content-Length is zero, then
|
|
// set the Content-Length part of the StringToSign to an empty string.
|
|
// https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
|
|
if (headerName === constants_HeaderConstants.CONTENT_LENGTH && value === "0") {
|
|
return "";
|
|
}
|
|
return value;
|
|
}
|
|
/**
|
|
* To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
|
|
* 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
|
|
* 2. Convert each HTTP header name to lowercase.
|
|
* 3. Sort the headers lexicographically by header name, in ascending order.
|
|
* Each header may appear only once in the string.
|
|
* 4. Replace any linear whitespace in the header value with a single space.
|
|
* 5. Trim any whitespace around the colon in the header.
|
|
* 6. Finally, append a new-line character to each canonicalized header in the resulting list.
|
|
* Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
|
|
*
|
|
* @param request -
|
|
*/
|
|
getCanonicalizedHeadersString(request) {
|
|
let headersArray = request.headers.headersArray().filter((value) => {
|
|
return value.name.toLowerCase().startsWith(constants_HeaderConstants.PREFIX_FOR_STORAGE);
|
|
});
|
|
headersArray.sort((a, b) => {
|
|
return compareHeader(a.name.toLowerCase(), b.name.toLowerCase());
|
|
});
|
|
// Remove duplicate headers
|
|
headersArray = headersArray.filter((value, index, array) => {
|
|
if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
let canonicalizedHeadersStringToSign = "";
|
|
headersArray.forEach((header) => {
|
|
canonicalizedHeadersStringToSign += `${header.name
|
|
.toLowerCase()
|
|
.trimRight()}:${header.value.trimLeft()}\n`;
|
|
});
|
|
return canonicalizedHeadersStringToSign;
|
|
}
|
|
/**
|
|
* Retrieves the webResource canonicalized resource string.
|
|
*
|
|
* @param request -
|
|
*/
|
|
getCanonicalizedResourceString(request) {
|
|
const path = getURLPath(request.url) || "/";
|
|
let canonicalizedResourceString = "";
|
|
canonicalizedResourceString += `/${this.factory.accountName}${path}`;
|
|
const queries = getURLQueries(request.url);
|
|
const lowercaseQueries = {};
|
|
if (queries) {
|
|
const queryKeys = [];
|
|
for (const key in queries) {
|
|
if (Object.prototype.hasOwnProperty.call(queries, key)) {
|
|
const lowercaseKey = key.toLowerCase();
|
|
lowercaseQueries[lowercaseKey] = queries[key];
|
|
queryKeys.push(lowercaseKey);
|
|
}
|
|
}
|
|
queryKeys.sort();
|
|
for (const key of queryKeys) {
|
|
canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
|
|
}
|
|
}
|
|
return canonicalizedResourceString;
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageSharedKeyCredentialPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/credentials/StorageSharedKeyCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* StorageSharedKeyCredential for account key authorization of Azure Storage service.
|
|
*/
|
|
class StorageSharedKeyCredential extends Credential {
|
|
/**
|
|
* Azure Storage account name; readonly.
|
|
*/
|
|
accountName;
|
|
/**
|
|
* Azure Storage account key; readonly.
|
|
*/
|
|
accountKey;
|
|
/**
|
|
* Creates an instance of StorageSharedKeyCredential.
|
|
* @param accountName -
|
|
* @param accountKey -
|
|
*/
|
|
constructor(accountName, accountKey) {
|
|
super();
|
|
this.accountName = accountName;
|
|
this.accountKey = Buffer.from(accountKey, "base64");
|
|
}
|
|
/**
|
|
* Creates a StorageSharedKeyCredentialPolicy object.
|
|
*
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
create(nextPolicy, options) {
|
|
return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
|
|
}
|
|
/**
|
|
* Generates a hash signature for an HTTP request or for a SAS.
|
|
*
|
|
* @param stringToSign -
|
|
*/
|
|
computeHMACSHA256(stringToSign) {
|
|
return (0,external_node_crypto_.createHmac)("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageSharedKeyCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/log.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The `@azure/logger` configuration for this package.
|
|
*/
|
|
const storage_common_dist_esm_log_logger = esm_createClientLogger("storage-common");
|
|
//# sourceMappingURL=log.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageRetryPolicyType.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* RetryPolicy types.
|
|
*/
|
|
var StorageRetryPolicyType;
|
|
(function (StorageRetryPolicyType) {
|
|
/**
|
|
* Exponential retry. Retry time delay grows exponentially.
|
|
*/
|
|
StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
|
|
/**
|
|
* Linear retry. Retry time delay grows linearly.
|
|
*/
|
|
StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
|
|
})(StorageRetryPolicyType || (StorageRetryPolicyType = {}));
|
|
//# sourceMappingURL=StorageRetryPolicyType.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageRetryPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A factory method used to generated a RetryPolicy factory.
|
|
*
|
|
* @param retryOptions -
|
|
*/
|
|
function NewRetryPolicyFactory(retryOptions) {
|
|
return {
|
|
create: (nextPolicy, options) => {
|
|
return new StorageRetryPolicy(nextPolicy, options, retryOptions);
|
|
},
|
|
};
|
|
}
|
|
// Default values of StorageRetryOptions
|
|
const DEFAULT_RETRY_OPTIONS = {
|
|
maxRetryDelayInMs: 120 * 1000,
|
|
maxTries: 4,
|
|
retryDelayInMs: 4 * 1000,
|
|
retryPolicyType: StorageRetryPolicyType.EXPONENTIAL,
|
|
secondaryHost: "",
|
|
tryTimeoutInMs: undefined, // Use server side default timeout strategy
|
|
};
|
|
const RETRY_ABORT_ERROR = new AbortError_AbortError("The operation was aborted.");
|
|
/**
|
|
* Retry policy with exponential retry and linear retry implemented.
|
|
*/
|
|
class StorageRetryPolicy extends BaseRequestPolicy {
|
|
/**
|
|
* RetryOptions.
|
|
*/
|
|
retryOptions;
|
|
/**
|
|
* Creates an instance of RetryPolicy.
|
|
*
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
* @param retryOptions -
|
|
*/
|
|
constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
|
|
super(nextPolicy, options);
|
|
// Initialize retry options
|
|
this.retryOptions = {
|
|
retryPolicyType: retryOptions.retryPolicyType
|
|
? retryOptions.retryPolicyType
|
|
: DEFAULT_RETRY_OPTIONS.retryPolicyType,
|
|
maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
|
|
? Math.floor(retryOptions.maxTries)
|
|
: DEFAULT_RETRY_OPTIONS.maxTries,
|
|
tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
|
|
? retryOptions.tryTimeoutInMs
|
|
: DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
|
|
retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
|
|
? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
|
|
? retryOptions.maxRetryDelayInMs
|
|
: DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
|
|
: DEFAULT_RETRY_OPTIONS.retryDelayInMs,
|
|
maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
|
|
? retryOptions.maxRetryDelayInMs
|
|
: DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
|
|
secondaryHost: retryOptions.secondaryHost
|
|
? retryOptions.secondaryHost
|
|
: DEFAULT_RETRY_OPTIONS.secondaryHost,
|
|
};
|
|
}
|
|
/**
|
|
* Sends request.
|
|
*
|
|
* @param request -
|
|
*/
|
|
async sendRequest(request) {
|
|
return this.attemptSendRequest(request, false, 1);
|
|
}
|
|
/**
|
|
* Decide and perform next retry. Won't mutate request parameter.
|
|
*
|
|
* @param request -
|
|
* @param secondaryHas404 - If attempt was against the secondary & it returned a StatusNotFound (404), then
|
|
* the resource was not found. This may be due to replication delay. So, in this
|
|
* case, we'll never try the secondary again for this operation.
|
|
* @param attempt - How many retries has been attempted to performed, starting from 1, which includes
|
|
* the attempt will be performed by this method call.
|
|
*/
|
|
async attemptSendRequest(request, secondaryHas404, attempt) {
|
|
const newRequest = request.clone();
|
|
const isPrimaryRetry = secondaryHas404 ||
|
|
!this.retryOptions.secondaryHost ||
|
|
!(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
|
|
attempt % 2 === 1;
|
|
if (!isPrimaryRetry) {
|
|
newRequest.url = setURLHost(newRequest.url, this.retryOptions.secondaryHost);
|
|
}
|
|
// Set the server-side timeout query parameter "timeout=[seconds]"
|
|
if (this.retryOptions.tryTimeoutInMs) {
|
|
newRequest.url = setURLParameter(newRequest.url, constants_URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
|
|
}
|
|
let response;
|
|
try {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
|
|
response = await this._nextPolicy.sendRequest(newRequest);
|
|
if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
|
|
return response;
|
|
}
|
|
secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
|
|
}
|
|
catch (err) {
|
|
storage_common_dist_esm_log_logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
|
|
if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
await this.delay(isPrimaryRetry, attempt, request.abortSignal);
|
|
return this.attemptSendRequest(request, secondaryHas404, ++attempt);
|
|
}
|
|
/**
|
|
* Decide whether to retry according to last HTTP response and retry counters.
|
|
*
|
|
* @param isPrimaryRetry -
|
|
* @param attempt -
|
|
* @param response -
|
|
* @param err -
|
|
*/
|
|
shouldRetry(isPrimaryRetry, attempt, response, err) {
|
|
if (attempt >= this.retryOptions.maxTries) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
|
|
.maxTries}, no further try.`);
|
|
return false;
|
|
}
|
|
// Handle network failures, you may need to customize the list when you implement
|
|
// your own http client
|
|
const retriableErrors = [
|
|
"ETIMEDOUT",
|
|
"ESOCKETTIMEDOUT",
|
|
"ECONNREFUSED",
|
|
"ECONNRESET",
|
|
"ENOENT",
|
|
"ENOTFOUND",
|
|
"TIMEOUT",
|
|
"EPIPE",
|
|
"REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
|
|
];
|
|
if (err) {
|
|
for (const retriableError of retriableErrors) {
|
|
if (err.name.toUpperCase().includes(retriableError) ||
|
|
err.message.toUpperCase().includes(retriableError) ||
|
|
(err.code && err.code.toString().toUpperCase() === retriableError)) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// If attempt was against the secondary & it returned a StatusNotFound (404), then
|
|
// the resource was not found. This may be due to replication delay. So, in this
|
|
// case, we'll never try the secondary again for this operation.
|
|
if (response || err) {
|
|
const statusCode = response ? response.status : err ? err.statusCode : 0;
|
|
if (!isPrimaryRetry && statusCode === 404) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
|
|
return true;
|
|
}
|
|
// Server internal error or server timeout
|
|
if (statusCode === 503 || statusCode === 500) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
|
|
return true;
|
|
}
|
|
}
|
|
if (response) {
|
|
// Retry select Copy Source Error Codes.
|
|
if (response?.status >= 400) {
|
|
const copySourceError = response.headers.get(constants_HeaderConstants.X_MS_CopySourceErrorCode);
|
|
if (copySourceError !== undefined) {
|
|
switch (copySourceError) {
|
|
case "InternalError":
|
|
case "OperationTimedOut":
|
|
case "ServerBusy":
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (err?.code === "PARSE_ERROR" && err?.message.startsWith(`Error "Error: Unclosed root tag`)) {
|
|
storage_common_dist_esm_log_logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
/**
|
|
* Delay a calculated time between retries.
|
|
*
|
|
* @param isPrimaryRetry -
|
|
* @param attempt -
|
|
* @param abortSignal -
|
|
*/
|
|
async delay(isPrimaryRetry, attempt, abortSignal) {
|
|
let delayTimeInMs = 0;
|
|
if (isPrimaryRetry) {
|
|
switch (this.retryOptions.retryPolicyType) {
|
|
case StorageRetryPolicyType.EXPONENTIAL:
|
|
delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
|
|
break;
|
|
case StorageRetryPolicyType.FIXED:
|
|
delayTimeInMs = this.retryOptions.retryDelayInMs;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
delayTimeInMs = Math.random() * 1000;
|
|
}
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
|
|
return utils_common_delay(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageRetryPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/StorageRetryPolicyFactory.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
|
|
*/
|
|
class StorageRetryPolicyFactory {
|
|
retryOptions;
|
|
/**
|
|
* Creates an instance of StorageRetryPolicyFactory.
|
|
* @param retryOptions -
|
|
*/
|
|
constructor(retryOptions) {
|
|
this.retryOptions = retryOptions;
|
|
}
|
|
/**
|
|
* Creates a StorageRetryPolicy object.
|
|
*
|
|
* @param nextPolicy -
|
|
* @param options -
|
|
*/
|
|
create(nextPolicy, options) {
|
|
return new StorageRetryPolicy(nextPolicy, options, this.retryOptions);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageRetryPolicyFactory.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageBrowserPolicyV2.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The programmatic identifier of the StorageBrowserPolicy.
|
|
*/
|
|
const storageBrowserPolicyName = "storageBrowserPolicy";
|
|
/**
|
|
* storageBrowserPolicy is a policy used to prevent browsers from caching requests
|
|
* and to remove cookies and explicit content-length headers.
|
|
*
|
|
* In Node.js, this policy is a no-op pass-through.
|
|
*/
|
|
function storageBrowserPolicy() {
|
|
return {
|
|
name: storageBrowserPolicyName,
|
|
async sendRequest(request, next) {
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=StorageBrowserPolicyV2.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageCorrectContentLengthPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* The programmatic identifier of the storageCorrectContentLengthPolicy.
|
|
*/
|
|
const storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy";
|
|
/**
|
|
* storageCorrectContentLengthPolicy to correctly set Content-Length header with request body length.
|
|
*/
|
|
function storageCorrectContentLengthPolicy() {
|
|
function correctContentLength(request) {
|
|
if (request.body &&
|
|
(typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
|
|
request.body.length > 0) {
|
|
request.headers.set(constants_HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
|
|
}
|
|
}
|
|
return {
|
|
name: storageCorrectContentLengthPolicyName,
|
|
async sendRequest(request, next) {
|
|
correctContentLength(request);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=StorageCorrectContentLengthPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageRetryPolicyV2.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Name of the {@link storageRetryPolicy}
|
|
*/
|
|
const storageRetryPolicyName = "storageRetryPolicy";
|
|
// Default values of StorageRetryOptions
|
|
const StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS = {
|
|
maxRetryDelayInMs: 120 * 1000,
|
|
maxTries: 4,
|
|
retryDelayInMs: 4 * 1000,
|
|
retryPolicyType: StorageRetryPolicyType.EXPONENTIAL,
|
|
secondaryHost: "",
|
|
tryTimeoutInMs: undefined, // Use server side default timeout strategy
|
|
};
|
|
const retriableErrors = [
|
|
"ETIMEDOUT",
|
|
"ESOCKETTIMEDOUT",
|
|
"ECONNREFUSED",
|
|
"ECONNRESET",
|
|
"ENOENT",
|
|
"ENOTFOUND",
|
|
"TIMEOUT",
|
|
"EPIPE",
|
|
"REQUEST_SEND_ERROR",
|
|
];
|
|
const StorageRetryPolicyV2_RETRY_ABORT_ERROR = new AbortError_AbortError("The operation was aborted.");
|
|
/**
|
|
* Retry policy with exponential retry and linear retry implemented.
|
|
*/
|
|
function storageRetryPolicy(options = {}) {
|
|
const retryPolicyType = options.retryPolicyType ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.retryPolicyType;
|
|
const maxTries = options.maxTries ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.maxTries;
|
|
const retryDelayInMs = options.retryDelayInMs ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.retryDelayInMs;
|
|
const maxRetryDelayInMs = options.maxRetryDelayInMs ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs;
|
|
const secondaryHost = options.secondaryHost ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.secondaryHost;
|
|
const tryTimeoutInMs = options.tryTimeoutInMs ?? StorageRetryPolicyV2_DEFAULT_RETRY_OPTIONS.tryTimeoutInMs;
|
|
function shouldRetry({ isPrimaryRetry, attempt, response, error, }) {
|
|
if (attempt >= maxTries) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`);
|
|
return false;
|
|
}
|
|
if (error) {
|
|
for (const retriableError of retriableErrors) {
|
|
if (error.name.toUpperCase().includes(retriableError) ||
|
|
error.message.toUpperCase().includes(retriableError) ||
|
|
(error.code && error.code.toString().toUpperCase() === retriableError)) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
|
|
return true;
|
|
}
|
|
}
|
|
if (error?.code === "PARSE_ERROR" &&
|
|
error?.message.startsWith(`Error "Error: Unclosed root tag`)) {
|
|
storage_common_dist_esm_log_logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
|
|
return true;
|
|
}
|
|
}
|
|
// If attempt was against the secondary & it returned a StatusNotFound (404), then
|
|
// the resource was not found. This may be due to replication delay. So, in this
|
|
// case, we'll never try the secondary again for this operation.
|
|
if (response || error) {
|
|
const statusCode = response?.status ?? error?.statusCode ?? 0;
|
|
if (!isPrimaryRetry && statusCode === 404) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
|
|
return true;
|
|
}
|
|
// Server internal error or server timeout
|
|
if (statusCode === 503 || statusCode === 500) {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
|
|
return true;
|
|
}
|
|
}
|
|
if (response) {
|
|
// Retry select Copy Source Error Codes.
|
|
if (response?.status >= 400) {
|
|
const copySourceError = response.headers.get(constants_HeaderConstants.X_MS_CopySourceErrorCode);
|
|
if (copySourceError !== undefined) {
|
|
switch (copySourceError) {
|
|
case "InternalError":
|
|
case "OperationTimedOut":
|
|
case "ServerBusy":
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function calculateDelay(isPrimaryRetry, attempt) {
|
|
let delayTimeInMs = 0;
|
|
if (isPrimaryRetry) {
|
|
switch (retryPolicyType) {
|
|
case StorageRetryPolicyType.EXPONENTIAL:
|
|
delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs);
|
|
break;
|
|
case StorageRetryPolicyType.FIXED:
|
|
delayTimeInMs = retryDelayInMs;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
delayTimeInMs = Math.random() * 1000;
|
|
}
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
|
|
return delayTimeInMs;
|
|
}
|
|
return {
|
|
name: storageRetryPolicyName,
|
|
async sendRequest(request, next) {
|
|
// Set the server-side timeout query parameter "timeout=[seconds]"
|
|
if (tryTimeoutInMs) {
|
|
request.url = setURLParameter(request.url, constants_URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000)));
|
|
}
|
|
const primaryUrl = request.url;
|
|
const secondaryUrl = secondaryHost ? setURLHost(request.url, secondaryHost) : undefined;
|
|
let secondaryHas404 = false;
|
|
let attempt = 1;
|
|
let retryAgain = true;
|
|
let response;
|
|
let error;
|
|
while (retryAgain) {
|
|
const isPrimaryRetry = secondaryHas404 ||
|
|
!secondaryUrl ||
|
|
!["GET", "HEAD", "OPTIONS"].includes(request.method) ||
|
|
attempt % 2 === 1;
|
|
request.url = isPrimaryRetry ? primaryUrl : secondaryUrl;
|
|
response = undefined;
|
|
error = undefined;
|
|
try {
|
|
storage_common_dist_esm_log_logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
|
|
response = await next(request);
|
|
secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
|
|
}
|
|
catch (e) {
|
|
if (esm_restError_isRestError(e)) {
|
|
storage_common_dist_esm_log_logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`);
|
|
error = e;
|
|
}
|
|
else {
|
|
storage_common_dist_esm_log_logger.error(`RetryPolicy: Caught error, message: ${getErrorMessage(e)}`);
|
|
throw e;
|
|
}
|
|
}
|
|
retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error });
|
|
if (retryAgain) {
|
|
await utils_common_delay(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, StorageRetryPolicyV2_RETRY_ABORT_ERROR);
|
|
}
|
|
attempt++;
|
|
}
|
|
if (response) {
|
|
return response;
|
|
}
|
|
throw error ?? new esm_restError_RestError("RetryPolicy failed without known error.");
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=StorageRetryPolicyV2.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageSharedKeyCredentialPolicyV2.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* The programmatic identifier of the storageSharedKeyCredentialPolicy.
|
|
*/
|
|
const storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy";
|
|
/**
|
|
* storageSharedKeyCredentialPolicy handles signing requests using storage account keys.
|
|
*/
|
|
function storageSharedKeyCredentialPolicy(options) {
|
|
function signRequest(request) {
|
|
request.headers.set(constants_HeaderConstants.X_MS_DATE, new Date().toUTCString());
|
|
if (request.body &&
|
|
(typeof request.body === "string" || Buffer.isBuffer(request.body)) &&
|
|
request.body.length > 0) {
|
|
request.headers.set(constants_HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body));
|
|
}
|
|
const stringToSign = [
|
|
request.method.toUpperCase(),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LANGUAGE),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_ENCODING),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_LENGTH),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_MD5),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.CONTENT_TYPE),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.DATE),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.IF_MODIFIED_SINCE),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.IF_MATCH),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.IF_NONE_MATCH),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.IF_UNMODIFIED_SINCE),
|
|
getHeaderValueToSign(request, constants_HeaderConstants.RANGE),
|
|
].join("\n") +
|
|
"\n" +
|
|
getCanonicalizedHeadersString(request) +
|
|
getCanonicalizedResourceString(request);
|
|
const signature = (0,external_node_crypto_.createHmac)("sha256", options.accountKey)
|
|
.update(stringToSign, "utf8")
|
|
.digest("base64");
|
|
request.headers.set(constants_HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`);
|
|
// console.log(`[URL]:${request.url}`);
|
|
// console.log(`[HEADERS]:${request.headers.toString()}`);
|
|
// console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`);
|
|
// console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`);
|
|
}
|
|
/**
|
|
* Retrieve header value according to shared key sign rules.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
|
|
*/
|
|
function getHeaderValueToSign(request, headerName) {
|
|
const value = request.headers.get(headerName);
|
|
if (!value) {
|
|
return "";
|
|
}
|
|
// When using version 2015-02-21 or later, if Content-Length is zero, then
|
|
// set the Content-Length part of the StringToSign to an empty string.
|
|
// https://learn.microsoft.com/rest/api/storageservices/authenticate-with-shared-key
|
|
if (headerName === constants_HeaderConstants.CONTENT_LENGTH && value === "0") {
|
|
return "";
|
|
}
|
|
return value;
|
|
}
|
|
/**
|
|
* To construct the CanonicalizedHeaders portion of the signature string, follow these steps:
|
|
* 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header.
|
|
* 2. Convert each HTTP header name to lowercase.
|
|
* 3. Sort the headers lexicographically by header name, in ascending order.
|
|
* Each header may appear only once in the string.
|
|
* 4. Replace any linear whitespace in the header value with a single space.
|
|
* 5. Trim any whitespace around the colon in the header.
|
|
* 6. Finally, append a new-line character to each canonicalized header in the resulting list.
|
|
* Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string.
|
|
*
|
|
*/
|
|
function getCanonicalizedHeadersString(request) {
|
|
let headersArray = [];
|
|
for (const [name, value] of request.headers) {
|
|
if (name.toLowerCase().startsWith(constants_HeaderConstants.PREFIX_FOR_STORAGE)) {
|
|
headersArray.push({ name, value });
|
|
}
|
|
}
|
|
headersArray.sort((a, b) => {
|
|
return compareHeader(a.name.toLowerCase(), b.name.toLowerCase());
|
|
});
|
|
// Remove duplicate headers
|
|
headersArray = headersArray.filter((value, index, array) => {
|
|
if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
let canonicalizedHeadersStringToSign = "";
|
|
headersArray.forEach((header) => {
|
|
canonicalizedHeadersStringToSign += `${header.name
|
|
.toLowerCase()
|
|
.trimRight()}:${header.value.trimLeft()}\n`;
|
|
});
|
|
return canonicalizedHeadersStringToSign;
|
|
}
|
|
function getCanonicalizedResourceString(request) {
|
|
const path = getURLPath(request.url) || "/";
|
|
let canonicalizedResourceString = "";
|
|
canonicalizedResourceString += `/${options.accountName}${path}`;
|
|
const queries = getURLQueries(request.url);
|
|
const lowercaseQueries = {};
|
|
if (queries) {
|
|
const queryKeys = [];
|
|
for (const key in queries) {
|
|
if (Object.prototype.hasOwnProperty.call(queries, key)) {
|
|
const lowercaseKey = key.toLowerCase();
|
|
lowercaseQueries[lowercaseKey] = queries[key];
|
|
queryKeys.push(lowercaseKey);
|
|
}
|
|
}
|
|
queryKeys.sort();
|
|
for (const key of queryKeys) {
|
|
canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`;
|
|
}
|
|
}
|
|
return canonicalizedResourceString;
|
|
}
|
|
return {
|
|
name: storageSharedKeyCredentialPolicyName,
|
|
async sendRequest(request, next) {
|
|
signRequest(request);
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=StorageSharedKeyCredentialPolicyV2.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/policies/StorageRequestFailureDetailsParserPolicy.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* The programmatic identifier of the StorageRequestFailureDetailsParserPolicy.
|
|
*/
|
|
const storageRequestFailureDetailsParserPolicyName = "storageRequestFailureDetailsParserPolicy";
|
|
/**
|
|
* StorageRequestFailureDetailsParserPolicy
|
|
*/
|
|
function storageRequestFailureDetailsParserPolicy() {
|
|
return {
|
|
name: storageRequestFailureDetailsParserPolicyName,
|
|
async sendRequest(request, next) {
|
|
try {
|
|
const response = await next(request);
|
|
return response;
|
|
}
|
|
catch (err) {
|
|
if (typeof err === "object" &&
|
|
err !== null &&
|
|
err.response &&
|
|
err.response.parsedBody) {
|
|
if (err.response.parsedBody.code === "InvalidHeaderValue" &&
|
|
err.response.parsedBody.HeaderName === "x-ms-version") {
|
|
err.message =
|
|
"The provided service version is not enabled on this storage account. Please see https://learn.microsoft.com/rest/api/storageservices/versioning-for-the-azure-storage-services for additional information.\n";
|
|
}
|
|
}
|
|
throw err;
|
|
}
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=StorageRequestFailureDetailsParserPolicy.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/credentials/UserDelegationKeyCredential.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* UserDelegationKeyCredential is only used for generation of user delegation SAS.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-user-delegation-sas
|
|
*/
|
|
class UserDelegationKeyCredential {
|
|
/**
|
|
* Azure Storage account name; readonly.
|
|
*/
|
|
accountName;
|
|
/**
|
|
* Azure Storage user delegation key; readonly.
|
|
*/
|
|
userDelegationKey;
|
|
/**
|
|
* Key value in Buffer type.
|
|
*/
|
|
key;
|
|
/**
|
|
* Creates an instance of UserDelegationKeyCredential.
|
|
* @param accountName -
|
|
* @param userDelegationKey -
|
|
*/
|
|
constructor(accountName, userDelegationKey) {
|
|
this.accountName = accountName;
|
|
this.userDelegationKey = userDelegationKey;
|
|
this.key = Buffer.from(userDelegationKey.value, "base64");
|
|
}
|
|
/**
|
|
* Generates a hash signature for an HTTP request or for a SAS.
|
|
*
|
|
* @param stringToSign -
|
|
*/
|
|
computeHMACSHA256(stringToSign) {
|
|
return (0,external_node_crypto_.createHmac)("sha256", this.key).update(stringToSign, "utf8").digest("base64");
|
|
}
|
|
}
|
|
//# sourceMappingURL=UserDelegationKeyCredential.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/indexPlatform.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=indexPlatform.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-common/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/constants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const esm_utils_constants_SDK_VERSION = "12.33.0";
|
|
const SERVICE_VERSION = "2026-06-06";
|
|
const BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB
|
|
const BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB
|
|
const BLOCK_BLOB_MAX_BLOCKS = 50000;
|
|
const DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; // 8MB
|
|
const DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; // 4MB
|
|
const DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5;
|
|
const REQUEST_TIMEOUT = 100 * 1000; // In ms
|
|
/**
|
|
* The OAuth scope to use with Azure Storage.
|
|
*/
|
|
const StorageOAuthScopes = "https://storage.azure.com/.default";
|
|
const utils_constants_URLConstants = {
|
|
Parameters: {
|
|
FORCE_BROWSER_NO_CACHE: "_",
|
|
SIGNATURE: "sig",
|
|
SNAPSHOT: "snapshot",
|
|
VERSIONID: "versionid",
|
|
TIMEOUT: "timeout",
|
|
},
|
|
};
|
|
const HTTPURLConnection = {
|
|
HTTP_ACCEPTED: 202,
|
|
HTTP_CONFLICT: 409,
|
|
HTTP_NOT_FOUND: 404,
|
|
HTTP_PRECON_FAILED: 412,
|
|
HTTP_RANGE_NOT_SATISFIABLE: 416,
|
|
};
|
|
const utils_constants_HeaderConstants = {
|
|
AUTHORIZATION: "Authorization",
|
|
AUTHORIZATION_SCHEME: "Bearer",
|
|
CONTENT_ENCODING: "Content-Encoding",
|
|
CONTENT_ID: "Content-ID",
|
|
CONTENT_LANGUAGE: "Content-Language",
|
|
CONTENT_LENGTH: "Content-Length",
|
|
CONTENT_MD5: "Content-Md5",
|
|
CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding",
|
|
CONTENT_TYPE: "Content-Type",
|
|
COOKIE: "Cookie",
|
|
DATE: "date",
|
|
IF_MATCH: "if-match",
|
|
IF_MODIFIED_SINCE: "if-modified-since",
|
|
IF_NONE_MATCH: "if-none-match",
|
|
IF_UNMODIFIED_SINCE: "if-unmodified-since",
|
|
PREFIX_FOR_STORAGE: "x-ms-",
|
|
RANGE: "Range",
|
|
USER_AGENT: "User-Agent",
|
|
X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id",
|
|
X_MS_COPY_SOURCE: "x-ms-copy-source",
|
|
X_MS_DATE: "x-ms-date",
|
|
X_MS_ERROR_CODE: "x-ms-error-code",
|
|
X_MS_VERSION: "x-ms-version",
|
|
X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code",
|
|
};
|
|
const ETagNone = "";
|
|
const ETagAny = "*";
|
|
const SIZE_1_MB = 1 * 1024 * 1024;
|
|
const BATCH_MAX_REQUEST = 256;
|
|
const BATCH_MAX_PAYLOAD_IN_BYTES = 4 * SIZE_1_MB;
|
|
const HTTP_LINE_ENDING = "\r\n";
|
|
const HTTP_VERSION_1_1 = "HTTP/1.1";
|
|
const EncryptionAlgorithmAES25 = "AES256";
|
|
const utils_constants_DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`;
|
|
const StorageBlobLoggingAllowedHeaderNames = [
|
|
"Access-Control-Allow-Origin",
|
|
"Cache-Control",
|
|
"Content-Length",
|
|
"Content-Type",
|
|
"Date",
|
|
"Request-Id",
|
|
"traceparent",
|
|
"Transfer-Encoding",
|
|
"User-Agent",
|
|
"x-ms-client-request-id",
|
|
"x-ms-date",
|
|
"x-ms-error-code",
|
|
"x-ms-request-id",
|
|
"x-ms-return-client-request-id",
|
|
"x-ms-version",
|
|
"Accept-Ranges",
|
|
"Content-Disposition",
|
|
"Content-Encoding",
|
|
"Content-Language",
|
|
"Content-MD5",
|
|
"Content-Range",
|
|
"ETag",
|
|
"Last-Modified",
|
|
"Server",
|
|
"Vary",
|
|
"x-ms-content-crc64",
|
|
"x-ms-copy-action",
|
|
"x-ms-copy-completion-time",
|
|
"x-ms-copy-id",
|
|
"x-ms-copy-progress",
|
|
"x-ms-copy-status",
|
|
"x-ms-has-immutability-policy",
|
|
"x-ms-has-legal-hold",
|
|
"x-ms-lease-state",
|
|
"x-ms-lease-status",
|
|
"x-ms-range",
|
|
"x-ms-request-server-encrypted",
|
|
"x-ms-server-encrypted",
|
|
"x-ms-snapshot",
|
|
"x-ms-source-range",
|
|
"If-Match",
|
|
"If-Modified-Since",
|
|
"If-None-Match",
|
|
"If-Unmodified-Since",
|
|
"x-ms-access-tier",
|
|
"x-ms-access-tier-change-time",
|
|
"x-ms-access-tier-inferred",
|
|
"x-ms-account-kind",
|
|
"x-ms-archive-status",
|
|
"x-ms-blob-append-offset",
|
|
"x-ms-blob-cache-control",
|
|
"x-ms-blob-committed-block-count",
|
|
"x-ms-blob-condition-appendpos",
|
|
"x-ms-blob-condition-maxsize",
|
|
"x-ms-blob-content-disposition",
|
|
"x-ms-blob-content-encoding",
|
|
"x-ms-blob-content-language",
|
|
"x-ms-blob-content-length",
|
|
"x-ms-blob-content-md5",
|
|
"x-ms-blob-content-type",
|
|
"x-ms-blob-public-access",
|
|
"x-ms-blob-sequence-number",
|
|
"x-ms-blob-type",
|
|
"x-ms-copy-destination-snapshot",
|
|
"x-ms-creation-time",
|
|
"x-ms-default-encryption-scope",
|
|
"x-ms-delete-snapshots",
|
|
"x-ms-delete-type-permanent",
|
|
"x-ms-deny-encryption-scope-override",
|
|
"x-ms-encryption-algorithm",
|
|
"x-ms-if-sequence-number-eq",
|
|
"x-ms-if-sequence-number-le",
|
|
"x-ms-if-sequence-number-lt",
|
|
"x-ms-incremental-copy",
|
|
"x-ms-lease-action",
|
|
"x-ms-lease-break-period",
|
|
"x-ms-lease-duration",
|
|
"x-ms-lease-id",
|
|
"x-ms-lease-time",
|
|
"x-ms-page-write",
|
|
"x-ms-proposed-lease-id",
|
|
"x-ms-range-get-content-md5",
|
|
"x-ms-rehydrate-priority",
|
|
"x-ms-sequence-number-action",
|
|
"x-ms-sku-name",
|
|
"x-ms-source-content-md5",
|
|
"x-ms-source-if-match",
|
|
"x-ms-source-if-modified-since",
|
|
"x-ms-source-if-none-match",
|
|
"x-ms-source-if-unmodified-since",
|
|
"x-ms-tag-count",
|
|
"x-ms-encryption-key-sha256",
|
|
"x-ms-copy-source-error-code",
|
|
"x-ms-copy-source-status-code",
|
|
"x-ms-if-tags",
|
|
"x-ms-source-if-tags",
|
|
];
|
|
const StorageBlobLoggingAllowedQueryParameters = [
|
|
"comp",
|
|
"maxresults",
|
|
"rscc",
|
|
"rscd",
|
|
"rsce",
|
|
"rscl",
|
|
"rsct",
|
|
"se",
|
|
"si",
|
|
"sip",
|
|
"sp",
|
|
"spr",
|
|
"sr",
|
|
"srt",
|
|
"ss",
|
|
"st",
|
|
"sv",
|
|
"include",
|
|
"marker",
|
|
"prefix",
|
|
"copyid",
|
|
"restype",
|
|
"blockid",
|
|
"blocklisttype",
|
|
"delimiter",
|
|
"prevsnapshot",
|
|
"ske",
|
|
"skoid",
|
|
"sks",
|
|
"skt",
|
|
"sktid",
|
|
"skv",
|
|
"snapshot",
|
|
];
|
|
const BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption";
|
|
const BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption";
|
|
/// List of ports used for path style addressing.
|
|
/// Path style addressing means that storage account is put in URI's Path segment in instead of in host.
|
|
const utils_constants_PathStylePorts = [
|
|
"10000",
|
|
"10001",
|
|
"10002",
|
|
"10003",
|
|
"10004",
|
|
"10100",
|
|
"10101",
|
|
"10102",
|
|
"10103",
|
|
"10104",
|
|
"11000",
|
|
"11001",
|
|
"11002",
|
|
"11003",
|
|
"11004",
|
|
"11100",
|
|
"11101",
|
|
"11102",
|
|
"11103",
|
|
"11104",
|
|
];
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/Pipeline.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Export following interfaces and types for customers who want to implement their
|
|
// own RequestPolicy or HTTPClient
|
|
|
|
/**
|
|
* A helper to decide if a given argument satisfies the Pipeline contract
|
|
* @param pipeline - An argument that may be a Pipeline
|
|
* @returns true when the argument satisfies the Pipeline contract
|
|
*/
|
|
function isPipelineLike(pipeline) {
|
|
if (!pipeline || typeof pipeline !== "object") {
|
|
return false;
|
|
}
|
|
const castPipeline = pipeline;
|
|
return (Array.isArray(castPipeline.factories) &&
|
|
typeof castPipeline.options === "object" &&
|
|
typeof castPipeline.toServiceClientOptions === "function");
|
|
}
|
|
/**
|
|
* A Pipeline class containing HTTP request policies.
|
|
* You can create a default Pipeline by calling {@link newPipeline}.
|
|
* Or you can create a Pipeline with your own policies by the constructor of Pipeline.
|
|
*
|
|
* Refer to {@link newPipeline} and provided policies before implementing your
|
|
* customized Pipeline.
|
|
*/
|
|
class Pipeline {
|
|
/**
|
|
* A list of chained request policy factories.
|
|
*/
|
|
factories;
|
|
/**
|
|
* Configures pipeline logger and HTTP client.
|
|
*/
|
|
options;
|
|
/**
|
|
* Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.
|
|
*
|
|
* @param factories -
|
|
* @param options -
|
|
*/
|
|
constructor(factories, options = {}) {
|
|
this.factories = factories;
|
|
this.options = options;
|
|
}
|
|
/**
|
|
* Transfer Pipeline object to ServiceClientOptions object which is required by
|
|
* ServiceClient constructor.
|
|
*
|
|
* @returns The ServiceClientOptions object from this Pipeline.
|
|
*/
|
|
toServiceClientOptions() {
|
|
return {
|
|
httpClient: this.options.httpClient,
|
|
requestPolicyFactories: this.factories,
|
|
};
|
|
}
|
|
}
|
|
/**
|
|
* Creates a new Pipeline object with Credential provided.
|
|
*
|
|
* @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.
|
|
* @param pipelineOptions - Optional. Options.
|
|
* @returns A new Pipeline object.
|
|
*/
|
|
function newPipeline(credential, pipelineOptions = {}) {
|
|
if (!credential) {
|
|
credential = new AnonymousCredential();
|
|
}
|
|
const pipeline = new Pipeline([], pipelineOptions);
|
|
pipeline._credential = credential;
|
|
return pipeline;
|
|
}
|
|
function processDownlevelPipeline(pipeline) {
|
|
const knownFactoryFunctions = [
|
|
isAnonymousCredential,
|
|
isStorageSharedKeyCredential,
|
|
isCoreHttpBearerTokenFactory,
|
|
isStorageBrowserPolicyFactory,
|
|
isStorageRetryPolicyFactory,
|
|
isStorageTelemetryPolicyFactory,
|
|
isCoreHttpPolicyFactory,
|
|
];
|
|
if (pipeline.factories.length) {
|
|
const novelFactories = pipeline.factories.filter((factory) => {
|
|
return !knownFactoryFunctions.some((knownFactory) => knownFactory(factory));
|
|
});
|
|
if (novelFactories.length) {
|
|
const hasInjector = novelFactories.some((factory) => isInjectorPolicyFactory(factory));
|
|
// if there are any left over, wrap in a requestPolicyFactoryPolicy
|
|
return {
|
|
wrappedPolicies: createRequestPolicyFactoryPolicy(novelFactories),
|
|
afterRetry: hasInjector,
|
|
};
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getCoreClientOptions(pipeline) {
|
|
const { httpClient: v1Client, ...restOptions } = pipeline.options;
|
|
let httpClient = pipeline._coreHttpClient;
|
|
if (!httpClient) {
|
|
httpClient = v1Client ? convertHttpClient(v1Client) : cache_getCachedDefaultHttpClient();
|
|
pipeline._coreHttpClient = httpClient;
|
|
}
|
|
let corePipeline = pipeline._corePipeline;
|
|
if (!corePipeline) {
|
|
const packageDetails = `azsdk-js-azure-storage-blob/${esm_utils_constants_SDK_VERSION}`;
|
|
const userAgentPrefix = restOptions.userAgentOptions && restOptions.userAgentOptions.userAgentPrefix
|
|
? `${restOptions.userAgentOptions.userAgentPrefix} ${packageDetails}`
|
|
: `${packageDetails}`;
|
|
corePipeline = createClientPipeline({
|
|
...restOptions,
|
|
loggingOptions: {
|
|
additionalAllowedHeaderNames: StorageBlobLoggingAllowedHeaderNames,
|
|
additionalAllowedQueryParameters: StorageBlobLoggingAllowedQueryParameters,
|
|
logger: storage_blob_dist_esm_log_logger.info,
|
|
},
|
|
userAgentOptions: {
|
|
userAgentPrefix,
|
|
},
|
|
serializationOptions: {
|
|
stringifyXML: stringifyXML,
|
|
serializerOptions: {
|
|
xml: {
|
|
// Use customized XML char key of "#" so we can deserialize metadata
|
|
// with "_" key
|
|
xmlCharKey: "#",
|
|
},
|
|
},
|
|
},
|
|
deserializationOptions: {
|
|
parseXML: parseXML,
|
|
serializerOptions: {
|
|
xml: {
|
|
// Use customized XML char key of "#" so we can deserialize metadata
|
|
// with "_" key
|
|
xmlCharKey: "#",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
corePipeline.removePolicy({ phase: "Retry" });
|
|
corePipeline.removePolicy({ name: decompressResponsePolicy_decompressResponsePolicyName });
|
|
corePipeline.addPolicy(storageCorrectContentLengthPolicy());
|
|
corePipeline.addPolicy(storageRetryPolicy(restOptions.retryOptions), { phase: "Retry" });
|
|
corePipeline.addPolicy(storageRequestFailureDetailsParserPolicy());
|
|
corePipeline.addPolicy(storageBrowserPolicy());
|
|
const downlevelResults = processDownlevelPipeline(pipeline);
|
|
if (downlevelResults) {
|
|
corePipeline.addPolicy(downlevelResults.wrappedPolicies, downlevelResults.afterRetry ? { afterPhase: "Retry" } : undefined);
|
|
}
|
|
const credential = getCredentialFromPipeline(pipeline);
|
|
if (isTokenCredential(credential)) {
|
|
corePipeline.addPolicy(bearerTokenAuthenticationPolicy({
|
|
credential,
|
|
scopes: restOptions.audience ?? StorageOAuthScopes,
|
|
challengeCallbacks: { authorizeRequestOnChallenge: authorizeRequestOnTenantChallenge },
|
|
}), { phase: "Sign" });
|
|
}
|
|
else if (credential instanceof StorageSharedKeyCredential) {
|
|
corePipeline.addPolicy(storageSharedKeyCredentialPolicy({
|
|
accountName: credential.accountName,
|
|
accountKey: credential.accountKey,
|
|
}), { phase: "Sign" });
|
|
}
|
|
pipeline._corePipeline = corePipeline;
|
|
}
|
|
return {
|
|
...restOptions,
|
|
allowInsecureConnection: true,
|
|
httpClient,
|
|
pipeline: corePipeline,
|
|
};
|
|
}
|
|
function getCredentialFromPipeline(pipeline) {
|
|
// see if we squirreled one away on the type itself
|
|
if (pipeline._credential) {
|
|
return pipeline._credential;
|
|
}
|
|
// if it came from another package, loop over the factories and look for one like before
|
|
let credential = new AnonymousCredential();
|
|
for (const factory of pipeline.factories) {
|
|
if (isTokenCredential(factory.credential)) {
|
|
// Only works if the factory has been attached a "credential" property.
|
|
// We do that in newPipeline() when using TokenCredential.
|
|
credential = factory.credential;
|
|
}
|
|
else if (isStorageSharedKeyCredential(factory)) {
|
|
return factory;
|
|
}
|
|
}
|
|
return credential;
|
|
}
|
|
function isStorageSharedKeyCredential(factory) {
|
|
if (factory instanceof StorageSharedKeyCredential) {
|
|
return true;
|
|
}
|
|
return factory.constructor.name === "StorageSharedKeyCredential";
|
|
}
|
|
function isAnonymousCredential(factory) {
|
|
if (factory instanceof AnonymousCredential) {
|
|
return true;
|
|
}
|
|
return factory.constructor.name === "AnonymousCredential";
|
|
}
|
|
function isCoreHttpBearerTokenFactory(factory) {
|
|
return isTokenCredential(factory.credential);
|
|
}
|
|
function isStorageBrowserPolicyFactory(factory) {
|
|
if (factory instanceof StorageBrowserPolicyFactory) {
|
|
return true;
|
|
}
|
|
return factory.constructor.name === "StorageBrowserPolicyFactory";
|
|
}
|
|
function isStorageRetryPolicyFactory(factory) {
|
|
if (factory instanceof StorageRetryPolicyFactory) {
|
|
return true;
|
|
}
|
|
return factory.constructor.name === "StorageRetryPolicyFactory";
|
|
}
|
|
function isStorageTelemetryPolicyFactory(factory) {
|
|
return factory.constructor.name === "TelemetryPolicyFactory";
|
|
}
|
|
function isInjectorPolicyFactory(factory) {
|
|
return factory.constructor.name === "InjectorPolicyFactory";
|
|
}
|
|
function isCoreHttpPolicyFactory(factory) {
|
|
const knownPolicies = [
|
|
"GenerateClientRequestIdPolicy",
|
|
"TracingPolicy",
|
|
"LogPolicy",
|
|
"ProxyPolicy",
|
|
"DisableResponseDecompressionPolicy",
|
|
"KeepAlivePolicy",
|
|
"DeserializationPolicy",
|
|
];
|
|
const mockHttpClient = {
|
|
sendRequest: async (request) => {
|
|
return {
|
|
request,
|
|
headers: request.headers.clone(),
|
|
status: 500,
|
|
};
|
|
},
|
|
};
|
|
const mockRequestPolicyOptions = {
|
|
log(_logLevel, _message) {
|
|
/* do nothing */
|
|
},
|
|
shouldLog(_logLevel) {
|
|
return false;
|
|
},
|
|
};
|
|
const policyInstance = factory.create(mockHttpClient, mockRequestPolicyOptions);
|
|
const policyName = policyInstance.constructor.name;
|
|
// bundlers sometimes add a custom suffix to the class name to make it unique
|
|
return knownPolicies.some((knownPolicyName) => {
|
|
return policyName.startsWith(knownPolicyName);
|
|
});
|
|
}
|
|
//# sourceMappingURL=Pipeline.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/models/index.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
|
|
var KnownEncryptionAlgorithmType;
|
|
(function (KnownEncryptionAlgorithmType) {
|
|
/** AES256 */
|
|
KnownEncryptionAlgorithmType["AES256"] = "AES256";
|
|
})(KnownEncryptionAlgorithmType || (KnownEncryptionAlgorithmType = {}));
|
|
/** Known values of {@link FileShareTokenIntent} that the service accepts. */
|
|
var KnownFileShareTokenIntent;
|
|
(function (KnownFileShareTokenIntent) {
|
|
/** Backup */
|
|
KnownFileShareTokenIntent["Backup"] = "backup";
|
|
})(KnownFileShareTokenIntent || (KnownFileShareTokenIntent = {}));
|
|
/** Known values of {@link BlobExpiryOptions} that the service accepts. */
|
|
var KnownBlobExpiryOptions;
|
|
(function (KnownBlobExpiryOptions) {
|
|
/** NeverExpire */
|
|
KnownBlobExpiryOptions["NeverExpire"] = "NeverExpire";
|
|
/** RelativeToCreation */
|
|
KnownBlobExpiryOptions["RelativeToCreation"] = "RelativeToCreation";
|
|
/** RelativeToNow */
|
|
KnownBlobExpiryOptions["RelativeToNow"] = "RelativeToNow";
|
|
/** Absolute */
|
|
KnownBlobExpiryOptions["Absolute"] = "Absolute";
|
|
})(KnownBlobExpiryOptions || (KnownBlobExpiryOptions = {}));
|
|
/** Known values of {@link StorageErrorCode} that the service accepts. */
|
|
var KnownStorageErrorCode;
|
|
(function (KnownStorageErrorCode) {
|
|
/** AccountAlreadyExists */
|
|
KnownStorageErrorCode["AccountAlreadyExists"] = "AccountAlreadyExists";
|
|
/** AccountBeingCreated */
|
|
KnownStorageErrorCode["AccountBeingCreated"] = "AccountBeingCreated";
|
|
/** AccountIsDisabled */
|
|
KnownStorageErrorCode["AccountIsDisabled"] = "AccountIsDisabled";
|
|
/** AuthenticationFailed */
|
|
KnownStorageErrorCode["AuthenticationFailed"] = "AuthenticationFailed";
|
|
/** AuthorizationFailure */
|
|
KnownStorageErrorCode["AuthorizationFailure"] = "AuthorizationFailure";
|
|
/** ConditionHeadersNotSupported */
|
|
KnownStorageErrorCode["ConditionHeadersNotSupported"] = "ConditionHeadersNotSupported";
|
|
/** ConditionNotMet */
|
|
KnownStorageErrorCode["ConditionNotMet"] = "ConditionNotMet";
|
|
/** EmptyMetadataKey */
|
|
KnownStorageErrorCode["EmptyMetadataKey"] = "EmptyMetadataKey";
|
|
/** InsufficientAccountPermissions */
|
|
KnownStorageErrorCode["InsufficientAccountPermissions"] = "InsufficientAccountPermissions";
|
|
/** InternalError */
|
|
KnownStorageErrorCode["InternalError"] = "InternalError";
|
|
/** InvalidAuthenticationInfo */
|
|
KnownStorageErrorCode["InvalidAuthenticationInfo"] = "InvalidAuthenticationInfo";
|
|
/** InvalidHeaderValue */
|
|
KnownStorageErrorCode["InvalidHeaderValue"] = "InvalidHeaderValue";
|
|
/** InvalidHttpVerb */
|
|
KnownStorageErrorCode["InvalidHttpVerb"] = "InvalidHttpVerb";
|
|
/** InvalidInput */
|
|
KnownStorageErrorCode["InvalidInput"] = "InvalidInput";
|
|
/** InvalidMd5 */
|
|
KnownStorageErrorCode["InvalidMd5"] = "InvalidMd5";
|
|
/** InvalidMetadata */
|
|
KnownStorageErrorCode["InvalidMetadata"] = "InvalidMetadata";
|
|
/** InvalidQueryParameterValue */
|
|
KnownStorageErrorCode["InvalidQueryParameterValue"] = "InvalidQueryParameterValue";
|
|
/** InvalidRange */
|
|
KnownStorageErrorCode["InvalidRange"] = "InvalidRange";
|
|
/** InvalidResourceName */
|
|
KnownStorageErrorCode["InvalidResourceName"] = "InvalidResourceName";
|
|
/** InvalidUri */
|
|
KnownStorageErrorCode["InvalidUri"] = "InvalidUri";
|
|
/** InvalidXmlDocument */
|
|
KnownStorageErrorCode["InvalidXmlDocument"] = "InvalidXmlDocument";
|
|
/** InvalidXmlNodeValue */
|
|
KnownStorageErrorCode["InvalidXmlNodeValue"] = "InvalidXmlNodeValue";
|
|
/** Md5Mismatch */
|
|
KnownStorageErrorCode["Md5Mismatch"] = "Md5Mismatch";
|
|
/** MetadataTooLarge */
|
|
KnownStorageErrorCode["MetadataTooLarge"] = "MetadataTooLarge";
|
|
/** MissingContentLengthHeader */
|
|
KnownStorageErrorCode["MissingContentLengthHeader"] = "MissingContentLengthHeader";
|
|
/** MissingRequiredQueryParameter */
|
|
KnownStorageErrorCode["MissingRequiredQueryParameter"] = "MissingRequiredQueryParameter";
|
|
/** MissingRequiredHeader */
|
|
KnownStorageErrorCode["MissingRequiredHeader"] = "MissingRequiredHeader";
|
|
/** MissingRequiredXmlNode */
|
|
KnownStorageErrorCode["MissingRequiredXmlNode"] = "MissingRequiredXmlNode";
|
|
/** MultipleConditionHeadersNotSupported */
|
|
KnownStorageErrorCode["MultipleConditionHeadersNotSupported"] = "MultipleConditionHeadersNotSupported";
|
|
/** OperationTimedOut */
|
|
KnownStorageErrorCode["OperationTimedOut"] = "OperationTimedOut";
|
|
/** OutOfRangeInput */
|
|
KnownStorageErrorCode["OutOfRangeInput"] = "OutOfRangeInput";
|
|
/** OutOfRangeQueryParameterValue */
|
|
KnownStorageErrorCode["OutOfRangeQueryParameterValue"] = "OutOfRangeQueryParameterValue";
|
|
/** RequestBodyTooLarge */
|
|
KnownStorageErrorCode["RequestBodyTooLarge"] = "RequestBodyTooLarge";
|
|
/** ResourceTypeMismatch */
|
|
KnownStorageErrorCode["ResourceTypeMismatch"] = "ResourceTypeMismatch";
|
|
/** RequestUrlFailedToParse */
|
|
KnownStorageErrorCode["RequestUrlFailedToParse"] = "RequestUrlFailedToParse";
|
|
/** ResourceAlreadyExists */
|
|
KnownStorageErrorCode["ResourceAlreadyExists"] = "ResourceAlreadyExists";
|
|
/** ResourceNotFound */
|
|
KnownStorageErrorCode["ResourceNotFound"] = "ResourceNotFound";
|
|
/** ServerBusy */
|
|
KnownStorageErrorCode["ServerBusy"] = "ServerBusy";
|
|
/** UnsupportedHeader */
|
|
KnownStorageErrorCode["UnsupportedHeader"] = "UnsupportedHeader";
|
|
/** UnsupportedXmlNode */
|
|
KnownStorageErrorCode["UnsupportedXmlNode"] = "UnsupportedXmlNode";
|
|
/** UnsupportedQueryParameter */
|
|
KnownStorageErrorCode["UnsupportedQueryParameter"] = "UnsupportedQueryParameter";
|
|
/** UnsupportedHttpVerb */
|
|
KnownStorageErrorCode["UnsupportedHttpVerb"] = "UnsupportedHttpVerb";
|
|
/** AppendPositionConditionNotMet */
|
|
KnownStorageErrorCode["AppendPositionConditionNotMet"] = "AppendPositionConditionNotMet";
|
|
/** BlobAlreadyExists */
|
|
KnownStorageErrorCode["BlobAlreadyExists"] = "BlobAlreadyExists";
|
|
/** BlobImmutableDueToPolicy */
|
|
KnownStorageErrorCode["BlobImmutableDueToPolicy"] = "BlobImmutableDueToPolicy";
|
|
/** BlobNotFound */
|
|
KnownStorageErrorCode["BlobNotFound"] = "BlobNotFound";
|
|
/** BlobOverwritten */
|
|
KnownStorageErrorCode["BlobOverwritten"] = "BlobOverwritten";
|
|
/** BlobTierInadequateForContentLength */
|
|
KnownStorageErrorCode["BlobTierInadequateForContentLength"] = "BlobTierInadequateForContentLength";
|
|
/** BlobUsesCustomerSpecifiedEncryption */
|
|
KnownStorageErrorCode["BlobUsesCustomerSpecifiedEncryption"] = "BlobUsesCustomerSpecifiedEncryption";
|
|
/** BlockCountExceedsLimit */
|
|
KnownStorageErrorCode["BlockCountExceedsLimit"] = "BlockCountExceedsLimit";
|
|
/** BlockListTooLong */
|
|
KnownStorageErrorCode["BlockListTooLong"] = "BlockListTooLong";
|
|
/** CannotChangeToLowerTier */
|
|
KnownStorageErrorCode["CannotChangeToLowerTier"] = "CannotChangeToLowerTier";
|
|
/** CannotVerifyCopySource */
|
|
KnownStorageErrorCode["CannotVerifyCopySource"] = "CannotVerifyCopySource";
|
|
/** ContainerAlreadyExists */
|
|
KnownStorageErrorCode["ContainerAlreadyExists"] = "ContainerAlreadyExists";
|
|
/** ContainerBeingDeleted */
|
|
KnownStorageErrorCode["ContainerBeingDeleted"] = "ContainerBeingDeleted";
|
|
/** ContainerDisabled */
|
|
KnownStorageErrorCode["ContainerDisabled"] = "ContainerDisabled";
|
|
/** ContainerNotFound */
|
|
KnownStorageErrorCode["ContainerNotFound"] = "ContainerNotFound";
|
|
/** ContentLengthLargerThanTierLimit */
|
|
KnownStorageErrorCode["ContentLengthLargerThanTierLimit"] = "ContentLengthLargerThanTierLimit";
|
|
/** CopyAcrossAccountsNotSupported */
|
|
KnownStorageErrorCode["CopyAcrossAccountsNotSupported"] = "CopyAcrossAccountsNotSupported";
|
|
/** CopyIdMismatch */
|
|
KnownStorageErrorCode["CopyIdMismatch"] = "CopyIdMismatch";
|
|
/** FeatureVersionMismatch */
|
|
KnownStorageErrorCode["FeatureVersionMismatch"] = "FeatureVersionMismatch";
|
|
/** IncrementalCopyBlobMismatch */
|
|
KnownStorageErrorCode["IncrementalCopyBlobMismatch"] = "IncrementalCopyBlobMismatch";
|
|
/** IncrementalCopyOfEarlierSnapshotNotAllowed */
|
|
KnownStorageErrorCode["IncrementalCopyOfEarlierSnapshotNotAllowed"] = "IncrementalCopyOfEarlierSnapshotNotAllowed";
|
|
/** IncrementalCopySourceMustBeSnapshot */
|
|
KnownStorageErrorCode["IncrementalCopySourceMustBeSnapshot"] = "IncrementalCopySourceMustBeSnapshot";
|
|
/** InfiniteLeaseDurationRequired */
|
|
KnownStorageErrorCode["InfiniteLeaseDurationRequired"] = "InfiniteLeaseDurationRequired";
|
|
/** InvalidBlobOrBlock */
|
|
KnownStorageErrorCode["InvalidBlobOrBlock"] = "InvalidBlobOrBlock";
|
|
/** InvalidBlobTier */
|
|
KnownStorageErrorCode["InvalidBlobTier"] = "InvalidBlobTier";
|
|
/** InvalidBlobType */
|
|
KnownStorageErrorCode["InvalidBlobType"] = "InvalidBlobType";
|
|
/** InvalidBlockId */
|
|
KnownStorageErrorCode["InvalidBlockId"] = "InvalidBlockId";
|
|
/** InvalidBlockList */
|
|
KnownStorageErrorCode["InvalidBlockList"] = "InvalidBlockList";
|
|
/** InvalidOperation */
|
|
KnownStorageErrorCode["InvalidOperation"] = "InvalidOperation";
|
|
/** InvalidPageRange */
|
|
KnownStorageErrorCode["InvalidPageRange"] = "InvalidPageRange";
|
|
/** InvalidSourceBlobType */
|
|
KnownStorageErrorCode["InvalidSourceBlobType"] = "InvalidSourceBlobType";
|
|
/** InvalidSourceBlobUrl */
|
|
KnownStorageErrorCode["InvalidSourceBlobUrl"] = "InvalidSourceBlobUrl";
|
|
/** InvalidVersionForPageBlobOperation */
|
|
KnownStorageErrorCode["InvalidVersionForPageBlobOperation"] = "InvalidVersionForPageBlobOperation";
|
|
/** LeaseAlreadyPresent */
|
|
KnownStorageErrorCode["LeaseAlreadyPresent"] = "LeaseAlreadyPresent";
|
|
/** LeaseAlreadyBroken */
|
|
KnownStorageErrorCode["LeaseAlreadyBroken"] = "LeaseAlreadyBroken";
|
|
/** LeaseIdMismatchWithBlobOperation */
|
|
KnownStorageErrorCode["LeaseIdMismatchWithBlobOperation"] = "LeaseIdMismatchWithBlobOperation";
|
|
/** LeaseIdMismatchWithContainerOperation */
|
|
KnownStorageErrorCode["LeaseIdMismatchWithContainerOperation"] = "LeaseIdMismatchWithContainerOperation";
|
|
/** LeaseIdMismatchWithLeaseOperation */
|
|
KnownStorageErrorCode["LeaseIdMismatchWithLeaseOperation"] = "LeaseIdMismatchWithLeaseOperation";
|
|
/** LeaseIdMissing */
|
|
KnownStorageErrorCode["LeaseIdMissing"] = "LeaseIdMissing";
|
|
/** LeaseIsBreakingAndCannotBeAcquired */
|
|
KnownStorageErrorCode["LeaseIsBreakingAndCannotBeAcquired"] = "LeaseIsBreakingAndCannotBeAcquired";
|
|
/** LeaseIsBreakingAndCannotBeChanged */
|
|
KnownStorageErrorCode["LeaseIsBreakingAndCannotBeChanged"] = "LeaseIsBreakingAndCannotBeChanged";
|
|
/** LeaseIsBrokenAndCannotBeRenewed */
|
|
KnownStorageErrorCode["LeaseIsBrokenAndCannotBeRenewed"] = "LeaseIsBrokenAndCannotBeRenewed";
|
|
/** LeaseLost */
|
|
KnownStorageErrorCode["LeaseLost"] = "LeaseLost";
|
|
/** LeaseNotPresentWithBlobOperation */
|
|
KnownStorageErrorCode["LeaseNotPresentWithBlobOperation"] = "LeaseNotPresentWithBlobOperation";
|
|
/** LeaseNotPresentWithContainerOperation */
|
|
KnownStorageErrorCode["LeaseNotPresentWithContainerOperation"] = "LeaseNotPresentWithContainerOperation";
|
|
/** LeaseNotPresentWithLeaseOperation */
|
|
KnownStorageErrorCode["LeaseNotPresentWithLeaseOperation"] = "LeaseNotPresentWithLeaseOperation";
|
|
/** MaxBlobSizeConditionNotMet */
|
|
KnownStorageErrorCode["MaxBlobSizeConditionNotMet"] = "MaxBlobSizeConditionNotMet";
|
|
/** NoAuthenticationInformation */
|
|
KnownStorageErrorCode["NoAuthenticationInformation"] = "NoAuthenticationInformation";
|
|
/** NoPendingCopyOperation */
|
|
KnownStorageErrorCode["NoPendingCopyOperation"] = "NoPendingCopyOperation";
|
|
/** OperationNotAllowedOnIncrementalCopyBlob */
|
|
KnownStorageErrorCode["OperationNotAllowedOnIncrementalCopyBlob"] = "OperationNotAllowedOnIncrementalCopyBlob";
|
|
/** PendingCopyOperation */
|
|
KnownStorageErrorCode["PendingCopyOperation"] = "PendingCopyOperation";
|
|
/** PreviousSnapshotCannotBeNewer */
|
|
KnownStorageErrorCode["PreviousSnapshotCannotBeNewer"] = "PreviousSnapshotCannotBeNewer";
|
|
/** PreviousSnapshotNotFound */
|
|
KnownStorageErrorCode["PreviousSnapshotNotFound"] = "PreviousSnapshotNotFound";
|
|
/** PreviousSnapshotOperationNotSupported */
|
|
KnownStorageErrorCode["PreviousSnapshotOperationNotSupported"] = "PreviousSnapshotOperationNotSupported";
|
|
/** SequenceNumberConditionNotMet */
|
|
KnownStorageErrorCode["SequenceNumberConditionNotMet"] = "SequenceNumberConditionNotMet";
|
|
/** SequenceNumberIncrementTooLarge */
|
|
KnownStorageErrorCode["SequenceNumberIncrementTooLarge"] = "SequenceNumberIncrementTooLarge";
|
|
/** SnapshotCountExceeded */
|
|
KnownStorageErrorCode["SnapshotCountExceeded"] = "SnapshotCountExceeded";
|
|
/** SnapshotOperationRateExceeded */
|
|
KnownStorageErrorCode["SnapshotOperationRateExceeded"] = "SnapshotOperationRateExceeded";
|
|
/** SnapshotsPresent */
|
|
KnownStorageErrorCode["SnapshotsPresent"] = "SnapshotsPresent";
|
|
/** SourceConditionNotMet */
|
|
KnownStorageErrorCode["SourceConditionNotMet"] = "SourceConditionNotMet";
|
|
/** SystemInUse */
|
|
KnownStorageErrorCode["SystemInUse"] = "SystemInUse";
|
|
/** TargetConditionNotMet */
|
|
KnownStorageErrorCode["TargetConditionNotMet"] = "TargetConditionNotMet";
|
|
/** UnauthorizedBlobOverwrite */
|
|
KnownStorageErrorCode["UnauthorizedBlobOverwrite"] = "UnauthorizedBlobOverwrite";
|
|
/** BlobBeingRehydrated */
|
|
KnownStorageErrorCode["BlobBeingRehydrated"] = "BlobBeingRehydrated";
|
|
/** BlobArchived */
|
|
KnownStorageErrorCode["BlobArchived"] = "BlobArchived";
|
|
/** BlobNotArchived */
|
|
KnownStorageErrorCode["BlobNotArchived"] = "BlobNotArchived";
|
|
/** AuthorizationSourceIPMismatch */
|
|
KnownStorageErrorCode["AuthorizationSourceIPMismatch"] = "AuthorizationSourceIPMismatch";
|
|
/** AuthorizationProtocolMismatch */
|
|
KnownStorageErrorCode["AuthorizationProtocolMismatch"] = "AuthorizationProtocolMismatch";
|
|
/** AuthorizationPermissionMismatch */
|
|
KnownStorageErrorCode["AuthorizationPermissionMismatch"] = "AuthorizationPermissionMismatch";
|
|
/** AuthorizationServiceMismatch */
|
|
KnownStorageErrorCode["AuthorizationServiceMismatch"] = "AuthorizationServiceMismatch";
|
|
/** AuthorizationResourceTypeMismatch */
|
|
KnownStorageErrorCode["AuthorizationResourceTypeMismatch"] = "AuthorizationResourceTypeMismatch";
|
|
/** BlobAccessTierNotSupportedForAccountType */
|
|
KnownStorageErrorCode["BlobAccessTierNotSupportedForAccountType"] = "BlobAccessTierNotSupportedForAccountType";
|
|
})(KnownStorageErrorCode || (KnownStorageErrorCode = {}));
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/models/mappers.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
const BlobServiceProperties = {
|
|
serializedName: "BlobServiceProperties",
|
|
xmlName: "StorageServiceProperties",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobServiceProperties",
|
|
modelProperties: {
|
|
blobAnalyticsLogging: {
|
|
serializedName: "Logging",
|
|
xmlName: "Logging",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Logging",
|
|
},
|
|
},
|
|
hourMetrics: {
|
|
serializedName: "HourMetrics",
|
|
xmlName: "HourMetrics",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Metrics",
|
|
},
|
|
},
|
|
minuteMetrics: {
|
|
serializedName: "MinuteMetrics",
|
|
xmlName: "MinuteMetrics",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Metrics",
|
|
},
|
|
},
|
|
cors: {
|
|
serializedName: "Cors",
|
|
xmlName: "Cors",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "CorsRule",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "CorsRule",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
defaultServiceVersion: {
|
|
serializedName: "DefaultServiceVersion",
|
|
xmlName: "DefaultServiceVersion",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
deleteRetentionPolicy: {
|
|
serializedName: "DeleteRetentionPolicy",
|
|
xmlName: "DeleteRetentionPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "RetentionPolicy",
|
|
},
|
|
},
|
|
staticWebsite: {
|
|
serializedName: "StaticWebsite",
|
|
xmlName: "StaticWebsite",
|
|
type: {
|
|
name: "Composite",
|
|
className: "StaticWebsite",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const Logging = {
|
|
serializedName: "Logging",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Logging",
|
|
modelProperties: {
|
|
version: {
|
|
serializedName: "Version",
|
|
required: true,
|
|
xmlName: "Version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
deleteProperty: {
|
|
serializedName: "Delete",
|
|
required: true,
|
|
xmlName: "Delete",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
read: {
|
|
serializedName: "Read",
|
|
required: true,
|
|
xmlName: "Read",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
write: {
|
|
serializedName: "Write",
|
|
required: true,
|
|
xmlName: "Write",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
retentionPolicy: {
|
|
serializedName: "RetentionPolicy",
|
|
xmlName: "RetentionPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "RetentionPolicy",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const RetentionPolicy = {
|
|
serializedName: "RetentionPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "RetentionPolicy",
|
|
modelProperties: {
|
|
enabled: {
|
|
serializedName: "Enabled",
|
|
required: true,
|
|
xmlName: "Enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
days: {
|
|
constraints: {
|
|
InclusiveMinimum: 1,
|
|
},
|
|
serializedName: "Days",
|
|
xmlName: "Days",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const Metrics = {
|
|
serializedName: "Metrics",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Metrics",
|
|
modelProperties: {
|
|
version: {
|
|
serializedName: "Version",
|
|
xmlName: "Version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
enabled: {
|
|
serializedName: "Enabled",
|
|
required: true,
|
|
xmlName: "Enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
includeAPIs: {
|
|
serializedName: "IncludeAPIs",
|
|
xmlName: "IncludeAPIs",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
retentionPolicy: {
|
|
serializedName: "RetentionPolicy",
|
|
xmlName: "RetentionPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "RetentionPolicy",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const CorsRule = {
|
|
serializedName: "CorsRule",
|
|
type: {
|
|
name: "Composite",
|
|
className: "CorsRule",
|
|
modelProperties: {
|
|
allowedOrigins: {
|
|
serializedName: "AllowedOrigins",
|
|
required: true,
|
|
xmlName: "AllowedOrigins",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
allowedMethods: {
|
|
serializedName: "AllowedMethods",
|
|
required: true,
|
|
xmlName: "AllowedMethods",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
allowedHeaders: {
|
|
serializedName: "AllowedHeaders",
|
|
required: true,
|
|
xmlName: "AllowedHeaders",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
exposedHeaders: {
|
|
serializedName: "ExposedHeaders",
|
|
required: true,
|
|
xmlName: "ExposedHeaders",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
maxAgeInSeconds: {
|
|
constraints: {
|
|
InclusiveMinimum: 0,
|
|
},
|
|
serializedName: "MaxAgeInSeconds",
|
|
required: true,
|
|
xmlName: "MaxAgeInSeconds",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const StaticWebsite = {
|
|
serializedName: "StaticWebsite",
|
|
type: {
|
|
name: "Composite",
|
|
className: "StaticWebsite",
|
|
modelProperties: {
|
|
enabled: {
|
|
serializedName: "Enabled",
|
|
required: true,
|
|
xmlName: "Enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
indexDocument: {
|
|
serializedName: "IndexDocument",
|
|
xmlName: "IndexDocument",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorDocument404Path: {
|
|
serializedName: "ErrorDocument404Path",
|
|
xmlName: "ErrorDocument404Path",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
defaultIndexDocumentPath: {
|
|
serializedName: "DefaultIndexDocumentPath",
|
|
xmlName: "DefaultIndexDocumentPath",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const StorageError = {
|
|
serializedName: "StorageError",
|
|
type: {
|
|
name: "Composite",
|
|
className: "StorageError",
|
|
modelProperties: {
|
|
message: {
|
|
serializedName: "Message",
|
|
xmlName: "Message",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "CopySourceStatusCode",
|
|
xmlName: "CopySourceStatusCode",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "CopySourceErrorCode",
|
|
xmlName: "CopySourceErrorCode",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorMessage: {
|
|
serializedName: "CopySourceErrorMessage",
|
|
xmlName: "CopySourceErrorMessage",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
code: {
|
|
serializedName: "Code",
|
|
xmlName: "Code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
authenticationErrorDetail: {
|
|
serializedName: "AuthenticationErrorDetail",
|
|
xmlName: "AuthenticationErrorDetail",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobServiceStatistics = {
|
|
serializedName: "BlobServiceStatistics",
|
|
xmlName: "StorageServiceStats",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobServiceStatistics",
|
|
modelProperties: {
|
|
geoReplication: {
|
|
serializedName: "GeoReplication",
|
|
xmlName: "GeoReplication",
|
|
type: {
|
|
name: "Composite",
|
|
className: "GeoReplication",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const GeoReplication = {
|
|
serializedName: "GeoReplication",
|
|
type: {
|
|
name: "Composite",
|
|
className: "GeoReplication",
|
|
modelProperties: {
|
|
status: {
|
|
serializedName: "Status",
|
|
required: true,
|
|
xmlName: "Status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["live", "bootstrap", "unavailable"],
|
|
},
|
|
},
|
|
lastSyncOn: {
|
|
serializedName: "LastSyncTime",
|
|
required: true,
|
|
xmlName: "LastSyncTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ListContainersSegmentResponse = {
|
|
serializedName: "ListContainersSegmentResponse",
|
|
xmlName: "EnumerationResults",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ListContainersSegmentResponse",
|
|
modelProperties: {
|
|
serviceEndpoint: {
|
|
serializedName: "ServiceEndpoint",
|
|
required: true,
|
|
xmlName: "ServiceEndpoint",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
prefix: {
|
|
serializedName: "Prefix",
|
|
xmlName: "Prefix",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
marker: {
|
|
serializedName: "Marker",
|
|
xmlName: "Marker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
maxPageSize: {
|
|
serializedName: "MaxResults",
|
|
xmlName: "MaxResults",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
containerItems: {
|
|
serializedName: "ContainerItems",
|
|
required: true,
|
|
xmlName: "Containers",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Container",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerItem",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
continuationToken: {
|
|
serializedName: "NextMarker",
|
|
xmlName: "NextMarker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerItem = {
|
|
serializedName: "ContainerItem",
|
|
xmlName: "Container",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerItem",
|
|
modelProperties: {
|
|
name: {
|
|
serializedName: "Name",
|
|
required: true,
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
deleted: {
|
|
serializedName: "Deleted",
|
|
xmlName: "Deleted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "Version",
|
|
xmlName: "Version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
properties: {
|
|
serializedName: "Properties",
|
|
xmlName: "Properties",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerProperties",
|
|
},
|
|
},
|
|
metadata: {
|
|
serializedName: "Metadata",
|
|
xmlName: "Metadata",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerProperties = {
|
|
serializedName: "ContainerProperties",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerProperties",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "Last-Modified",
|
|
required: true,
|
|
xmlName: "Last-Modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "Etag",
|
|
required: true,
|
|
xmlName: "Etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "LeaseStatus",
|
|
xmlName: "LeaseStatus",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "LeaseState",
|
|
xmlName: "LeaseState",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "LeaseDuration",
|
|
xmlName: "LeaseDuration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
publicAccess: {
|
|
serializedName: "PublicAccess",
|
|
xmlName: "PublicAccess",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["container", "blob"],
|
|
},
|
|
},
|
|
hasImmutabilityPolicy: {
|
|
serializedName: "HasImmutabilityPolicy",
|
|
xmlName: "HasImmutabilityPolicy",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
hasLegalHold: {
|
|
serializedName: "HasLegalHold",
|
|
xmlName: "HasLegalHold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
defaultEncryptionScope: {
|
|
serializedName: "DefaultEncryptionScope",
|
|
xmlName: "DefaultEncryptionScope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
preventEncryptionScopeOverride: {
|
|
serializedName: "DenyEncryptionScopeOverride",
|
|
xmlName: "DenyEncryptionScopeOverride",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
deletedOn: {
|
|
serializedName: "DeletedTime",
|
|
xmlName: "DeletedTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
remainingRetentionDays: {
|
|
serializedName: "RemainingRetentionDays",
|
|
xmlName: "RemainingRetentionDays",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isImmutableStorageWithVersioningEnabled: {
|
|
serializedName: "ImmutableStorageWithVersioningEnabled",
|
|
xmlName: "ImmutableStorageWithVersioningEnabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const KeyInfo = {
|
|
serializedName: "KeyInfo",
|
|
type: {
|
|
name: "Composite",
|
|
className: "KeyInfo",
|
|
modelProperties: {
|
|
startsOn: {
|
|
serializedName: "Start",
|
|
required: true,
|
|
xmlName: "Start",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
expiresOn: {
|
|
serializedName: "Expiry",
|
|
required: true,
|
|
xmlName: "Expiry",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
delegatedUserTid: {
|
|
serializedName: "DelegatedUserTid",
|
|
xmlName: "DelegatedUserTid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const UserDelegationKey = {
|
|
serializedName: "UserDelegationKey",
|
|
type: {
|
|
name: "Composite",
|
|
className: "UserDelegationKey",
|
|
modelProperties: {
|
|
signedObjectId: {
|
|
serializedName: "SignedOid",
|
|
required: true,
|
|
xmlName: "SignedOid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedTenantId: {
|
|
serializedName: "SignedTid",
|
|
required: true,
|
|
xmlName: "SignedTid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedStartsOn: {
|
|
serializedName: "SignedStart",
|
|
required: true,
|
|
xmlName: "SignedStart",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedExpiresOn: {
|
|
serializedName: "SignedExpiry",
|
|
required: true,
|
|
xmlName: "SignedExpiry",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedService: {
|
|
serializedName: "SignedService",
|
|
required: true,
|
|
xmlName: "SignedService",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedVersion: {
|
|
serializedName: "SignedVersion",
|
|
required: true,
|
|
xmlName: "SignedVersion",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
signedDelegatedUserTenantId: {
|
|
serializedName: "SignedDelegatedUserTid",
|
|
xmlName: "SignedDelegatedUserTid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
value: {
|
|
serializedName: "Value",
|
|
required: true,
|
|
xmlName: "Value",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const FilterBlobSegment = {
|
|
serializedName: "FilterBlobSegment",
|
|
xmlName: "EnumerationResults",
|
|
type: {
|
|
name: "Composite",
|
|
className: "FilterBlobSegment",
|
|
modelProperties: {
|
|
serviceEndpoint: {
|
|
serializedName: "ServiceEndpoint",
|
|
required: true,
|
|
xmlName: "ServiceEndpoint",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
where: {
|
|
serializedName: "Where",
|
|
required: true,
|
|
xmlName: "Where",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobs: {
|
|
serializedName: "Blobs",
|
|
required: true,
|
|
xmlName: "Blobs",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Blob",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "FilterBlobItem",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
continuationToken: {
|
|
serializedName: "NextMarker",
|
|
xmlName: "NextMarker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const FilterBlobItem = {
|
|
serializedName: "FilterBlobItem",
|
|
xmlName: "Blob",
|
|
type: {
|
|
name: "Composite",
|
|
className: "FilterBlobItem",
|
|
modelProperties: {
|
|
name: {
|
|
serializedName: "Name",
|
|
required: true,
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
containerName: {
|
|
serializedName: "ContainerName",
|
|
required: true,
|
|
xmlName: "ContainerName",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
tags: {
|
|
serializedName: "Tags",
|
|
xmlName: "Tags",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobTags",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobTags = {
|
|
serializedName: "BlobTags",
|
|
xmlName: "Tags",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobTags",
|
|
modelProperties: {
|
|
blobTagSet: {
|
|
serializedName: "BlobTagSet",
|
|
required: true,
|
|
xmlName: "TagSet",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Tag",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobTag",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobTag = {
|
|
serializedName: "BlobTag",
|
|
xmlName: "Tag",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobTag",
|
|
modelProperties: {
|
|
key: {
|
|
serializedName: "Key",
|
|
required: true,
|
|
xmlName: "Key",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
value: {
|
|
serializedName: "Value",
|
|
required: true,
|
|
xmlName: "Value",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const SignedIdentifier = {
|
|
serializedName: "SignedIdentifier",
|
|
xmlName: "SignedIdentifier",
|
|
type: {
|
|
name: "Composite",
|
|
className: "SignedIdentifier",
|
|
modelProperties: {
|
|
id: {
|
|
serializedName: "Id",
|
|
required: true,
|
|
xmlName: "Id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
accessPolicy: {
|
|
serializedName: "AccessPolicy",
|
|
xmlName: "AccessPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AccessPolicy",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AccessPolicy = {
|
|
serializedName: "AccessPolicy",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AccessPolicy",
|
|
modelProperties: {
|
|
startsOn: {
|
|
serializedName: "Start",
|
|
xmlName: "Start",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
expiresOn: {
|
|
serializedName: "Expiry",
|
|
xmlName: "Expiry",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
permissions: {
|
|
serializedName: "Permission",
|
|
xmlName: "Permission",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ListBlobsFlatSegmentResponse = {
|
|
serializedName: "ListBlobsFlatSegmentResponse",
|
|
xmlName: "EnumerationResults",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ListBlobsFlatSegmentResponse",
|
|
modelProperties: {
|
|
serviceEndpoint: {
|
|
serializedName: "ServiceEndpoint",
|
|
required: true,
|
|
xmlName: "ServiceEndpoint",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
containerName: {
|
|
serializedName: "ContainerName",
|
|
required: true,
|
|
xmlName: "ContainerName",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
prefix: {
|
|
serializedName: "Prefix",
|
|
xmlName: "Prefix",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
marker: {
|
|
serializedName: "Marker",
|
|
xmlName: "Marker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
maxPageSize: {
|
|
serializedName: "MaxResults",
|
|
xmlName: "MaxResults",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
segment: {
|
|
serializedName: "Segment",
|
|
xmlName: "Blobs",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobFlatListSegment",
|
|
},
|
|
},
|
|
continuationToken: {
|
|
serializedName: "NextMarker",
|
|
xmlName: "NextMarker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobFlatListSegment = {
|
|
serializedName: "BlobFlatListSegment",
|
|
xmlName: "Blobs",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobFlatListSegment",
|
|
modelProperties: {
|
|
blobItems: {
|
|
serializedName: "BlobItems",
|
|
required: true,
|
|
xmlName: "BlobItems",
|
|
xmlElementName: "Blob",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobItemInternal",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobItemInternal = {
|
|
serializedName: "BlobItemInternal",
|
|
xmlName: "Blob",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobItemInternal",
|
|
modelProperties: {
|
|
name: {
|
|
serializedName: "Name",
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobName",
|
|
},
|
|
},
|
|
deleted: {
|
|
serializedName: "Deleted",
|
|
required: true,
|
|
xmlName: "Deleted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
snapshot: {
|
|
serializedName: "Snapshot",
|
|
required: true,
|
|
xmlName: "Snapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "VersionId",
|
|
xmlName: "VersionId",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
isCurrentVersion: {
|
|
serializedName: "IsCurrentVersion",
|
|
xmlName: "IsCurrentVersion",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
properties: {
|
|
serializedName: "Properties",
|
|
xmlName: "Properties",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobPropertiesInternal",
|
|
},
|
|
},
|
|
metadata: {
|
|
serializedName: "Metadata",
|
|
xmlName: "Metadata",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
blobTags: {
|
|
serializedName: "BlobTags",
|
|
xmlName: "Tags",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobTags",
|
|
},
|
|
},
|
|
objectReplicationMetadata: {
|
|
serializedName: "ObjectReplicationMetadata",
|
|
xmlName: "OrMetadata",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
hasVersionsOnly: {
|
|
serializedName: "HasVersionsOnly",
|
|
xmlName: "HasVersionsOnly",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobName = {
|
|
serializedName: "BlobName",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobName",
|
|
modelProperties: {
|
|
encoded: {
|
|
serializedName: "Encoded",
|
|
xmlName: "Encoded",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
content: {
|
|
serializedName: "content",
|
|
xmlName: "content",
|
|
xmlIsMsText: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobPropertiesInternal = {
|
|
serializedName: "BlobPropertiesInternal",
|
|
xmlName: "Properties",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobPropertiesInternal",
|
|
modelProperties: {
|
|
createdOn: {
|
|
serializedName: "Creation-Time",
|
|
xmlName: "Creation-Time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "Last-Modified",
|
|
required: true,
|
|
xmlName: "Last-Modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "Etag",
|
|
required: true,
|
|
xmlName: "Etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentLength: {
|
|
serializedName: "Content-Length",
|
|
xmlName: "Content-Length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
contentType: {
|
|
serializedName: "Content-Type",
|
|
xmlName: "Content-Type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentEncoding: {
|
|
serializedName: "Content-Encoding",
|
|
xmlName: "Content-Encoding",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentLanguage: {
|
|
serializedName: "Content-Language",
|
|
xmlName: "Content-Language",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "Content-MD5",
|
|
xmlName: "Content-MD5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
contentDisposition: {
|
|
serializedName: "Content-Disposition",
|
|
xmlName: "Content-Disposition",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
cacheControl: {
|
|
serializedName: "Cache-Control",
|
|
xmlName: "Cache-Control",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
blobType: {
|
|
serializedName: "BlobType",
|
|
xmlName: "BlobType",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "LeaseStatus",
|
|
xmlName: "LeaseStatus",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "LeaseState",
|
|
xmlName: "LeaseState",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "LeaseDuration",
|
|
xmlName: "LeaseDuration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "CopyId",
|
|
xmlName: "CopyId",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "CopyStatus",
|
|
xmlName: "CopyStatus",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
copySource: {
|
|
serializedName: "CopySource",
|
|
xmlName: "CopySource",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyProgress: {
|
|
serializedName: "CopyProgress",
|
|
xmlName: "CopyProgress",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyCompletedOn: {
|
|
serializedName: "CopyCompletionTime",
|
|
xmlName: "CopyCompletionTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyStatusDescription: {
|
|
serializedName: "CopyStatusDescription",
|
|
xmlName: "CopyStatusDescription",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
serverEncrypted: {
|
|
serializedName: "ServerEncrypted",
|
|
xmlName: "ServerEncrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
incrementalCopy: {
|
|
serializedName: "IncrementalCopy",
|
|
xmlName: "IncrementalCopy",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
destinationSnapshot: {
|
|
serializedName: "DestinationSnapshot",
|
|
xmlName: "DestinationSnapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
deletedOn: {
|
|
serializedName: "DeletedTime",
|
|
xmlName: "DeletedTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
remainingRetentionDays: {
|
|
serializedName: "RemainingRetentionDays",
|
|
xmlName: "RemainingRetentionDays",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
accessTier: {
|
|
serializedName: "AccessTier",
|
|
xmlName: "AccessTier",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"P4",
|
|
"P6",
|
|
"P10",
|
|
"P15",
|
|
"P20",
|
|
"P30",
|
|
"P40",
|
|
"P50",
|
|
"P60",
|
|
"P70",
|
|
"P80",
|
|
"Hot",
|
|
"Cool",
|
|
"Archive",
|
|
"Cold",
|
|
"Smart",
|
|
],
|
|
},
|
|
},
|
|
accessTierInferred: {
|
|
serializedName: "AccessTierInferred",
|
|
xmlName: "AccessTierInferred",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
archiveStatus: {
|
|
serializedName: "ArchiveStatus",
|
|
xmlName: "ArchiveStatus",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"rehydrate-pending-to-hot",
|
|
"rehydrate-pending-to-cool",
|
|
"rehydrate-pending-to-cold",
|
|
"rehydrate-pending-to-smart",
|
|
],
|
|
},
|
|
},
|
|
smartAccessTier: {
|
|
serializedName: "SmartAccessTier",
|
|
xmlName: "SmartAccessTier",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"P4",
|
|
"P6",
|
|
"P10",
|
|
"P15",
|
|
"P20",
|
|
"P30",
|
|
"P40",
|
|
"P50",
|
|
"P60",
|
|
"P70",
|
|
"P80",
|
|
"Hot",
|
|
"Cool",
|
|
"Archive",
|
|
"Cold",
|
|
"Smart",
|
|
],
|
|
},
|
|
},
|
|
customerProvidedKeySha256: {
|
|
serializedName: "CustomerProvidedKeySha256",
|
|
xmlName: "CustomerProvidedKeySha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "EncryptionScope",
|
|
xmlName: "EncryptionScope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
accessTierChangedOn: {
|
|
serializedName: "AccessTierChangeTime",
|
|
xmlName: "AccessTierChangeTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
tagCount: {
|
|
serializedName: "TagCount",
|
|
xmlName: "TagCount",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
expiresOn: {
|
|
serializedName: "Expiry-Time",
|
|
xmlName: "Expiry-Time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isSealed: {
|
|
serializedName: "Sealed",
|
|
xmlName: "Sealed",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
rehydratePriority: {
|
|
serializedName: "RehydratePriority",
|
|
xmlName: "RehydratePriority",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["High", "Standard"],
|
|
},
|
|
},
|
|
lastAccessedOn: {
|
|
serializedName: "LastAccessTime",
|
|
xmlName: "LastAccessTime",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyExpiresOn: {
|
|
serializedName: "ImmutabilityPolicyUntilDate",
|
|
xmlName: "ImmutabilityPolicyUntilDate",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyMode: {
|
|
serializedName: "ImmutabilityPolicyMode",
|
|
xmlName: "ImmutabilityPolicyMode",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["Mutable", "Unlocked", "Locked"],
|
|
},
|
|
},
|
|
legalHold: {
|
|
serializedName: "LegalHold",
|
|
xmlName: "LegalHold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ListBlobsHierarchySegmentResponse = {
|
|
serializedName: "ListBlobsHierarchySegmentResponse",
|
|
xmlName: "EnumerationResults",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ListBlobsHierarchySegmentResponse",
|
|
modelProperties: {
|
|
serviceEndpoint: {
|
|
serializedName: "ServiceEndpoint",
|
|
required: true,
|
|
xmlName: "ServiceEndpoint",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
containerName: {
|
|
serializedName: "ContainerName",
|
|
required: true,
|
|
xmlName: "ContainerName",
|
|
xmlIsAttribute: true,
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
prefix: {
|
|
serializedName: "Prefix",
|
|
xmlName: "Prefix",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
marker: {
|
|
serializedName: "Marker",
|
|
xmlName: "Marker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
maxPageSize: {
|
|
serializedName: "MaxResults",
|
|
xmlName: "MaxResults",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
delimiter: {
|
|
serializedName: "Delimiter",
|
|
xmlName: "Delimiter",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
segment: {
|
|
serializedName: "Segment",
|
|
xmlName: "Blobs",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobHierarchyListSegment",
|
|
},
|
|
},
|
|
continuationToken: {
|
|
serializedName: "NextMarker",
|
|
xmlName: "NextMarker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobHierarchyListSegment = {
|
|
serializedName: "BlobHierarchyListSegment",
|
|
xmlName: "Blobs",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobHierarchyListSegment",
|
|
modelProperties: {
|
|
blobPrefixes: {
|
|
serializedName: "BlobPrefixes",
|
|
xmlName: "BlobPrefixes",
|
|
xmlElementName: "BlobPrefix",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobPrefix",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
blobItems: {
|
|
serializedName: "BlobItems",
|
|
required: true,
|
|
xmlName: "BlobItems",
|
|
xmlElementName: "Blob",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobItemInternal",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobPrefix = {
|
|
serializedName: "BlobPrefix",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobPrefix",
|
|
modelProperties: {
|
|
name: {
|
|
serializedName: "Name",
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobName",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockLookupList = {
|
|
serializedName: "BlockLookupList",
|
|
xmlName: "BlockList",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockLookupList",
|
|
modelProperties: {
|
|
committed: {
|
|
serializedName: "Committed",
|
|
xmlName: "Committed",
|
|
xmlElementName: "Committed",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
uncommitted: {
|
|
serializedName: "Uncommitted",
|
|
xmlName: "Uncommitted",
|
|
xmlElementName: "Uncommitted",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
latest: {
|
|
serializedName: "Latest",
|
|
xmlName: "Latest",
|
|
xmlElementName: "Latest",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockList = {
|
|
serializedName: "BlockList",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockList",
|
|
modelProperties: {
|
|
committedBlocks: {
|
|
serializedName: "CommittedBlocks",
|
|
xmlName: "CommittedBlocks",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Block",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "Block",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
uncommittedBlocks: {
|
|
serializedName: "UncommittedBlocks",
|
|
xmlName: "UncommittedBlocks",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Block",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "Block",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const Block = {
|
|
serializedName: "Block",
|
|
type: {
|
|
name: "Composite",
|
|
className: "Block",
|
|
modelProperties: {
|
|
name: {
|
|
serializedName: "Name",
|
|
required: true,
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
size: {
|
|
serializedName: "Size",
|
|
required: true,
|
|
xmlName: "Size",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageList = {
|
|
serializedName: "PageList",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageList",
|
|
modelProperties: {
|
|
pageRange: {
|
|
serializedName: "PageRange",
|
|
xmlName: "PageRange",
|
|
xmlElementName: "PageRange",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageRange",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
clearRange: {
|
|
serializedName: "ClearRange",
|
|
xmlName: "ClearRange",
|
|
xmlElementName: "ClearRange",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "ClearRange",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
continuationToken: {
|
|
serializedName: "NextMarker",
|
|
xmlName: "NextMarker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageRange = {
|
|
serializedName: "PageRange",
|
|
xmlName: "PageRange",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageRange",
|
|
modelProperties: {
|
|
start: {
|
|
serializedName: "Start",
|
|
required: true,
|
|
xmlName: "Start",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
end: {
|
|
serializedName: "End",
|
|
required: true,
|
|
xmlName: "End",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ClearRange = {
|
|
serializedName: "ClearRange",
|
|
xmlName: "ClearRange",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ClearRange",
|
|
modelProperties: {
|
|
start: {
|
|
serializedName: "Start",
|
|
required: true,
|
|
xmlName: "Start",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
end: {
|
|
serializedName: "End",
|
|
required: true,
|
|
xmlName: "End",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const QueryRequest = {
|
|
serializedName: "QueryRequest",
|
|
xmlName: "QueryRequest",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QueryRequest",
|
|
modelProperties: {
|
|
queryType: {
|
|
serializedName: "QueryType",
|
|
required: true,
|
|
xmlName: "QueryType",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
expression: {
|
|
serializedName: "Expression",
|
|
required: true,
|
|
xmlName: "Expression",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
inputSerialization: {
|
|
serializedName: "InputSerialization",
|
|
xmlName: "InputSerialization",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QuerySerialization",
|
|
},
|
|
},
|
|
outputSerialization: {
|
|
serializedName: "OutputSerialization",
|
|
xmlName: "OutputSerialization",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QuerySerialization",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const QuerySerialization = {
|
|
serializedName: "QuerySerialization",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QuerySerialization",
|
|
modelProperties: {
|
|
format: {
|
|
serializedName: "Format",
|
|
xmlName: "Format",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QueryFormat",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const QueryFormat = {
|
|
serializedName: "QueryFormat",
|
|
type: {
|
|
name: "Composite",
|
|
className: "QueryFormat",
|
|
modelProperties: {
|
|
type: {
|
|
serializedName: "Type",
|
|
required: true,
|
|
xmlName: "Type",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["delimited", "json", "arrow", "parquet"],
|
|
},
|
|
},
|
|
delimitedTextConfiguration: {
|
|
serializedName: "DelimitedTextConfiguration",
|
|
xmlName: "DelimitedTextConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "DelimitedTextConfiguration",
|
|
},
|
|
},
|
|
jsonTextConfiguration: {
|
|
serializedName: "JsonTextConfiguration",
|
|
xmlName: "JsonTextConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "JsonTextConfiguration",
|
|
},
|
|
},
|
|
arrowConfiguration: {
|
|
serializedName: "ArrowConfiguration",
|
|
xmlName: "ArrowConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ArrowConfiguration",
|
|
},
|
|
},
|
|
parquetTextConfiguration: {
|
|
serializedName: "ParquetTextConfiguration",
|
|
xmlName: "ParquetTextConfiguration",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "any" } },
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const DelimitedTextConfiguration = {
|
|
serializedName: "DelimitedTextConfiguration",
|
|
xmlName: "DelimitedTextConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "DelimitedTextConfiguration",
|
|
modelProperties: {
|
|
columnSeparator: {
|
|
serializedName: "ColumnSeparator",
|
|
xmlName: "ColumnSeparator",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
fieldQuote: {
|
|
serializedName: "FieldQuote",
|
|
xmlName: "FieldQuote",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
recordSeparator: {
|
|
serializedName: "RecordSeparator",
|
|
xmlName: "RecordSeparator",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
escapeChar: {
|
|
serializedName: "EscapeChar",
|
|
xmlName: "EscapeChar",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
headersPresent: {
|
|
serializedName: "HeadersPresent",
|
|
xmlName: "HasHeaders",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const JsonTextConfiguration = {
|
|
serializedName: "JsonTextConfiguration",
|
|
xmlName: "JsonTextConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "JsonTextConfiguration",
|
|
modelProperties: {
|
|
recordSeparator: {
|
|
serializedName: "RecordSeparator",
|
|
xmlName: "RecordSeparator",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ArrowConfiguration = {
|
|
serializedName: "ArrowConfiguration",
|
|
xmlName: "ArrowConfiguration",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ArrowConfiguration",
|
|
modelProperties: {
|
|
schema: {
|
|
serializedName: "Schema",
|
|
required: true,
|
|
xmlName: "Schema",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "Field",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "ArrowField",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ArrowField = {
|
|
serializedName: "ArrowField",
|
|
xmlName: "Field",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ArrowField",
|
|
modelProperties: {
|
|
type: {
|
|
serializedName: "Type",
|
|
required: true,
|
|
xmlName: "Type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
name: {
|
|
serializedName: "Name",
|
|
xmlName: "Name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
precision: {
|
|
serializedName: "Precision",
|
|
xmlName: "Precision",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
scale: {
|
|
serializedName: "Scale",
|
|
xmlName: "Scale",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceSetPropertiesHeaders = {
|
|
serializedName: "Service_setPropertiesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceSetPropertiesHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceSetPropertiesExceptionHeaders = {
|
|
serializedName: "Service_setPropertiesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceSetPropertiesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetPropertiesHeaders = {
|
|
serializedName: "Service_getPropertiesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetPropertiesHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetPropertiesExceptionHeaders = {
|
|
serializedName: "Service_getPropertiesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetPropertiesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetStatisticsHeaders = {
|
|
serializedName: "Service_getStatisticsHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetStatisticsHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetStatisticsExceptionHeaders = {
|
|
serializedName: "Service_getStatisticsExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetStatisticsExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceListContainersSegmentHeaders = {
|
|
serializedName: "Service_listContainersSegmentHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceListContainersSegmentHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceListContainersSegmentExceptionHeaders = {
|
|
serializedName: "Service_listContainersSegmentExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceListContainersSegmentExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetUserDelegationKeyHeaders = {
|
|
serializedName: "Service_getUserDelegationKeyHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetUserDelegationKeyHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetUserDelegationKeyExceptionHeaders = {
|
|
serializedName: "Service_getUserDelegationKeyExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetUserDelegationKeyExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetAccountInfoHeaders = {
|
|
serializedName: "Service_getAccountInfoHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetAccountInfoHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
skuName: {
|
|
serializedName: "x-ms-sku-name",
|
|
xmlName: "x-ms-sku-name",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Standard_LRS",
|
|
"Standard_GRS",
|
|
"Standard_RAGRS",
|
|
"Standard_ZRS",
|
|
"Premium_LRS",
|
|
"Standard_GZRS",
|
|
"Premium_ZRS",
|
|
"Standard_RAGZRS",
|
|
],
|
|
},
|
|
},
|
|
accountKind: {
|
|
serializedName: "x-ms-account-kind",
|
|
xmlName: "x-ms-account-kind",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Storage",
|
|
"BlobStorage",
|
|
"StorageV2",
|
|
"FileStorage",
|
|
"BlockBlobStorage",
|
|
],
|
|
},
|
|
},
|
|
isHierarchicalNamespaceEnabled: {
|
|
serializedName: "x-ms-is-hns-enabled",
|
|
xmlName: "x-ms-is-hns-enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceGetAccountInfoExceptionHeaders = {
|
|
serializedName: "Service_getAccountInfoExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceGetAccountInfoExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceSubmitBatchHeaders = {
|
|
serializedName: "Service_submitBatchHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceSubmitBatchHeaders",
|
|
modelProperties: {
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceSubmitBatchExceptionHeaders = {
|
|
serializedName: "Service_submitBatchExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceSubmitBatchExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceFilterBlobsHeaders = {
|
|
serializedName: "Service_filterBlobsHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceFilterBlobsHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ServiceFilterBlobsExceptionHeaders = {
|
|
serializedName: "Service_filterBlobsExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ServiceFilterBlobsExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerCreateHeaders = {
|
|
serializedName: "Container_createHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerCreateHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerCreateExceptionHeaders = {
|
|
serializedName: "Container_createExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerCreateExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetPropertiesHeaders = {
|
|
serializedName: "Container_getPropertiesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetPropertiesHeaders",
|
|
modelProperties: {
|
|
metadata: {
|
|
serializedName: "x-ms-meta",
|
|
headerCollectionPrefix: "x-ms-meta-",
|
|
xmlName: "x-ms-meta",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "x-ms-lease-duration",
|
|
xmlName: "x-ms-lease-duration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "x-ms-lease-state",
|
|
xmlName: "x-ms-lease-state",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "x-ms-lease-status",
|
|
xmlName: "x-ms-lease-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobPublicAccess: {
|
|
serializedName: "x-ms-blob-public-access",
|
|
xmlName: "x-ms-blob-public-access",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["container", "blob"],
|
|
},
|
|
},
|
|
hasImmutabilityPolicy: {
|
|
serializedName: "x-ms-has-immutability-policy",
|
|
xmlName: "x-ms-has-immutability-policy",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
hasLegalHold: {
|
|
serializedName: "x-ms-has-legal-hold",
|
|
xmlName: "x-ms-has-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
defaultEncryptionScope: {
|
|
serializedName: "x-ms-default-encryption-scope",
|
|
xmlName: "x-ms-default-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
denyEncryptionScopeOverride: {
|
|
serializedName: "x-ms-deny-encryption-scope-override",
|
|
xmlName: "x-ms-deny-encryption-scope-override",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
isImmutableStorageWithVersioningEnabled: {
|
|
serializedName: "x-ms-immutable-storage-with-versioning-enabled",
|
|
xmlName: "x-ms-immutable-storage-with-versioning-enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetPropertiesExceptionHeaders = {
|
|
serializedName: "Container_getPropertiesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetPropertiesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerDeleteHeaders = {
|
|
serializedName: "Container_deleteHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerDeleteHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerDeleteExceptionHeaders = {
|
|
serializedName: "Container_deleteExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerDeleteExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSetMetadataHeaders = {
|
|
serializedName: "Container_setMetadataHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSetMetadataHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSetMetadataExceptionHeaders = {
|
|
serializedName: "Container_setMetadataExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSetMetadataExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetAccessPolicyHeaders = {
|
|
serializedName: "Container_getAccessPolicyHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetAccessPolicyHeaders",
|
|
modelProperties: {
|
|
blobPublicAccess: {
|
|
serializedName: "x-ms-blob-public-access",
|
|
xmlName: "x-ms-blob-public-access",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["container", "blob"],
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetAccessPolicyExceptionHeaders = {
|
|
serializedName: "Container_getAccessPolicyExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetAccessPolicyExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSetAccessPolicyHeaders = {
|
|
serializedName: "Container_setAccessPolicyHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSetAccessPolicyHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSetAccessPolicyExceptionHeaders = {
|
|
serializedName: "Container_setAccessPolicyExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSetAccessPolicyExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRestoreHeaders = {
|
|
serializedName: "Container_restoreHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRestoreHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRestoreExceptionHeaders = {
|
|
serializedName: "Container_restoreExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRestoreExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRenameHeaders = {
|
|
serializedName: "Container_renameHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRenameHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRenameExceptionHeaders = {
|
|
serializedName: "Container_renameExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRenameExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSubmitBatchHeaders = {
|
|
serializedName: "Container_submitBatchHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSubmitBatchHeaders",
|
|
modelProperties: {
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerSubmitBatchExceptionHeaders = {
|
|
serializedName: "Container_submitBatchExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerSubmitBatchExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerFilterBlobsHeaders = {
|
|
serializedName: "Container_filterBlobsHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerFilterBlobsHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerFilterBlobsExceptionHeaders = {
|
|
serializedName: "Container_filterBlobsExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerFilterBlobsExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerAcquireLeaseHeaders = {
|
|
serializedName: "Container_acquireLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerAcquireLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerAcquireLeaseExceptionHeaders = {
|
|
serializedName: "Container_acquireLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerAcquireLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerReleaseLeaseHeaders = {
|
|
serializedName: "Container_releaseLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerReleaseLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerReleaseLeaseExceptionHeaders = {
|
|
serializedName: "Container_releaseLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerReleaseLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRenewLeaseHeaders = {
|
|
serializedName: "Container_renewLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRenewLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerRenewLeaseExceptionHeaders = {
|
|
serializedName: "Container_renewLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerRenewLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerBreakLeaseHeaders = {
|
|
serializedName: "Container_breakLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerBreakLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseTime: {
|
|
serializedName: "x-ms-lease-time",
|
|
xmlName: "x-ms-lease-time",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerBreakLeaseExceptionHeaders = {
|
|
serializedName: "Container_breakLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerBreakLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerChangeLeaseHeaders = {
|
|
serializedName: "Container_changeLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerChangeLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerChangeLeaseExceptionHeaders = {
|
|
serializedName: "Container_changeLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerChangeLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerListBlobFlatSegmentHeaders = {
|
|
serializedName: "Container_listBlobFlatSegmentHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerListBlobFlatSegmentHeaders",
|
|
modelProperties: {
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerListBlobFlatSegmentExceptionHeaders = {
|
|
serializedName: "Container_listBlobFlatSegmentExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerListBlobFlatSegmentExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerListBlobHierarchySegmentHeaders = {
|
|
serializedName: "Container_listBlobHierarchySegmentHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerListBlobHierarchySegmentHeaders",
|
|
modelProperties: {
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerListBlobHierarchySegmentExceptionHeaders = {
|
|
serializedName: "Container_listBlobHierarchySegmentExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerListBlobHierarchySegmentExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetAccountInfoHeaders = {
|
|
serializedName: "Container_getAccountInfoHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetAccountInfoHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
skuName: {
|
|
serializedName: "x-ms-sku-name",
|
|
xmlName: "x-ms-sku-name",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Standard_LRS",
|
|
"Standard_GRS",
|
|
"Standard_RAGRS",
|
|
"Standard_ZRS",
|
|
"Premium_LRS",
|
|
"Standard_GZRS",
|
|
"Premium_ZRS",
|
|
"Standard_RAGZRS",
|
|
],
|
|
},
|
|
},
|
|
accountKind: {
|
|
serializedName: "x-ms-account-kind",
|
|
xmlName: "x-ms-account-kind",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Storage",
|
|
"BlobStorage",
|
|
"StorageV2",
|
|
"FileStorage",
|
|
"BlockBlobStorage",
|
|
],
|
|
},
|
|
},
|
|
isHierarchicalNamespaceEnabled: {
|
|
serializedName: "x-ms-is-hns-enabled",
|
|
xmlName: "x-ms-is-hns-enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const ContainerGetAccountInfoExceptionHeaders = {
|
|
serializedName: "Container_getAccountInfoExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "ContainerGetAccountInfoExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDownloadHeaders = {
|
|
serializedName: "Blob_downloadHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDownloadHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
createdOn: {
|
|
serializedName: "x-ms-creation-time",
|
|
xmlName: "x-ms-creation-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
metadata: {
|
|
serializedName: "x-ms-meta",
|
|
headerCollectionPrefix: "x-ms-meta-",
|
|
xmlName: "x-ms-meta",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
objectReplicationPolicyId: {
|
|
serializedName: "x-ms-or-policy-id",
|
|
xmlName: "x-ms-or-policy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
objectReplicationRules: {
|
|
serializedName: "x-ms-or",
|
|
headerCollectionPrefix: "x-ms-or-",
|
|
xmlName: "x-ms-or",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
contentLength: {
|
|
serializedName: "content-length",
|
|
xmlName: "content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentRange: {
|
|
serializedName: "content-range",
|
|
xmlName: "content-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
contentEncoding: {
|
|
serializedName: "content-encoding",
|
|
xmlName: "content-encoding",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
cacheControl: {
|
|
serializedName: "cache-control",
|
|
xmlName: "cache-control",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentDisposition: {
|
|
serializedName: "content-disposition",
|
|
xmlName: "content-disposition",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentLanguage: {
|
|
serializedName: "content-language",
|
|
xmlName: "content-language",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
blobType: {
|
|
serializedName: "x-ms-blob-type",
|
|
xmlName: "x-ms-blob-type",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
|
|
},
|
|
},
|
|
copyCompletedOn: {
|
|
serializedName: "x-ms-copy-completion-time",
|
|
xmlName: "x-ms-copy-completion-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyStatusDescription: {
|
|
serializedName: "x-ms-copy-status-description",
|
|
xmlName: "x-ms-copy-status-description",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyProgress: {
|
|
serializedName: "x-ms-copy-progress",
|
|
xmlName: "x-ms-copy-progress",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySource: {
|
|
serializedName: "x-ms-copy-source",
|
|
xmlName: "x-ms-copy-source",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "x-ms-copy-status",
|
|
xmlName: "x-ms-copy-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "x-ms-lease-duration",
|
|
xmlName: "x-ms-lease-duration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "x-ms-lease-state",
|
|
xmlName: "x-ms-lease-state",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "x-ms-lease-status",
|
|
xmlName: "x-ms-lease-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
isCurrentVersion: {
|
|
serializedName: "x-ms-is-current-version",
|
|
xmlName: "x-ms-is-current-version",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
acceptRanges: {
|
|
serializedName: "accept-ranges",
|
|
xmlName: "accept-ranges",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobCommittedBlockCount: {
|
|
serializedName: "x-ms-blob-committed-block-count",
|
|
xmlName: "x-ms-blob-committed-block-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-server-encrypted",
|
|
xmlName: "x-ms-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobContentMD5: {
|
|
serializedName: "x-ms-blob-content-md5",
|
|
xmlName: "x-ms-blob-content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
tagCount: {
|
|
serializedName: "x-ms-tag-count",
|
|
xmlName: "x-ms-tag-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isSealed: {
|
|
serializedName: "x-ms-blob-sealed",
|
|
xmlName: "x-ms-blob-sealed",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
lastAccessed: {
|
|
serializedName: "x-ms-last-access-time",
|
|
xmlName: "x-ms-last-access-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyExpiresOn: {
|
|
serializedName: "x-ms-immutability-policy-until-date",
|
|
xmlName: "x-ms-immutability-policy-until-date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyMode: {
|
|
serializedName: "x-ms-immutability-policy-mode",
|
|
xmlName: "x-ms-immutability-policy-mode",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["Mutable", "Unlocked", "Locked"],
|
|
},
|
|
},
|
|
legalHold: {
|
|
serializedName: "x-ms-legal-hold",
|
|
xmlName: "x-ms-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
structuredBodyType: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
structuredContentLength: {
|
|
serializedName: "x-ms-structured-content-length",
|
|
xmlName: "x-ms-structured-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDownloadExceptionHeaders = {
|
|
serializedName: "Blob_downloadExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDownloadExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetPropertiesHeaders = {
|
|
serializedName: "Blob_getPropertiesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetPropertiesHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
createdOn: {
|
|
serializedName: "x-ms-creation-time",
|
|
xmlName: "x-ms-creation-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
metadata: {
|
|
serializedName: "x-ms-meta",
|
|
headerCollectionPrefix: "x-ms-meta-",
|
|
xmlName: "x-ms-meta",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
objectReplicationPolicyId: {
|
|
serializedName: "x-ms-or-policy-id",
|
|
xmlName: "x-ms-or-policy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
objectReplicationRules: {
|
|
serializedName: "x-ms-or",
|
|
headerCollectionPrefix: "x-ms-or-",
|
|
xmlName: "x-ms-or",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
blobType: {
|
|
serializedName: "x-ms-blob-type",
|
|
xmlName: "x-ms-blob-type",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
|
|
},
|
|
},
|
|
copyCompletedOn: {
|
|
serializedName: "x-ms-copy-completion-time",
|
|
xmlName: "x-ms-copy-completion-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyStatusDescription: {
|
|
serializedName: "x-ms-copy-status-description",
|
|
xmlName: "x-ms-copy-status-description",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyProgress: {
|
|
serializedName: "x-ms-copy-progress",
|
|
xmlName: "x-ms-copy-progress",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySource: {
|
|
serializedName: "x-ms-copy-source",
|
|
xmlName: "x-ms-copy-source",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "x-ms-copy-status",
|
|
xmlName: "x-ms-copy-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
isIncrementalCopy: {
|
|
serializedName: "x-ms-incremental-copy",
|
|
xmlName: "x-ms-incremental-copy",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
destinationSnapshot: {
|
|
serializedName: "x-ms-copy-destination-snapshot",
|
|
xmlName: "x-ms-copy-destination-snapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "x-ms-lease-duration",
|
|
xmlName: "x-ms-lease-duration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "x-ms-lease-state",
|
|
xmlName: "x-ms-lease-state",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "x-ms-lease-status",
|
|
xmlName: "x-ms-lease-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
contentLength: {
|
|
serializedName: "content-length",
|
|
xmlName: "content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
contentEncoding: {
|
|
serializedName: "content-encoding",
|
|
xmlName: "content-encoding",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentDisposition: {
|
|
serializedName: "content-disposition",
|
|
xmlName: "content-disposition",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentLanguage: {
|
|
serializedName: "content-language",
|
|
xmlName: "content-language",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
cacheControl: {
|
|
serializedName: "cache-control",
|
|
xmlName: "cache-control",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
acceptRanges: {
|
|
serializedName: "accept-ranges",
|
|
xmlName: "accept-ranges",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobCommittedBlockCount: {
|
|
serializedName: "x-ms-blob-committed-block-count",
|
|
xmlName: "x-ms-blob-committed-block-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-server-encrypted",
|
|
xmlName: "x-ms-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
accessTier: {
|
|
serializedName: "x-ms-access-tier",
|
|
xmlName: "x-ms-access-tier",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
accessTierInferred: {
|
|
serializedName: "x-ms-access-tier-inferred",
|
|
xmlName: "x-ms-access-tier-inferred",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
archiveStatus: {
|
|
serializedName: "x-ms-archive-status",
|
|
xmlName: "x-ms-archive-status",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
accessTierChangedOn: {
|
|
serializedName: "x-ms-access-tier-change-time",
|
|
xmlName: "x-ms-access-tier-change-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
smartAccessTier: {
|
|
serializedName: "x-ms-smart-access-tier",
|
|
xmlName: "x-ms-smart-access-tier",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
isCurrentVersion: {
|
|
serializedName: "x-ms-is-current-version",
|
|
xmlName: "x-ms-is-current-version",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
tagCount: {
|
|
serializedName: "x-ms-tag-count",
|
|
xmlName: "x-ms-tag-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
expiresOn: {
|
|
serializedName: "x-ms-expiry-time",
|
|
xmlName: "x-ms-expiry-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isSealed: {
|
|
serializedName: "x-ms-blob-sealed",
|
|
xmlName: "x-ms-blob-sealed",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
rehydratePriority: {
|
|
serializedName: "x-ms-rehydrate-priority",
|
|
xmlName: "x-ms-rehydrate-priority",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["High", "Standard"],
|
|
},
|
|
},
|
|
lastAccessed: {
|
|
serializedName: "x-ms-last-access-time",
|
|
xmlName: "x-ms-last-access-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyExpiresOn: {
|
|
serializedName: "x-ms-immutability-policy-until-date",
|
|
xmlName: "x-ms-immutability-policy-until-date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyMode: {
|
|
serializedName: "x-ms-immutability-policy-mode",
|
|
xmlName: "x-ms-immutability-policy-mode",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["Mutable", "Unlocked", "Locked"],
|
|
},
|
|
},
|
|
legalHold: {
|
|
serializedName: "x-ms-legal-hold",
|
|
xmlName: "x-ms-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetPropertiesExceptionHeaders = {
|
|
serializedName: "Blob_getPropertiesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetPropertiesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDeleteHeaders = {
|
|
serializedName: "Blob_deleteHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDeleteHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDeleteExceptionHeaders = {
|
|
serializedName: "Blob_deleteExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDeleteExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobUndeleteHeaders = {
|
|
serializedName: "Blob_undeleteHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobUndeleteHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobUndeleteExceptionHeaders = {
|
|
serializedName: "Blob_undeleteExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobUndeleteExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetExpiryHeaders = {
|
|
serializedName: "Blob_setExpiryHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetExpiryHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetExpiryExceptionHeaders = {
|
|
serializedName: "Blob_setExpiryExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetExpiryExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetHttpHeadersHeaders = {
|
|
serializedName: "Blob_setHttpHeadersHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetHttpHeadersHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetHttpHeadersExceptionHeaders = {
|
|
serializedName: "Blob_setHttpHeadersExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetHttpHeadersExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetImmutabilityPolicyHeaders = {
|
|
serializedName: "Blob_setImmutabilityPolicyHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetImmutabilityPolicyHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyExpiry: {
|
|
serializedName: "x-ms-immutability-policy-until-date",
|
|
xmlName: "x-ms-immutability-policy-until-date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
immutabilityPolicyMode: {
|
|
serializedName: "x-ms-immutability-policy-mode",
|
|
xmlName: "x-ms-immutability-policy-mode",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["Mutable", "Unlocked", "Locked"],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetImmutabilityPolicyExceptionHeaders = {
|
|
serializedName: "Blob_setImmutabilityPolicyExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetImmutabilityPolicyExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDeleteImmutabilityPolicyHeaders = {
|
|
serializedName: "Blob_deleteImmutabilityPolicyHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDeleteImmutabilityPolicyHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobDeleteImmutabilityPolicyExceptionHeaders = {
|
|
serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobDeleteImmutabilityPolicyExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetLegalHoldHeaders = {
|
|
serializedName: "Blob_setLegalHoldHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetLegalHoldHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
legalHold: {
|
|
serializedName: "x-ms-legal-hold",
|
|
xmlName: "x-ms-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetLegalHoldExceptionHeaders = {
|
|
serializedName: "Blob_setLegalHoldExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetLegalHoldExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetMetadataHeaders = {
|
|
serializedName: "Blob_setMetadataHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetMetadataHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetMetadataExceptionHeaders = {
|
|
serializedName: "Blob_setMetadataExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetMetadataExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobAcquireLeaseHeaders = {
|
|
serializedName: "Blob_acquireLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobAcquireLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobAcquireLeaseExceptionHeaders = {
|
|
serializedName: "Blob_acquireLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobAcquireLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobReleaseLeaseHeaders = {
|
|
serializedName: "Blob_releaseLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobReleaseLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobReleaseLeaseExceptionHeaders = {
|
|
serializedName: "Blob_releaseLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobReleaseLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobRenewLeaseHeaders = {
|
|
serializedName: "Blob_renewLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobRenewLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobRenewLeaseExceptionHeaders = {
|
|
serializedName: "Blob_renewLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobRenewLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobChangeLeaseHeaders = {
|
|
serializedName: "Blob_changeLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobChangeLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
leaseId: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobChangeLeaseExceptionHeaders = {
|
|
serializedName: "Blob_changeLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobChangeLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobBreakLeaseHeaders = {
|
|
serializedName: "Blob_breakLeaseHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobBreakLeaseHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
leaseTime: {
|
|
serializedName: "x-ms-lease-time",
|
|
xmlName: "x-ms-lease-time",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobBreakLeaseExceptionHeaders = {
|
|
serializedName: "Blob_breakLeaseExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobBreakLeaseExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobCreateSnapshotHeaders = {
|
|
serializedName: "Blob_createSnapshotHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobCreateSnapshotHeaders",
|
|
modelProperties: {
|
|
snapshot: {
|
|
serializedName: "x-ms-snapshot",
|
|
xmlName: "x-ms-snapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobCreateSnapshotExceptionHeaders = {
|
|
serializedName: "Blob_createSnapshotExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobCreateSnapshotExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobStartCopyFromURLHeaders = {
|
|
serializedName: "Blob_startCopyFromURLHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobStartCopyFromURLHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "x-ms-copy-status",
|
|
xmlName: "x-ms-copy-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobStartCopyFromURLExceptionHeaders = {
|
|
serializedName: "Blob_startCopyFromURLExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobStartCopyFromURLExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobCopyFromURLHeaders = {
|
|
serializedName: "Blob_copyFromURLHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobCopyFromURLHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
defaultValue: "success",
|
|
isConstant: true,
|
|
serializedName: "x-ms-copy-status",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobCopyFromURLExceptionHeaders = {
|
|
serializedName: "Blob_copyFromURLExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobCopyFromURLExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobAbortCopyFromURLHeaders = {
|
|
serializedName: "Blob_abortCopyFromURLHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobAbortCopyFromURLHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobAbortCopyFromURLExceptionHeaders = {
|
|
serializedName: "Blob_abortCopyFromURLExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobAbortCopyFromURLExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetTierHeaders = {
|
|
serializedName: "Blob_setTierHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetTierHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetTierExceptionHeaders = {
|
|
serializedName: "Blob_setTierExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetTierExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetAccountInfoHeaders = {
|
|
serializedName: "Blob_getAccountInfoHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetAccountInfoHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
skuName: {
|
|
serializedName: "x-ms-sku-name",
|
|
xmlName: "x-ms-sku-name",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Standard_LRS",
|
|
"Standard_GRS",
|
|
"Standard_RAGRS",
|
|
"Standard_ZRS",
|
|
"Premium_LRS",
|
|
"Standard_GZRS",
|
|
"Premium_ZRS",
|
|
"Standard_RAGZRS",
|
|
],
|
|
},
|
|
},
|
|
accountKind: {
|
|
serializedName: "x-ms-account-kind",
|
|
xmlName: "x-ms-account-kind",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"Storage",
|
|
"BlobStorage",
|
|
"StorageV2",
|
|
"FileStorage",
|
|
"BlockBlobStorage",
|
|
],
|
|
},
|
|
},
|
|
isHierarchicalNamespaceEnabled: {
|
|
serializedName: "x-ms-is-hns-enabled",
|
|
xmlName: "x-ms-is-hns-enabled",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetAccountInfoExceptionHeaders = {
|
|
serializedName: "Blob_getAccountInfoExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetAccountInfoExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobQueryHeaders = {
|
|
serializedName: "Blob_queryHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobQueryHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
metadata: {
|
|
serializedName: "x-ms-meta",
|
|
headerCollectionPrefix: "x-ms-meta-",
|
|
xmlName: "x-ms-meta",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
contentLength: {
|
|
serializedName: "content-length",
|
|
xmlName: "content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentRange: {
|
|
serializedName: "content-range",
|
|
xmlName: "content-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
contentEncoding: {
|
|
serializedName: "content-encoding",
|
|
xmlName: "content-encoding",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
cacheControl: {
|
|
serializedName: "cache-control",
|
|
xmlName: "cache-control",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentDisposition: {
|
|
serializedName: "content-disposition",
|
|
xmlName: "content-disposition",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentLanguage: {
|
|
serializedName: "content-language",
|
|
xmlName: "content-language",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
blobType: {
|
|
serializedName: "x-ms-blob-type",
|
|
xmlName: "x-ms-blob-type",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"],
|
|
},
|
|
},
|
|
copyCompletionTime: {
|
|
serializedName: "x-ms-copy-completion-time",
|
|
xmlName: "x-ms-copy-completion-time",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyStatusDescription: {
|
|
serializedName: "x-ms-copy-status-description",
|
|
xmlName: "x-ms-copy-status-description",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyProgress: {
|
|
serializedName: "x-ms-copy-progress",
|
|
xmlName: "x-ms-copy-progress",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySource: {
|
|
serializedName: "x-ms-copy-source",
|
|
xmlName: "x-ms-copy-source",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "x-ms-copy-status",
|
|
xmlName: "x-ms-copy-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
leaseDuration: {
|
|
serializedName: "x-ms-lease-duration",
|
|
xmlName: "x-ms-lease-duration",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["infinite", "fixed"],
|
|
},
|
|
},
|
|
leaseState: {
|
|
serializedName: "x-ms-lease-state",
|
|
xmlName: "x-ms-lease-state",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"available",
|
|
"leased",
|
|
"expired",
|
|
"breaking",
|
|
"broken",
|
|
],
|
|
},
|
|
},
|
|
leaseStatus: {
|
|
serializedName: "x-ms-lease-status",
|
|
xmlName: "x-ms-lease-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["locked", "unlocked"],
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
acceptRanges: {
|
|
serializedName: "accept-ranges",
|
|
xmlName: "accept-ranges",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobCommittedBlockCount: {
|
|
serializedName: "x-ms-blob-committed-block-count",
|
|
xmlName: "x-ms-blob-committed-block-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-server-encrypted",
|
|
xmlName: "x-ms-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobContentMD5: {
|
|
serializedName: "x-ms-blob-content-md5",
|
|
xmlName: "x-ms-blob-content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobQueryExceptionHeaders = {
|
|
serializedName: "Blob_queryExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobQueryExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetTagsHeaders = {
|
|
serializedName: "Blob_getTagsHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetTagsHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobGetTagsExceptionHeaders = {
|
|
serializedName: "Blob_getTagsExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobGetTagsExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetTagsHeaders = {
|
|
serializedName: "Blob_setTagsHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetTagsHeaders",
|
|
modelProperties: {
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlobSetTagsExceptionHeaders = {
|
|
serializedName: "Blob_setTagsExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlobSetTagsExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobCreateHeaders = {
|
|
serializedName: "PageBlob_createHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobCreateHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobCreateExceptionHeaders = {
|
|
serializedName: "PageBlob_createExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobCreateExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUploadPagesHeaders = {
|
|
serializedName: "PageBlob_uploadPagesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUploadPagesHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
structuredBodyType: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUploadPagesExceptionHeaders = {
|
|
serializedName: "PageBlob_uploadPagesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUploadPagesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobClearPagesHeaders = {
|
|
serializedName: "PageBlob_clearPagesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobClearPagesHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobClearPagesExceptionHeaders = {
|
|
serializedName: "PageBlob_clearPagesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobClearPagesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUploadPagesFromURLHeaders = {
|
|
serializedName: "PageBlob_uploadPagesFromURLHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUploadPagesFromURLHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUploadPagesFromURLExceptionHeaders = {
|
|
serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUploadPagesFromURLExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobGetPageRangesHeaders = {
|
|
serializedName: "PageBlob_getPageRangesHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobGetPageRangesHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobContentLength: {
|
|
serializedName: "x-ms-blob-content-length",
|
|
xmlName: "x-ms-blob-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobGetPageRangesExceptionHeaders = {
|
|
serializedName: "PageBlob_getPageRangesExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobGetPageRangesExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobGetPageRangesDiffHeaders = {
|
|
serializedName: "PageBlob_getPageRangesDiffHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobGetPageRangesDiffHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobContentLength: {
|
|
serializedName: "x-ms-blob-content-length",
|
|
xmlName: "x-ms-blob-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobGetPageRangesDiffExceptionHeaders = {
|
|
serializedName: "PageBlob_getPageRangesDiffExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobGetPageRangesDiffExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobResizeHeaders = {
|
|
serializedName: "PageBlob_resizeHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobResizeHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobResizeExceptionHeaders = {
|
|
serializedName: "PageBlob_resizeExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobResizeExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUpdateSequenceNumberHeaders = {
|
|
serializedName: "PageBlob_updateSequenceNumberHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUpdateSequenceNumberHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobSequenceNumber: {
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobUpdateSequenceNumberExceptionHeaders = {
|
|
serializedName: "PageBlob_updateSequenceNumberExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobUpdateSequenceNumberExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobCopyIncrementalHeaders = {
|
|
serializedName: "PageBlob_copyIncrementalHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobCopyIncrementalHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
copyId: {
|
|
serializedName: "x-ms-copy-id",
|
|
xmlName: "x-ms-copy-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copyStatus: {
|
|
serializedName: "x-ms-copy-status",
|
|
xmlName: "x-ms-copy-status",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["pending", "success", "aborted", "failed"],
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const PageBlobCopyIncrementalExceptionHeaders = {
|
|
serializedName: "PageBlob_copyIncrementalExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "PageBlobCopyIncrementalExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobCreateHeaders = {
|
|
serializedName: "AppendBlob_createHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobCreateHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobCreateExceptionHeaders = {
|
|
serializedName: "AppendBlob_createExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobCreateExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobAppendBlockHeaders = {
|
|
serializedName: "AppendBlob_appendBlockHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobAppendBlockHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobAppendOffset: {
|
|
serializedName: "x-ms-blob-append-offset",
|
|
xmlName: "x-ms-blob-append-offset",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobCommittedBlockCount: {
|
|
serializedName: "x-ms-blob-committed-block-count",
|
|
xmlName: "x-ms-blob-committed-block-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
structuredBodyType: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobAppendBlockExceptionHeaders = {
|
|
serializedName: "AppendBlob_appendBlockExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobAppendBlockExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobAppendBlockFromUrlHeaders = {
|
|
serializedName: "AppendBlob_appendBlockFromUrlHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobAppendBlockFromUrlHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
blobAppendOffset: {
|
|
serializedName: "x-ms-blob-append-offset",
|
|
xmlName: "x-ms-blob-append-offset",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobCommittedBlockCount: {
|
|
serializedName: "x-ms-blob-committed-block-count",
|
|
xmlName: "x-ms-blob-committed-block-count",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobAppendBlockFromUrlExceptionHeaders = {
|
|
serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobAppendBlockFromUrlExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobSealHeaders = {
|
|
serializedName: "AppendBlob_sealHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobSealHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isSealed: {
|
|
serializedName: "x-ms-blob-sealed",
|
|
xmlName: "x-ms-blob-sealed",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const AppendBlobSealExceptionHeaders = {
|
|
serializedName: "AppendBlob_sealExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "AppendBlobSealExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobUploadHeaders = {
|
|
serializedName: "BlockBlob_uploadHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobUploadHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
structuredBodyType: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobUploadExceptionHeaders = {
|
|
serializedName: "BlockBlob_uploadExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobUploadExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobPutBlobFromUrlHeaders = {
|
|
serializedName: "BlockBlob_putBlobFromUrlHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobPutBlobFromUrlHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobPutBlobFromUrlExceptionHeaders = {
|
|
serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobPutBlobFromUrlExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobStageBlockHeaders = {
|
|
serializedName: "BlockBlob_stageBlockHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobStageBlockHeaders",
|
|
modelProperties: {
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
structuredBodyType: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobStageBlockExceptionHeaders = {
|
|
serializedName: "BlockBlob_stageBlockExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobStageBlockExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobStageBlockFromURLHeaders = {
|
|
serializedName: "BlockBlob_stageBlockFromURLHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobStageBlockFromURLHeaders",
|
|
modelProperties: {
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobStageBlockFromURLExceptionHeaders = {
|
|
serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobStageBlockFromURLExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceErrorCode: {
|
|
serializedName: "x-ms-copy-source-error-code",
|
|
xmlName: "x-ms-copy-source-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
copySourceStatusCode: {
|
|
serializedName: "x-ms-copy-source-status-code",
|
|
xmlName: "x-ms-copy-source-status-code",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobCommitBlockListHeaders = {
|
|
serializedName: "BlockBlob_commitBlockListHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobCommitBlockListHeaders",
|
|
modelProperties: {
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
contentMD5: {
|
|
serializedName: "content-md5",
|
|
xmlName: "content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
xMsContentCrc64: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
versionId: {
|
|
serializedName: "x-ms-version-id",
|
|
xmlName: "x-ms-version-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
isServerEncrypted: {
|
|
serializedName: "x-ms-request-server-encrypted",
|
|
xmlName: "x-ms-request-server-encrypted",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
encryptionKeySha256: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
encryptionScope: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobCommitBlockListExceptionHeaders = {
|
|
serializedName: "BlockBlob_commitBlockListExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobCommitBlockListExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobGetBlockListHeaders = {
|
|
serializedName: "BlockBlob_getBlockListHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobGetBlockListHeaders",
|
|
modelProperties: {
|
|
lastModified: {
|
|
serializedName: "last-modified",
|
|
xmlName: "last-modified",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
etag: {
|
|
serializedName: "etag",
|
|
xmlName: "etag",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
contentType: {
|
|
serializedName: "content-type",
|
|
xmlName: "content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
blobContentLength: {
|
|
serializedName: "x-ms-blob-content-length",
|
|
xmlName: "x-ms-blob-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
clientRequestId: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
requestId: {
|
|
serializedName: "x-ms-request-id",
|
|
xmlName: "x-ms-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
version: {
|
|
serializedName: "x-ms-version",
|
|
xmlName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
date: {
|
|
serializedName: "date",
|
|
xmlName: "date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const BlockBlobGetBlockListExceptionHeaders = {
|
|
serializedName: "BlockBlob_getBlockListExceptionHeaders",
|
|
type: {
|
|
name: "Composite",
|
|
className: "BlockBlobGetBlockListExceptionHeaders",
|
|
modelProperties: {
|
|
errorCode: {
|
|
serializedName: "x-ms-error-code",
|
|
xmlName: "x-ms-error-code",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
//# sourceMappingURL=mappers.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/models/parameters.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
const contentType = {
|
|
parameterPath: ["options", "contentType"],
|
|
mapper: {
|
|
defaultValue: "application/xml",
|
|
isConstant: true,
|
|
serializedName: "Content-Type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobServiceProperties = {
|
|
parameterPath: "blobServiceProperties",
|
|
mapper: BlobServiceProperties,
|
|
};
|
|
const accept = {
|
|
parameterPath: "accept",
|
|
mapper: {
|
|
defaultValue: "application/xml",
|
|
isConstant: true,
|
|
serializedName: "Accept",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const url = {
|
|
parameterPath: "url",
|
|
mapper: {
|
|
serializedName: "url",
|
|
required: true,
|
|
xmlName: "url",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
skipEncoding: true,
|
|
};
|
|
const restype = {
|
|
parameterPath: "restype",
|
|
mapper: {
|
|
defaultValue: "service",
|
|
isConstant: true,
|
|
serializedName: "restype",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "properties",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const timeoutInSeconds = {
|
|
parameterPath: ["options", "timeoutInSeconds"],
|
|
mapper: {
|
|
constraints: {
|
|
InclusiveMinimum: 0,
|
|
},
|
|
serializedName: "timeout",
|
|
xmlName: "timeout",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const version = {
|
|
parameterPath: "version",
|
|
mapper: {
|
|
defaultValue: "2026-06-06",
|
|
isConstant: true,
|
|
serializedName: "x-ms-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const requestId = {
|
|
parameterPath: ["options", "requestId"],
|
|
mapper: {
|
|
serializedName: "x-ms-client-request-id",
|
|
xmlName: "x-ms-client-request-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const accept1 = {
|
|
parameterPath: "accept",
|
|
mapper: {
|
|
defaultValue: "application/xml",
|
|
isConstant: true,
|
|
serializedName: "Accept",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp1 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "stats",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp2 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "list",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const prefix = {
|
|
parameterPath: ["options", "prefix"],
|
|
mapper: {
|
|
serializedName: "prefix",
|
|
xmlName: "prefix",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const marker = {
|
|
parameterPath: ["options", "marker"],
|
|
mapper: {
|
|
serializedName: "marker",
|
|
xmlName: "marker",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const maxPageSize = {
|
|
parameterPath: ["options", "maxPageSize"],
|
|
mapper: {
|
|
constraints: {
|
|
InclusiveMinimum: 1,
|
|
},
|
|
serializedName: "maxresults",
|
|
xmlName: "maxresults",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const include = {
|
|
parameterPath: ["options", "include"],
|
|
mapper: {
|
|
serializedName: "include",
|
|
xmlName: "include",
|
|
xmlElementName: "ListContainersIncludeType",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["metadata", "deleted", "system"],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
collectionFormat: "CSV",
|
|
};
|
|
const keyInfo = {
|
|
parameterPath: "keyInfo",
|
|
mapper: KeyInfo,
|
|
};
|
|
const comp3 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "userdelegationkey",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const restype1 = {
|
|
parameterPath: "restype",
|
|
mapper: {
|
|
defaultValue: "account",
|
|
isConstant: true,
|
|
serializedName: "restype",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const body = {
|
|
parameterPath: "body",
|
|
mapper: {
|
|
serializedName: "body",
|
|
required: true,
|
|
xmlName: "body",
|
|
type: {
|
|
name: "Stream",
|
|
},
|
|
},
|
|
};
|
|
const comp4 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "batch",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const contentLength = {
|
|
parameterPath: "contentLength",
|
|
mapper: {
|
|
serializedName: "Content-Length",
|
|
required: true,
|
|
xmlName: "Content-Length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const multipartContentType = {
|
|
parameterPath: "multipartContentType",
|
|
mapper: {
|
|
serializedName: "Content-Type",
|
|
required: true,
|
|
xmlName: "Content-Type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp5 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "blobs",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const where = {
|
|
parameterPath: ["options", "where"],
|
|
mapper: {
|
|
serializedName: "where",
|
|
xmlName: "where",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const restype2 = {
|
|
parameterPath: "restype",
|
|
mapper: {
|
|
defaultValue: "container",
|
|
isConstant: true,
|
|
serializedName: "restype",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const metadata = {
|
|
parameterPath: ["options", "metadata"],
|
|
mapper: {
|
|
serializedName: "x-ms-meta",
|
|
xmlName: "x-ms-meta",
|
|
headerCollectionPrefix: "x-ms-meta-",
|
|
type: {
|
|
name: "Dictionary",
|
|
value: { type: { name: "String" } },
|
|
},
|
|
},
|
|
};
|
|
const access = {
|
|
parameterPath: ["options", "access"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-public-access",
|
|
xmlName: "x-ms-blob-public-access",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["container", "blob"],
|
|
},
|
|
},
|
|
};
|
|
const defaultEncryptionScope = {
|
|
parameterPath: [
|
|
"options",
|
|
"containerEncryptionScope",
|
|
"defaultEncryptionScope",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-default-encryption-scope",
|
|
xmlName: "x-ms-default-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const preventEncryptionScopeOverride = {
|
|
parameterPath: [
|
|
"options",
|
|
"containerEncryptionScope",
|
|
"preventEncryptionScopeOverride",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-deny-encryption-scope-override",
|
|
xmlName: "x-ms-deny-encryption-scope-override",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const leaseId = {
|
|
parameterPath: ["options", "leaseAccessConditions", "leaseId"],
|
|
mapper: {
|
|
serializedName: "x-ms-lease-id",
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifModifiedSince = {
|
|
parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"],
|
|
mapper: {
|
|
serializedName: "If-Modified-Since",
|
|
xmlName: "If-Modified-Since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const ifUnmodifiedSince = {
|
|
parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"],
|
|
mapper: {
|
|
serializedName: "If-Unmodified-Since",
|
|
xmlName: "If-Unmodified-Since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const comp6 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "metadata",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp7 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "acl",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const containerAcl = {
|
|
parameterPath: ["options", "containerAcl"],
|
|
mapper: {
|
|
serializedName: "containerAcl",
|
|
xmlName: "SignedIdentifiers",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "SignedIdentifier",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Composite",
|
|
className: "SignedIdentifier",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
const comp8 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "undelete",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const deletedContainerName = {
|
|
parameterPath: ["options", "deletedContainerName"],
|
|
mapper: {
|
|
serializedName: "x-ms-deleted-container-name",
|
|
xmlName: "x-ms-deleted-container-name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const deletedContainerVersion = {
|
|
parameterPath: ["options", "deletedContainerVersion"],
|
|
mapper: {
|
|
serializedName: "x-ms-deleted-container-version",
|
|
xmlName: "x-ms-deleted-container-version",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp9 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "rename",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceContainerName = {
|
|
parameterPath: "sourceContainerName",
|
|
mapper: {
|
|
serializedName: "x-ms-source-container-name",
|
|
required: true,
|
|
xmlName: "x-ms-source-container-name",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceLeaseId = {
|
|
parameterPath: ["options", "sourceLeaseId"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-lease-id",
|
|
xmlName: "x-ms-source-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp10 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "lease",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const action = {
|
|
parameterPath: "action",
|
|
mapper: {
|
|
defaultValue: "acquire",
|
|
isConstant: true,
|
|
serializedName: "x-ms-lease-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const duration = {
|
|
parameterPath: ["options", "duration"],
|
|
mapper: {
|
|
serializedName: "x-ms-lease-duration",
|
|
xmlName: "x-ms-lease-duration",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const proposedLeaseId = {
|
|
parameterPath: ["options", "proposedLeaseId"],
|
|
mapper: {
|
|
serializedName: "x-ms-proposed-lease-id",
|
|
xmlName: "x-ms-proposed-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const action1 = {
|
|
parameterPath: "action",
|
|
mapper: {
|
|
defaultValue: "release",
|
|
isConstant: true,
|
|
serializedName: "x-ms-lease-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const leaseId1 = {
|
|
parameterPath: "leaseId",
|
|
mapper: {
|
|
serializedName: "x-ms-lease-id",
|
|
required: true,
|
|
xmlName: "x-ms-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const action2 = {
|
|
parameterPath: "action",
|
|
mapper: {
|
|
defaultValue: "renew",
|
|
isConstant: true,
|
|
serializedName: "x-ms-lease-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const action3 = {
|
|
parameterPath: "action",
|
|
mapper: {
|
|
defaultValue: "break",
|
|
isConstant: true,
|
|
serializedName: "x-ms-lease-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const breakPeriod = {
|
|
parameterPath: ["options", "breakPeriod"],
|
|
mapper: {
|
|
serializedName: "x-ms-lease-break-period",
|
|
xmlName: "x-ms-lease-break-period",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const action4 = {
|
|
parameterPath: "action",
|
|
mapper: {
|
|
defaultValue: "change",
|
|
isConstant: true,
|
|
serializedName: "x-ms-lease-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const proposedLeaseId1 = {
|
|
parameterPath: "proposedLeaseId",
|
|
mapper: {
|
|
serializedName: "x-ms-proposed-lease-id",
|
|
required: true,
|
|
xmlName: "x-ms-proposed-lease-id",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const include1 = {
|
|
parameterPath: ["options", "include"],
|
|
mapper: {
|
|
serializedName: "include",
|
|
xmlName: "include",
|
|
xmlElementName: "ListBlobsIncludeItem",
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"copy",
|
|
"deleted",
|
|
"metadata",
|
|
"snapshots",
|
|
"uncommittedblobs",
|
|
"versions",
|
|
"tags",
|
|
"immutabilitypolicy",
|
|
"legalhold",
|
|
"deletedwithversions",
|
|
],
|
|
},
|
|
},
|
|
},
|
|
},
|
|
collectionFormat: "CSV",
|
|
};
|
|
const startFrom = {
|
|
parameterPath: ["options", "startFrom"],
|
|
mapper: {
|
|
serializedName: "startFrom",
|
|
xmlName: "startFrom",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const delimiter = {
|
|
parameterPath: "delimiter",
|
|
mapper: {
|
|
serializedName: "delimiter",
|
|
required: true,
|
|
xmlName: "delimiter",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const snapshot = {
|
|
parameterPath: ["options", "snapshot"],
|
|
mapper: {
|
|
serializedName: "snapshot",
|
|
xmlName: "snapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const versionId = {
|
|
parameterPath: ["options", "versionId"],
|
|
mapper: {
|
|
serializedName: "versionid",
|
|
xmlName: "versionid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const range = {
|
|
parameterPath: ["options", "range"],
|
|
mapper: {
|
|
serializedName: "x-ms-range",
|
|
xmlName: "x-ms-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const rangeGetContentMD5 = {
|
|
parameterPath: ["options", "rangeGetContentMD5"],
|
|
mapper: {
|
|
serializedName: "x-ms-range-get-content-md5",
|
|
xmlName: "x-ms-range-get-content-md5",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const rangeGetContentCRC64 = {
|
|
parameterPath: ["options", "rangeGetContentCRC64"],
|
|
mapper: {
|
|
serializedName: "x-ms-range-get-content-crc64",
|
|
xmlName: "x-ms-range-get-content-crc64",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const structuredBodyType = {
|
|
parameterPath: ["options", "structuredBodyType"],
|
|
mapper: {
|
|
serializedName: "x-ms-structured-body",
|
|
xmlName: "x-ms-structured-body",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const encryptionKey = {
|
|
parameterPath: ["options", "cpkInfo", "encryptionKey"],
|
|
mapper: {
|
|
serializedName: "x-ms-encryption-key",
|
|
xmlName: "x-ms-encryption-key",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const encryptionKeySha256 = {
|
|
parameterPath: ["options", "cpkInfo", "encryptionKeySha256"],
|
|
mapper: {
|
|
serializedName: "x-ms-encryption-key-sha256",
|
|
xmlName: "x-ms-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const encryptionAlgorithm = {
|
|
parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"],
|
|
mapper: {
|
|
serializedName: "x-ms-encryption-algorithm",
|
|
xmlName: "x-ms-encryption-algorithm",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifMatch = {
|
|
parameterPath: ["options", "modifiedAccessConditions", "ifMatch"],
|
|
mapper: {
|
|
serializedName: "If-Match",
|
|
xmlName: "If-Match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifNoneMatch = {
|
|
parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"],
|
|
mapper: {
|
|
serializedName: "If-None-Match",
|
|
xmlName: "If-None-Match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifTags = {
|
|
parameterPath: ["options", "modifiedAccessConditions", "ifTags"],
|
|
mapper: {
|
|
serializedName: "x-ms-if-tags",
|
|
xmlName: "x-ms-if-tags",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const deleteSnapshots = {
|
|
parameterPath: ["options", "deleteSnapshots"],
|
|
mapper: {
|
|
serializedName: "x-ms-delete-snapshots",
|
|
xmlName: "x-ms-delete-snapshots",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["include", "only"],
|
|
},
|
|
},
|
|
};
|
|
const blobDeleteType = {
|
|
parameterPath: ["options", "blobDeleteType"],
|
|
mapper: {
|
|
serializedName: "deletetype",
|
|
xmlName: "deletetype",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const accessTierIfModifiedSince = {
|
|
parameterPath: ["options", "accessTierIfModifiedSince"],
|
|
mapper: {
|
|
serializedName: "x-ms-access-tier-if-modified-since",
|
|
xmlName: "x-ms-access-tier-if-modified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const accessTierIfUnmodifiedSince = {
|
|
parameterPath: ["options", "accessTierIfUnmodifiedSince"],
|
|
mapper: {
|
|
serializedName: "x-ms-access-tier-if-unmodified-since",
|
|
xmlName: "x-ms-access-tier-if-unmodified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const comp11 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "expiry",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const expiryOptions = {
|
|
parameterPath: "expiryOptions",
|
|
mapper: {
|
|
serializedName: "x-ms-expiry-option",
|
|
required: true,
|
|
xmlName: "x-ms-expiry-option",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const expiresOn = {
|
|
parameterPath: ["options", "expiresOn"],
|
|
mapper: {
|
|
serializedName: "x-ms-expiry-time",
|
|
xmlName: "x-ms-expiry-time",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobCacheControl = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-cache-control",
|
|
xmlName: "x-ms-blob-cache-control",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobContentType = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobContentType"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-type",
|
|
xmlName: "x-ms-blob-content-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobContentMD5 = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-md5",
|
|
xmlName: "x-ms-blob-content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
};
|
|
const blobContentEncoding = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-encoding",
|
|
xmlName: "x-ms-blob-content-encoding",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobContentLanguage = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-language",
|
|
xmlName: "x-ms-blob-content-language",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobContentDisposition = {
|
|
parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-disposition",
|
|
xmlName: "x-ms-blob-content-disposition",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp12 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "immutabilityPolicies",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const immutabilityPolicyExpiry = {
|
|
parameterPath: ["options", "immutabilityPolicyExpiry"],
|
|
mapper: {
|
|
serializedName: "x-ms-immutability-policy-until-date",
|
|
xmlName: "x-ms-immutability-policy-until-date",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const immutabilityPolicyMode = {
|
|
parameterPath: ["options", "immutabilityPolicyMode"],
|
|
mapper: {
|
|
serializedName: "x-ms-immutability-policy-mode",
|
|
xmlName: "x-ms-immutability-policy-mode",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["Mutable", "Unlocked", "Locked"],
|
|
},
|
|
},
|
|
};
|
|
const comp13 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "legalhold",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const legalHold = {
|
|
parameterPath: "legalHold",
|
|
mapper: {
|
|
serializedName: "x-ms-legal-hold",
|
|
required: true,
|
|
xmlName: "x-ms-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const encryptionScope = {
|
|
parameterPath: ["options", "encryptionScope"],
|
|
mapper: {
|
|
serializedName: "x-ms-encryption-scope",
|
|
xmlName: "x-ms-encryption-scope",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp14 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "snapshot",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const tier = {
|
|
parameterPath: ["options", "tier"],
|
|
mapper: {
|
|
serializedName: "x-ms-access-tier",
|
|
xmlName: "x-ms-access-tier",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"P4",
|
|
"P6",
|
|
"P10",
|
|
"P15",
|
|
"P20",
|
|
"P30",
|
|
"P40",
|
|
"P50",
|
|
"P60",
|
|
"P70",
|
|
"P80",
|
|
"Hot",
|
|
"Cool",
|
|
"Archive",
|
|
"Cold",
|
|
"Smart",
|
|
],
|
|
},
|
|
},
|
|
};
|
|
const rehydratePriority = {
|
|
parameterPath: ["options", "rehydratePriority"],
|
|
mapper: {
|
|
serializedName: "x-ms-rehydrate-priority",
|
|
xmlName: "x-ms-rehydrate-priority",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["High", "Standard"],
|
|
},
|
|
},
|
|
};
|
|
const sourceIfModifiedSince = {
|
|
parameterPath: [
|
|
"options",
|
|
"sourceModifiedAccessConditions",
|
|
"sourceIfModifiedSince",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-source-if-modified-since",
|
|
xmlName: "x-ms-source-if-modified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const sourceIfUnmodifiedSince = {
|
|
parameterPath: [
|
|
"options",
|
|
"sourceModifiedAccessConditions",
|
|
"sourceIfUnmodifiedSince",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-source-if-unmodified-since",
|
|
xmlName: "x-ms-source-if-unmodified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const sourceIfMatch = {
|
|
parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-if-match",
|
|
xmlName: "x-ms-source-if-match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceIfNoneMatch = {
|
|
parameterPath: [
|
|
"options",
|
|
"sourceModifiedAccessConditions",
|
|
"sourceIfNoneMatch",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-source-if-none-match",
|
|
xmlName: "x-ms-source-if-none-match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceIfTags = {
|
|
parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-if-tags",
|
|
xmlName: "x-ms-source-if-tags",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const copySource = {
|
|
parameterPath: "copySource",
|
|
mapper: {
|
|
serializedName: "x-ms-copy-source",
|
|
required: true,
|
|
xmlName: "x-ms-copy-source",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobTagsString = {
|
|
parameterPath: ["options", "blobTagsString"],
|
|
mapper: {
|
|
serializedName: "x-ms-tags",
|
|
xmlName: "x-ms-tags",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sealBlob = {
|
|
parameterPath: ["options", "sealBlob"],
|
|
mapper: {
|
|
serializedName: "x-ms-seal-blob",
|
|
xmlName: "x-ms-seal-blob",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const legalHold1 = {
|
|
parameterPath: ["options", "legalHold"],
|
|
mapper: {
|
|
serializedName: "x-ms-legal-hold",
|
|
xmlName: "x-ms-legal-hold",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const xMsRequiresSync = {
|
|
parameterPath: "xMsRequiresSync",
|
|
mapper: {
|
|
defaultValue: "true",
|
|
isConstant: true,
|
|
serializedName: "x-ms-requires-sync",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceContentMD5 = {
|
|
parameterPath: ["options", "sourceContentMD5"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-content-md5",
|
|
xmlName: "x-ms-source-content-md5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
};
|
|
const copySourceAuthorization = {
|
|
parameterPath: ["options", "copySourceAuthorization"],
|
|
mapper: {
|
|
serializedName: "x-ms-copy-source-authorization",
|
|
xmlName: "x-ms-copy-source-authorization",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const copySourceTags = {
|
|
parameterPath: ["options", "copySourceTags"],
|
|
mapper: {
|
|
serializedName: "x-ms-copy-source-tag-option",
|
|
xmlName: "x-ms-copy-source-tag-option",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["REPLACE", "COPY"],
|
|
},
|
|
},
|
|
};
|
|
const fileRequestIntent = {
|
|
parameterPath: ["options", "fileRequestIntent"],
|
|
mapper: {
|
|
serializedName: "x-ms-file-request-intent",
|
|
xmlName: "x-ms-file-request-intent",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp15 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "copy",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const copyActionAbortConstant = {
|
|
parameterPath: "copyActionAbortConstant",
|
|
mapper: {
|
|
defaultValue: "abort",
|
|
isConstant: true,
|
|
serializedName: "x-ms-copy-action",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const copyId = {
|
|
parameterPath: "copyId",
|
|
mapper: {
|
|
serializedName: "copyid",
|
|
required: true,
|
|
xmlName: "copyid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp16 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "tier",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const tier1 = {
|
|
parameterPath: "tier",
|
|
mapper: {
|
|
serializedName: "x-ms-access-tier",
|
|
required: true,
|
|
xmlName: "x-ms-access-tier",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: [
|
|
"P4",
|
|
"P6",
|
|
"P10",
|
|
"P15",
|
|
"P20",
|
|
"P30",
|
|
"P40",
|
|
"P50",
|
|
"P60",
|
|
"P70",
|
|
"P80",
|
|
"Hot",
|
|
"Cool",
|
|
"Archive",
|
|
"Cold",
|
|
"Smart",
|
|
],
|
|
},
|
|
},
|
|
};
|
|
const queryRequest = {
|
|
parameterPath: ["options", "queryRequest"],
|
|
mapper: QueryRequest,
|
|
};
|
|
const comp17 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "query",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp18 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "tags",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifModifiedSince1 = {
|
|
parameterPath: ["options", "blobModifiedAccessConditions", "ifModifiedSince"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-if-modified-since",
|
|
xmlName: "x-ms-blob-if-modified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const ifUnmodifiedSince1 = {
|
|
parameterPath: [
|
|
"options",
|
|
"blobModifiedAccessConditions",
|
|
"ifUnmodifiedSince",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-if-unmodified-since",
|
|
xmlName: "x-ms-blob-if-unmodified-since",
|
|
type: {
|
|
name: "DateTimeRfc1123",
|
|
},
|
|
},
|
|
};
|
|
const ifMatch1 = {
|
|
parameterPath: ["options", "blobModifiedAccessConditions", "ifMatch"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-if-match",
|
|
xmlName: "x-ms-blob-if-match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifNoneMatch1 = {
|
|
parameterPath: ["options", "blobModifiedAccessConditions", "ifNoneMatch"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-if-none-match",
|
|
xmlName: "x-ms-blob-if-none-match",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const tags = {
|
|
parameterPath: ["options", "tags"],
|
|
mapper: BlobTags,
|
|
};
|
|
const transactionalContentMD5 = {
|
|
parameterPath: ["options", "transactionalContentMD5"],
|
|
mapper: {
|
|
serializedName: "Content-MD5",
|
|
xmlName: "Content-MD5",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
};
|
|
const transactionalContentCrc64 = {
|
|
parameterPath: ["options", "transactionalContentCrc64"],
|
|
mapper: {
|
|
serializedName: "x-ms-content-crc64",
|
|
xmlName: "x-ms-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
};
|
|
const blobType = {
|
|
parameterPath: "blobType",
|
|
mapper: {
|
|
defaultValue: "PageBlob",
|
|
isConstant: true,
|
|
serializedName: "x-ms-blob-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobContentLength = {
|
|
parameterPath: "blobContentLength",
|
|
mapper: {
|
|
serializedName: "x-ms-blob-content-length",
|
|
required: true,
|
|
xmlName: "x-ms-blob-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const blobSequenceNumber = {
|
|
parameterPath: ["options", "blobSequenceNumber"],
|
|
mapper: {
|
|
defaultValue: 0,
|
|
serializedName: "x-ms-blob-sequence-number",
|
|
xmlName: "x-ms-blob-sequence-number",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const contentType1 = {
|
|
parameterPath: ["options", "contentType"],
|
|
mapper: {
|
|
defaultValue: "application/octet-stream",
|
|
isConstant: true,
|
|
serializedName: "Content-Type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const body1 = {
|
|
parameterPath: "body",
|
|
mapper: {
|
|
serializedName: "body",
|
|
required: true,
|
|
xmlName: "body",
|
|
type: {
|
|
name: "Stream",
|
|
},
|
|
},
|
|
};
|
|
const accept2 = {
|
|
parameterPath: "accept",
|
|
mapper: {
|
|
defaultValue: "application/xml",
|
|
isConstant: true,
|
|
serializedName: "Accept",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp19 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "page",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const pageWrite = {
|
|
parameterPath: "pageWrite",
|
|
mapper: {
|
|
defaultValue: "update",
|
|
isConstant: true,
|
|
serializedName: "x-ms-page-write",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const ifSequenceNumberLessThanOrEqualTo = {
|
|
parameterPath: [
|
|
"options",
|
|
"sequenceNumberAccessConditions",
|
|
"ifSequenceNumberLessThanOrEqualTo",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-if-sequence-number-le",
|
|
xmlName: "x-ms-if-sequence-number-le",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const ifSequenceNumberLessThan = {
|
|
parameterPath: [
|
|
"options",
|
|
"sequenceNumberAccessConditions",
|
|
"ifSequenceNumberLessThan",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-if-sequence-number-lt",
|
|
xmlName: "x-ms-if-sequence-number-lt",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const ifSequenceNumberEqualTo = {
|
|
parameterPath: [
|
|
"options",
|
|
"sequenceNumberAccessConditions",
|
|
"ifSequenceNumberEqualTo",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-if-sequence-number-eq",
|
|
xmlName: "x-ms-if-sequence-number-eq",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const structuredContentLength = {
|
|
parameterPath: ["options", "structuredContentLength"],
|
|
mapper: {
|
|
serializedName: "x-ms-structured-content-length",
|
|
xmlName: "x-ms-structured-content-length",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const pageWrite1 = {
|
|
parameterPath: "pageWrite",
|
|
mapper: {
|
|
defaultValue: "clear",
|
|
isConstant: true,
|
|
serializedName: "x-ms-page-write",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceUrl = {
|
|
parameterPath: "sourceUrl",
|
|
mapper: {
|
|
serializedName: "x-ms-copy-source",
|
|
required: true,
|
|
xmlName: "x-ms-copy-source",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceRange = {
|
|
parameterPath: "sourceRange",
|
|
mapper: {
|
|
serializedName: "x-ms-source-range",
|
|
required: true,
|
|
xmlName: "x-ms-source-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceContentCrc64 = {
|
|
parameterPath: ["options", "sourceContentCrc64"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-content-crc64",
|
|
xmlName: "x-ms-source-content-crc64",
|
|
type: {
|
|
name: "ByteArray",
|
|
},
|
|
},
|
|
};
|
|
const range1 = {
|
|
parameterPath: "range",
|
|
mapper: {
|
|
serializedName: "x-ms-range",
|
|
required: true,
|
|
xmlName: "x-ms-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceEncryptionKey = {
|
|
parameterPath: ["options", "sourceCpkInfo", "sourceEncryptionKey"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-encryption-key",
|
|
xmlName: "x-ms-source-encryption-key",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceEncryptionKeySha256 = {
|
|
parameterPath: ["options", "sourceCpkInfo", "sourceEncryptionKeySha256"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-encryption-key-sha256",
|
|
xmlName: "x-ms-source-encryption-key-sha256",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sourceEncryptionAlgorithm = {
|
|
parameterPath: ["options", "sourceCpkInfo", "sourceEncryptionAlgorithm"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-encryption-algorithm",
|
|
xmlName: "x-ms-source-encryption-algorithm",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp20 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "pagelist",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const prevsnapshot = {
|
|
parameterPath: ["options", "prevsnapshot"],
|
|
mapper: {
|
|
serializedName: "prevsnapshot",
|
|
xmlName: "prevsnapshot",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const prevSnapshotUrl = {
|
|
parameterPath: ["options", "prevSnapshotUrl"],
|
|
mapper: {
|
|
serializedName: "x-ms-previous-snapshot-url",
|
|
xmlName: "x-ms-previous-snapshot-url",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const sequenceNumberAction = {
|
|
parameterPath: "sequenceNumberAction",
|
|
mapper: {
|
|
serializedName: "x-ms-sequence-number-action",
|
|
required: true,
|
|
xmlName: "x-ms-sequence-number-action",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["max", "update", "increment"],
|
|
},
|
|
},
|
|
};
|
|
const comp21 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "incrementalcopy",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobType1 = {
|
|
parameterPath: "blobType",
|
|
mapper: {
|
|
defaultValue: "AppendBlob",
|
|
isConstant: true,
|
|
serializedName: "x-ms-blob-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp22 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "appendblock",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const maxSize = {
|
|
parameterPath: ["options", "appendPositionAccessConditions", "maxSize"],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-condition-maxsize",
|
|
xmlName: "x-ms-blob-condition-maxsize",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const appendPosition = {
|
|
parameterPath: [
|
|
"options",
|
|
"appendPositionAccessConditions",
|
|
"appendPosition",
|
|
],
|
|
mapper: {
|
|
serializedName: "x-ms-blob-condition-appendpos",
|
|
xmlName: "x-ms-blob-condition-appendpos",
|
|
type: {
|
|
name: "Number",
|
|
},
|
|
},
|
|
};
|
|
const sourceRange1 = {
|
|
parameterPath: ["options", "sourceRange"],
|
|
mapper: {
|
|
serializedName: "x-ms-source-range",
|
|
xmlName: "x-ms-source-range",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const comp23 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "seal",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blobType2 = {
|
|
parameterPath: "blobType",
|
|
mapper: {
|
|
defaultValue: "BlockBlob",
|
|
isConstant: true,
|
|
serializedName: "x-ms-blob-type",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const copySourceBlobProperties = {
|
|
parameterPath: ["options", "copySourceBlobProperties"],
|
|
mapper: {
|
|
serializedName: "x-ms-copy-source-blob-properties",
|
|
xmlName: "x-ms-copy-source-blob-properties",
|
|
type: {
|
|
name: "Boolean",
|
|
},
|
|
},
|
|
};
|
|
const comp24 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "block",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blockId = {
|
|
parameterPath: "blockId",
|
|
mapper: {
|
|
serializedName: "blockid",
|
|
required: true,
|
|
xmlName: "blockid",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const blocks = {
|
|
parameterPath: "blocks",
|
|
mapper: BlockLookupList,
|
|
};
|
|
const comp25 = {
|
|
parameterPath: "comp",
|
|
mapper: {
|
|
defaultValue: "blocklist",
|
|
isConstant: true,
|
|
serializedName: "comp",
|
|
type: {
|
|
name: "String",
|
|
},
|
|
},
|
|
};
|
|
const listType = {
|
|
parameterPath: "listType",
|
|
mapper: {
|
|
defaultValue: "committed",
|
|
serializedName: "blocklisttype",
|
|
required: true,
|
|
xmlName: "blocklisttype",
|
|
type: {
|
|
name: "Enum",
|
|
allowedValues: ["committed", "uncommitted", "all"],
|
|
},
|
|
},
|
|
};
|
|
//# sourceMappingURL=parameters.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/service.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing Service operations. */
|
|
class ServiceImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class Service class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* Sets properties for a storage account's Blob service endpoint, including properties for Storage
|
|
* Analytics and CORS (Cross-Origin Resource Sharing) rules
|
|
* @param blobServiceProperties The StorageService properties.
|
|
* @param options The options parameters.
|
|
*/
|
|
setProperties(blobServiceProperties, options) {
|
|
return this.client.sendOperationRequest({ blobServiceProperties, options }, setPropertiesOperationSpec);
|
|
}
|
|
/**
|
|
* gets the properties of a storage account's Blob service, including properties for Storage Analytics
|
|
* and CORS (Cross-Origin Resource Sharing) rules.
|
|
* @param options The options parameters.
|
|
*/
|
|
getProperties(options) {
|
|
return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec);
|
|
}
|
|
/**
|
|
* Retrieves statistics related to replication for the Blob service. It is only available on the
|
|
* secondary location endpoint when read-access geo-redundant replication is enabled for the storage
|
|
* account.
|
|
* @param options The options parameters.
|
|
*/
|
|
getStatistics(options) {
|
|
return this.client.sendOperationRequest({ options }, getStatisticsOperationSpec);
|
|
}
|
|
/**
|
|
* The List Containers Segment operation returns a list of the containers under the specified account
|
|
* @param options The options parameters.
|
|
*/
|
|
listContainersSegment(options) {
|
|
return this.client.sendOperationRequest({ options }, listContainersSegmentOperationSpec);
|
|
}
|
|
/**
|
|
* Retrieves a user delegation key for the Blob service. This is only a valid operation when using
|
|
* bearer token authentication.
|
|
* @param keyInfo Key information
|
|
* @param options The options parameters.
|
|
*/
|
|
getUserDelegationKey(keyInfo, options) {
|
|
return this.client.sendOperationRequest({ keyInfo, options }, getUserDelegationKeyOperationSpec);
|
|
}
|
|
/**
|
|
* Returns the sku name and account kind
|
|
* @param options The options parameters.
|
|
*/
|
|
getAccountInfo(options) {
|
|
return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec);
|
|
}
|
|
/**
|
|
* The Batch operation allows multiple API calls to be embedded into a single HTTP request.
|
|
* @param contentLength The length of the request.
|
|
* @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
|
|
* boundary. Example header value: multipart/mixed; boundary=batch_<GUID>
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
submitBatch(contentLength, multipartContentType, body, options) {
|
|
return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, submitBatchOperationSpec);
|
|
}
|
|
/**
|
|
* The Filter Blobs operation enables callers to list blobs across all containers whose tags match a
|
|
* given search expression. Filter blobs searches across all containers within a storage account but
|
|
* can be scoped within the expression to a single container.
|
|
* @param options The options parameters.
|
|
*/
|
|
filterBlobs(options) {
|
|
return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const setPropertiesOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: ServiceSetPropertiesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceSetPropertiesExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: blobServiceProperties,
|
|
queryParameters: [
|
|
restype,
|
|
comp,
|
|
timeoutInSeconds,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: xmlSerializer,
|
|
};
|
|
const getPropertiesOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: BlobServiceProperties,
|
|
headersMapper: ServiceGetPropertiesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceGetPropertiesExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
restype,
|
|
comp,
|
|
timeoutInSeconds,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: xmlSerializer,
|
|
};
|
|
const getStatisticsOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: BlobServiceStatistics,
|
|
headersMapper: ServiceGetStatisticsHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceGetStatisticsExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
restype,
|
|
timeoutInSeconds,
|
|
comp1,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: xmlSerializer,
|
|
};
|
|
const listContainersSegmentOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: ListContainersSegmentResponse,
|
|
headersMapper: ServiceListContainersSegmentHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceListContainersSegmentExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp2,
|
|
prefix,
|
|
marker,
|
|
maxPageSize,
|
|
include,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: xmlSerializer,
|
|
};
|
|
const getUserDelegationKeyOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "POST",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: UserDelegationKey,
|
|
headersMapper: ServiceGetUserDelegationKeyHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceGetUserDelegationKeyExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: keyInfo,
|
|
queryParameters: [
|
|
restype,
|
|
timeoutInSeconds,
|
|
comp3,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: xmlSerializer,
|
|
};
|
|
const getAccountInfoOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ServiceGetAccountInfoHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceGetAccountInfoExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
comp,
|
|
timeoutInSeconds,
|
|
restype1,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: xmlSerializer,
|
|
};
|
|
const submitBatchOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "POST",
|
|
responses: {
|
|
202: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: ServiceSubmitBatchHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceSubmitBatchExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body,
|
|
queryParameters: [timeoutInSeconds, comp4],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
accept,
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
multipartContentType,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: xmlSerializer,
|
|
};
|
|
const filterBlobsOperationSpec = {
|
|
path: "/",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: FilterBlobSegment,
|
|
headersMapper: ServiceFilterBlobsHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ServiceFilterBlobsExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
marker,
|
|
maxPageSize,
|
|
comp5,
|
|
where,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=service.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/container.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing Container operations. */
|
|
class ContainerImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class Container class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* creates a new container under the specified account. If the container with the same name already
|
|
* exists, the operation fails
|
|
* @param options The options parameters.
|
|
*/
|
|
create(options) {
|
|
return this.client.sendOperationRequest({ options }, createOperationSpec);
|
|
}
|
|
/**
|
|
* returns all user-defined metadata and system properties for the specified container. The data
|
|
* returned does not include the container's list of blobs
|
|
* @param options The options parameters.
|
|
*/
|
|
getProperties(options) {
|
|
return this.client.sendOperationRequest({ options }, container_getPropertiesOperationSpec);
|
|
}
|
|
/**
|
|
* operation marks the specified container for deletion. The container and any blobs contained within
|
|
* it are later deleted during garbage collection
|
|
* @param options The options parameters.
|
|
*/
|
|
delete(options) {
|
|
return this.client.sendOperationRequest({ options }, deleteOperationSpec);
|
|
}
|
|
/**
|
|
* operation sets one or more user-defined name-value pairs for the specified container.
|
|
* @param options The options parameters.
|
|
*/
|
|
setMetadata(options) {
|
|
return this.client.sendOperationRequest({ options }, setMetadataOperationSpec);
|
|
}
|
|
/**
|
|
* gets the permissions for the specified container. The permissions indicate whether container data
|
|
* may be accessed publicly.
|
|
* @param options The options parameters.
|
|
*/
|
|
getAccessPolicy(options) {
|
|
return this.client.sendOperationRequest({ options }, getAccessPolicyOperationSpec);
|
|
}
|
|
/**
|
|
* sets the permissions for the specified container. The permissions indicate whether blobs in a
|
|
* container may be accessed publicly.
|
|
* @param options The options parameters.
|
|
*/
|
|
setAccessPolicy(options) {
|
|
return this.client.sendOperationRequest({ options }, setAccessPolicyOperationSpec);
|
|
}
|
|
/**
|
|
* Restores a previously-deleted container.
|
|
* @param options The options parameters.
|
|
*/
|
|
restore(options) {
|
|
return this.client.sendOperationRequest({ options }, restoreOperationSpec);
|
|
}
|
|
/**
|
|
* Renames an existing container.
|
|
* @param sourceContainerName Required. Specifies the name of the container to rename.
|
|
* @param options The options parameters.
|
|
*/
|
|
rename(sourceContainerName, options) {
|
|
return this.client.sendOperationRequest({ sourceContainerName, options }, renameOperationSpec);
|
|
}
|
|
/**
|
|
* The Batch operation allows multiple API calls to be embedded into a single HTTP request.
|
|
* @param contentLength The length of the request.
|
|
* @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
|
|
* boundary. Example header value: multipart/mixed; boundary=batch_<GUID>
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
submitBatch(contentLength, multipartContentType, body, options) {
|
|
return this.client.sendOperationRequest({ contentLength, multipartContentType, body, options }, container_submitBatchOperationSpec);
|
|
}
|
|
/**
|
|
* The Filter Blobs operation enables callers to list blobs in a container whose tags match a given
|
|
* search expression. Filter blobs searches within the given container.
|
|
* @param options The options parameters.
|
|
*/
|
|
filterBlobs(options) {
|
|
return this.client.sendOperationRequest({ options }, container_filterBlobsOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
|
|
* be 15 to 60 seconds, or can be infinite
|
|
* @param options The options parameters.
|
|
*/
|
|
acquireLease(options) {
|
|
return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
|
|
* be 15 to 60 seconds, or can be infinite
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param options The options parameters.
|
|
*/
|
|
releaseLease(leaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, options }, releaseLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
|
|
* be 15 to 60 seconds, or can be infinite
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param options The options parameters.
|
|
*/
|
|
renewLease(leaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, options }, renewLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
|
|
* be 15 to 60 seconds, or can be infinite
|
|
* @param options The options parameters.
|
|
*/
|
|
breakLease(options) {
|
|
return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
|
|
* be 15 to 60 seconds, or can be infinite
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
|
|
* (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
|
|
* (String) for a list of valid GUID string formats.
|
|
* @param options The options parameters.
|
|
*/
|
|
changeLease(leaseId, proposedLeaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, changeLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The List Blobs operation returns a list of the blobs under the specified container
|
|
* @param options The options parameters.
|
|
*/
|
|
listBlobFlatSegment(options) {
|
|
return this.client.sendOperationRequest({ options }, listBlobFlatSegmentOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The List Blobs operation returns a list of the blobs under the specified container
|
|
* @param delimiter When the request includes this parameter, the operation returns a BlobPrefix
|
|
* element in the response body that acts as a placeholder for all blobs whose names begin with the
|
|
* same substring up to the appearance of the delimiter character. The delimiter may be a single
|
|
* character or a string.
|
|
* @param options The options parameters.
|
|
*/
|
|
listBlobHierarchySegment(delimiter, options) {
|
|
return this.client.sendOperationRequest({ delimiter, options }, listBlobHierarchySegmentOperationSpec);
|
|
}
|
|
/**
|
|
* Returns the sku name and account kind
|
|
* @param options The options parameters.
|
|
*/
|
|
getAccountInfo(options) {
|
|
return this.client.sendOperationRequest({ options }, container_getAccountInfoOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const container_xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const createOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: ContainerCreateHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerCreateExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, restype2],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
access,
|
|
defaultEncryptionScope,
|
|
preventEncryptionScopeOverride,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const container_getPropertiesOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerGetPropertiesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerGetPropertiesExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, restype2],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const deleteOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "DELETE",
|
|
responses: {
|
|
202: {
|
|
headersMapper: ContainerDeleteHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerDeleteExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, restype2],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const setMetadataOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerSetMetadataHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerSetMetadataExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp6,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const getAccessPolicyOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: {
|
|
type: {
|
|
name: "Sequence",
|
|
element: {
|
|
type: { name: "Composite", className: "SignedIdentifier" },
|
|
},
|
|
},
|
|
serializedName: "SignedIdentifiers",
|
|
xmlName: "SignedIdentifiers",
|
|
xmlIsWrapped: true,
|
|
xmlElementName: "SignedIdentifier",
|
|
},
|
|
headersMapper: ContainerGetAccessPolicyHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerGetAccessPolicyExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp7,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const setAccessPolicyOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerSetAccessPolicyHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerSetAccessPolicyExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: containerAcl,
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp7,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
access,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const restoreOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: ContainerRestoreHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerRestoreExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp8,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
deletedContainerName,
|
|
deletedContainerVersion,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const renameOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerRenameHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerRenameExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp9,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
sourceContainerName,
|
|
sourceLeaseId,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const container_submitBatchOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "POST",
|
|
responses: {
|
|
202: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: ContainerSubmitBatchHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerSubmitBatchExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body,
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp4,
|
|
restype2,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
accept,
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
multipartContentType,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const container_filterBlobsOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: FilterBlobSegment,
|
|
headersMapper: ContainerFilterBlobsHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerFilterBlobsExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
marker,
|
|
maxPageSize,
|
|
comp5,
|
|
where,
|
|
restype2,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const acquireLeaseOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: ContainerAcquireLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerAcquireLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp10,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action,
|
|
duration,
|
|
proposedLeaseId,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const releaseLeaseOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerReleaseLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerReleaseLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp10,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action1,
|
|
leaseId1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const renewLeaseOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerRenewLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerRenewLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp10,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
leaseId1,
|
|
action2,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const breakLeaseOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: ContainerBreakLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerBreakLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp10,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action3,
|
|
breakPeriod,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const changeLeaseOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerChangeLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerChangeLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
restype2,
|
|
comp10,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
leaseId1,
|
|
action4,
|
|
proposedLeaseId1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const listBlobFlatSegmentOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: ListBlobsFlatSegmentResponse,
|
|
headersMapper: ContainerListBlobFlatSegmentHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerListBlobFlatSegmentExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp2,
|
|
prefix,
|
|
marker,
|
|
maxPageSize,
|
|
restype2,
|
|
include1,
|
|
startFrom,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const listBlobHierarchySegmentOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: ListBlobsHierarchySegmentResponse,
|
|
headersMapper: ContainerListBlobHierarchySegmentHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerListBlobHierarchySegmentExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp2,
|
|
prefix,
|
|
marker,
|
|
maxPageSize,
|
|
restype2,
|
|
include1,
|
|
startFrom,
|
|
delimiter,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
const container_getAccountInfoOperationSpec = {
|
|
path: "/{containerName}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
headersMapper: ContainerGetAccountInfoHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: ContainerGetAccountInfoExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
comp,
|
|
timeoutInSeconds,
|
|
restype1,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: container_xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=container.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/blob.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing Blob operations. */
|
|
class BlobImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class Blob class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* The Download operation reads or downloads a blob from the system, including its metadata and
|
|
* properties. You can also call Download to read a snapshot.
|
|
* @param options The options parameters.
|
|
*/
|
|
download(options) {
|
|
return this.client.sendOperationRequest({ options }, downloadOperationSpec);
|
|
}
|
|
/**
|
|
* The Get Properties operation returns all user-defined metadata, standard HTTP properties, and system
|
|
* properties for the blob. It does not return the content of the blob.
|
|
* @param options The options parameters.
|
|
*/
|
|
getProperties(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_getPropertiesOperationSpec);
|
|
}
|
|
/**
|
|
* If the storage account's soft delete feature is disabled then, when a blob is deleted, it is
|
|
* permanently removed from the storage account. If the storage account's soft delete feature is
|
|
* enabled, then, when a blob is deleted, it is marked for deletion and becomes inaccessible
|
|
* immediately. However, the blob service retains the blob or snapshot for the number of days specified
|
|
* by the DeleteRetentionPolicy section of [Storage service properties]
|
|
* (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is
|
|
* permanently removed from the storage account. Note that you continue to be charged for the
|
|
* soft-deleted blob's storage until it is permanently removed. Use the List Blobs API and specify the
|
|
* "include=deleted" query parameter to discover which blobs and snapshots have been soft deleted. You
|
|
* can then use the Undelete Blob API to restore a soft-deleted blob. All other operations on a
|
|
* soft-deleted blob or snapshot causes the service to return an HTTP status code of 404
|
|
* (ResourceNotFound).
|
|
* @param options The options parameters.
|
|
*/
|
|
delete(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_deleteOperationSpec);
|
|
}
|
|
/**
|
|
* Undelete a blob that was previously soft deleted
|
|
* @param options The options parameters.
|
|
*/
|
|
undelete(options) {
|
|
return this.client.sendOperationRequest({ options }, undeleteOperationSpec);
|
|
}
|
|
/**
|
|
* Sets the time a blob will expire and be deleted.
|
|
* @param expiryOptions Required. Indicates mode of the expiry time
|
|
* @param options The options parameters.
|
|
*/
|
|
setExpiry(expiryOptions, options) {
|
|
return this.client.sendOperationRequest({ expiryOptions, options }, setExpiryOperationSpec);
|
|
}
|
|
/**
|
|
* The Set HTTP Headers operation sets system properties on the blob
|
|
* @param options The options parameters.
|
|
*/
|
|
setHttpHeaders(options) {
|
|
return this.client.sendOperationRequest({ options }, setHttpHeadersOperationSpec);
|
|
}
|
|
/**
|
|
* The Set Immutability Policy operation sets the immutability policy on the blob
|
|
* @param options The options parameters.
|
|
*/
|
|
setImmutabilityPolicy(options) {
|
|
return this.client.sendOperationRequest({ options }, setImmutabilityPolicyOperationSpec);
|
|
}
|
|
/**
|
|
* The Delete Immutability Policy operation deletes the immutability policy on the blob
|
|
* @param options The options parameters.
|
|
*/
|
|
deleteImmutabilityPolicy(options) {
|
|
return this.client.sendOperationRequest({ options }, deleteImmutabilityPolicyOperationSpec);
|
|
}
|
|
/**
|
|
* The Set Legal Hold operation sets a legal hold on the blob.
|
|
* @param legalHold Specified if a legal hold should be set on the blob.
|
|
* @param options The options parameters.
|
|
*/
|
|
setLegalHold(legalHold, options) {
|
|
return this.client.sendOperationRequest({ legalHold, options }, setLegalHoldOperationSpec);
|
|
}
|
|
/**
|
|
* The Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more
|
|
* name-value pairs
|
|
* @param options The options parameters.
|
|
*/
|
|
setMetadata(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_setMetadataOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
|
|
* operations
|
|
* @param options The options parameters.
|
|
*/
|
|
acquireLease(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_acquireLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
|
|
* operations
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param options The options parameters.
|
|
*/
|
|
releaseLease(leaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, options }, blob_releaseLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
|
|
* operations
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param options The options parameters.
|
|
*/
|
|
renewLease(leaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, options }, blob_renewLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
|
|
* operations
|
|
* @param leaseId Specifies the current lease ID on the resource.
|
|
* @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
|
|
* (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
|
|
* (String) for a list of valid GUID string formats.
|
|
* @param options The options parameters.
|
|
*/
|
|
changeLease(leaseId, proposedLeaseId, options) {
|
|
return this.client.sendOperationRequest({ leaseId, proposedLeaseId, options }, blob_changeLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete
|
|
* operations
|
|
* @param options The options parameters.
|
|
*/
|
|
breakLease(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_breakLeaseOperationSpec);
|
|
}
|
|
/**
|
|
* The Create Snapshot operation creates a read-only snapshot of a blob
|
|
* @param options The options parameters.
|
|
*/
|
|
createSnapshot(options) {
|
|
return this.client.sendOperationRequest({ options }, createSnapshotOperationSpec);
|
|
}
|
|
/**
|
|
* The Start Copy From URL operation copies a blob or an internet resource to a new blob.
|
|
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
|
|
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
|
|
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
|
|
* access signature.
|
|
* @param options The options parameters.
|
|
*/
|
|
startCopyFromURL(copySource, options) {
|
|
return this.client.sendOperationRequest({ copySource, options }, startCopyFromURLOperationSpec);
|
|
}
|
|
/**
|
|
* The Copy From URL operation copies a blob or an internet resource to a new blob. It will not return
|
|
* a response until the copy is complete.
|
|
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
|
|
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
|
|
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
|
|
* access signature.
|
|
* @param options The options parameters.
|
|
*/
|
|
copyFromURL(copySource, options) {
|
|
return this.client.sendOperationRequest({ copySource, options }, copyFromURLOperationSpec);
|
|
}
|
|
/**
|
|
* The Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a destination
|
|
* blob with zero length and full metadata.
|
|
* @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy Blob
|
|
* operation.
|
|
* @param options The options parameters.
|
|
*/
|
|
abortCopyFromURL(copyId, options) {
|
|
return this.client.sendOperationRequest({ copyId, options }, abortCopyFromURLOperationSpec);
|
|
}
|
|
/**
|
|
* The Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium
|
|
* storage account and on a block blob in a blob storage account (locally redundant storage only). A
|
|
* premium page blob's tier determines the allowed size, IOPS, and bandwidth of the blob. A block
|
|
* blob's tier determines Hot/Cool/Archive storage type. This operation does not update the blob's
|
|
* ETag.
|
|
* @param tier Indicates the tier to be set on the blob.
|
|
* @param options The options parameters.
|
|
*/
|
|
setTier(tier, options) {
|
|
return this.client.sendOperationRequest({ tier, options }, setTierOperationSpec);
|
|
}
|
|
/**
|
|
* Returns the sku name and account kind
|
|
* @param options The options parameters.
|
|
*/
|
|
getAccountInfo(options) {
|
|
return this.client.sendOperationRequest({ options }, blob_getAccountInfoOperationSpec);
|
|
}
|
|
/**
|
|
* The Query operation enables users to select/project on blob data by providing simple query
|
|
* expressions.
|
|
* @param options The options parameters.
|
|
*/
|
|
query(options) {
|
|
return this.client.sendOperationRequest({ options }, queryOperationSpec);
|
|
}
|
|
/**
|
|
* The Get Tags operation enables users to get the tags associated with a blob.
|
|
* @param options The options parameters.
|
|
*/
|
|
getTags(options) {
|
|
return this.client.sendOperationRequest({ options }, getTagsOperationSpec);
|
|
}
|
|
/**
|
|
* The Set Tags operation enables users to set tags on a blob.
|
|
* @param options The options parameters.
|
|
*/
|
|
setTags(options) {
|
|
return this.client.sendOperationRequest({ options }, setTagsOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const blob_xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const downloadOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: BlobDownloadHeaders,
|
|
},
|
|
206: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: BlobDownloadHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobDownloadExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
range,
|
|
rangeGetContentMD5,
|
|
rangeGetContentCRC64,
|
|
structuredBodyType,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_getPropertiesOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "HEAD",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobGetPropertiesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobGetPropertiesExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_deleteOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "DELETE",
|
|
responses: {
|
|
202: {
|
|
headersMapper: BlobDeleteHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobDeleteExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
blobDeleteType,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
deleteSnapshots,
|
|
accessTierIfModifiedSince,
|
|
accessTierIfUnmodifiedSince,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const undeleteOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobUndeleteHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobUndeleteExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp8],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setExpiryOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetExpiryHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetExpiryExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp11],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
expiryOptions,
|
|
expiresOn,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setHttpHeadersOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetHttpHeadersHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetHttpHeadersExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [comp, timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setImmutabilityPolicyOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetImmutabilityPolicyHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetImmutabilityPolicyExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
comp12,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifUnmodifiedSince,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const deleteImmutabilityPolicyOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "DELETE",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobDeleteImmutabilityPolicyHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobDeleteImmutabilityPolicyExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
comp12,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setLegalHoldOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetLegalHoldHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetLegalHoldExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
comp13,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
legalHold,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_setMetadataOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetMetadataHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetMetadataExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp6],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_acquireLeaseOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlobAcquireLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobAcquireLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp10],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action,
|
|
duration,
|
|
proposedLeaseId,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_releaseLeaseOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobReleaseLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobReleaseLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp10],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action1,
|
|
leaseId1,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_renewLeaseOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobRenewLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobRenewLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp10],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
leaseId1,
|
|
action2,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_changeLeaseOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobChangeLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobChangeLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp10],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
leaseId1,
|
|
action4,
|
|
proposedLeaseId1,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_breakLeaseOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: BlobBreakLeaseHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobBreakLeaseExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp10],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
action3,
|
|
breakPeriod,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const createSnapshotOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlobCreateSnapshotHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobCreateSnapshotExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp14],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const startCopyFromURLOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: BlobStartCopyFromURLHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobStartCopyFromURLExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
tier,
|
|
rehydratePriority,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
sourceIfTags,
|
|
copySource,
|
|
blobTagsString,
|
|
sealBlob,
|
|
legalHold1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const copyFromURLOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: BlobCopyFromURLHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobCopyFromURLExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
encryptionScope,
|
|
tier,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
copySource,
|
|
blobTagsString,
|
|
legalHold1,
|
|
xMsRequiresSync,
|
|
sourceContentMD5,
|
|
copySourceAuthorization,
|
|
copySourceTags,
|
|
fileRequestIntent,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const abortCopyFromURLOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
204: {
|
|
headersMapper: BlobAbortCopyFromURLHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobAbortCopyFromURLExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp15,
|
|
copyId,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
copyActionAbortConstant,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setTierOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobSetTierHeaders,
|
|
},
|
|
202: {
|
|
headersMapper: BlobSetTierHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetTierExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
comp16,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifTags,
|
|
rehydratePriority,
|
|
tier1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const blob_getAccountInfoOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
headersMapper: BlobGetAccountInfoHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobGetAccountInfoExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
comp,
|
|
timeoutInSeconds,
|
|
restype1,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const queryOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "POST",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: BlobQueryHeaders,
|
|
},
|
|
206: {
|
|
bodyMapper: {
|
|
type: { name: "Stream" },
|
|
serializedName: "parsedResponse",
|
|
},
|
|
headersMapper: BlobQueryHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobQueryExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: queryRequest,
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
comp17,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const getTagsOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: BlobTags,
|
|
headersMapper: BlobGetTagsHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobGetTagsExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
versionId,
|
|
comp18,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifTags,
|
|
ifModifiedSince1,
|
|
ifUnmodifiedSince1,
|
|
ifMatch1,
|
|
ifNoneMatch1,
|
|
],
|
|
isXML: true,
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
const setTagsOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
204: {
|
|
headersMapper: BlobSetTagsHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlobSetTagsExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: tags,
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
versionId,
|
|
comp18,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
leaseId,
|
|
ifTags,
|
|
ifModifiedSince1,
|
|
ifUnmodifiedSince1,
|
|
ifMatch1,
|
|
ifNoneMatch1,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: blob_xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=blob.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/pageBlob.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing PageBlob operations. */
|
|
class PageBlobImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class PageBlob class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* The Create operation creates a new page blob.
|
|
* @param contentLength The length of the request.
|
|
* @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
|
|
* page blob size must be aligned to a 512-byte boundary.
|
|
* @param options The options parameters.
|
|
*/
|
|
create(contentLength, blobContentLength, options) {
|
|
return this.client.sendOperationRequest({ contentLength, blobContentLength, options }, pageBlob_createOperationSpec);
|
|
}
|
|
/**
|
|
* The Upload Pages operation writes a range of pages to a page blob
|
|
* @param contentLength The length of the request.
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
uploadPages(contentLength, body, options) {
|
|
return this.client.sendOperationRequest({ contentLength, body, options }, uploadPagesOperationSpec);
|
|
}
|
|
/**
|
|
* The Clear Pages operation clears a set of pages from a page blob
|
|
* @param contentLength The length of the request.
|
|
* @param options The options parameters.
|
|
*/
|
|
clearPages(contentLength, options) {
|
|
return this.client.sendOperationRequest({ contentLength, options }, clearPagesOperationSpec);
|
|
}
|
|
/**
|
|
* The Upload Pages operation writes a range of pages to a page blob where the contents are read from a
|
|
* URL
|
|
* @param sourceUrl Specify a URL to the copy source.
|
|
* @param sourceRange Bytes of source data in the specified range. The length of this range should
|
|
* match the ContentLength header and x-ms-range/Range destination range header.
|
|
* @param contentLength The length of the request.
|
|
* @param range The range of bytes to which the source range would be written. The range should be 512
|
|
* aligned and range-end is required.
|
|
* @param options The options parameters.
|
|
*/
|
|
uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {
|
|
return this.client.sendOperationRequest({ sourceUrl, sourceRange, contentLength, range, options }, uploadPagesFromURLOperationSpec);
|
|
}
|
|
/**
|
|
* The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a
|
|
* page blob
|
|
* @param options The options parameters.
|
|
*/
|
|
getPageRanges(options) {
|
|
return this.client.sendOperationRequest({ options }, getPageRangesOperationSpec);
|
|
}
|
|
/**
|
|
* The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were
|
|
* changed between target blob and previous snapshot.
|
|
* @param options The options parameters.
|
|
*/
|
|
getPageRangesDiff(options) {
|
|
return this.client.sendOperationRequest({ options }, getPageRangesDiffOperationSpec);
|
|
}
|
|
/**
|
|
* Resize the Blob
|
|
* @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
|
|
* page blob size must be aligned to a 512-byte boundary.
|
|
* @param options The options parameters.
|
|
*/
|
|
resize(blobContentLength, options) {
|
|
return this.client.sendOperationRequest({ blobContentLength, options }, resizeOperationSpec);
|
|
}
|
|
/**
|
|
* Update the sequence number of the blob
|
|
* @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.
|
|
* This property applies to page blobs only. This property indicates how the service should modify the
|
|
* blob's sequence number
|
|
* @param options The options parameters.
|
|
*/
|
|
updateSequenceNumber(sequenceNumberAction, options) {
|
|
return this.client.sendOperationRequest({ sequenceNumberAction, options }, updateSequenceNumberOperationSpec);
|
|
}
|
|
/**
|
|
* The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.
|
|
* The snapshot is copied such that only the differential changes between the previously copied
|
|
* snapshot are transferred to the destination. The copied snapshots are complete copies of the
|
|
* original snapshot and can be read or copied from as usual. This API is supported since REST version
|
|
* 2016-05-31.
|
|
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
|
|
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
|
|
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
|
|
* access signature.
|
|
* @param options The options parameters.
|
|
*/
|
|
copyIncremental(copySource, options) {
|
|
return this.client.sendOperationRequest({ copySource, options }, copyIncrementalOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const pageBlob_xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const pageBlob_createOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: PageBlobCreateHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobCreateExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
encryptionScope,
|
|
tier,
|
|
blobTagsString,
|
|
legalHold1,
|
|
blobType,
|
|
blobContentLength,
|
|
blobSequenceNumber,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const uploadPagesOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: PageBlobUploadPagesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobUploadPagesExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body1,
|
|
queryParameters: [timeoutInSeconds, comp19],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
range,
|
|
structuredBodyType,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
contentType1,
|
|
accept2,
|
|
pageWrite,
|
|
ifSequenceNumberLessThanOrEqualTo,
|
|
ifSequenceNumberLessThan,
|
|
ifSequenceNumberEqualTo,
|
|
structuredContentLength,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "binary",
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const clearPagesOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: PageBlobClearPagesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobClearPagesExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp19],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
range,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
ifSequenceNumberLessThanOrEqualTo,
|
|
ifSequenceNumberLessThan,
|
|
ifSequenceNumberEqualTo,
|
|
pageWrite1,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const uploadPagesFromURLOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: PageBlobUploadPagesFromURLHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobUploadPagesFromURLExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp19],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
sourceContentMD5,
|
|
copySourceAuthorization,
|
|
fileRequestIntent,
|
|
pageWrite,
|
|
ifSequenceNumberLessThanOrEqualTo,
|
|
ifSequenceNumberLessThan,
|
|
ifSequenceNumberEqualTo,
|
|
sourceUrl,
|
|
sourceRange,
|
|
sourceContentCrc64,
|
|
range1,
|
|
sourceEncryptionKey,
|
|
sourceEncryptionKeySha256,
|
|
sourceEncryptionAlgorithm,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const getPageRangesOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: PageList,
|
|
headersMapper: PageBlobGetPageRangesHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobGetPageRangesExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
marker,
|
|
maxPageSize,
|
|
snapshot,
|
|
comp20,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
range,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const getPageRangesDiffOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: PageList,
|
|
headersMapper: PageBlobGetPageRangesDiffHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobGetPageRangesDiffExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
marker,
|
|
maxPageSize,
|
|
snapshot,
|
|
comp20,
|
|
prevsnapshot,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
range,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
prevSnapshotUrl,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const resizeOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: PageBlobResizeHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobResizeExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [comp, timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
blobContentLength,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const updateSequenceNumberOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: PageBlobUpdateSequenceNumberHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobUpdateSequenceNumberExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [comp, timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobSequenceNumber,
|
|
sequenceNumberAction,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
const copyIncrementalOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
202: {
|
|
headersMapper: PageBlobCopyIncrementalHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: PageBlobCopyIncrementalExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp21],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
copySource,
|
|
],
|
|
isXML: true,
|
|
serializer: pageBlob_xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=pageBlob.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/appendBlob.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing AppendBlob operations. */
|
|
class AppendBlobImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class AppendBlob class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* The Create Append Blob operation creates a new append blob.
|
|
* @param contentLength The length of the request.
|
|
* @param options The options parameters.
|
|
*/
|
|
create(contentLength, options) {
|
|
return this.client.sendOperationRequest({ contentLength, options }, appendBlob_createOperationSpec);
|
|
}
|
|
/**
|
|
* The Append Block operation commits a new block of data to the end of an existing append blob. The
|
|
* Append Block operation is permitted only if the blob was created with x-ms-blob-type set to
|
|
* AppendBlob. Append Block is supported only on version 2015-02-21 version or later.
|
|
* @param contentLength The length of the request.
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
appendBlock(contentLength, body, options) {
|
|
return this.client.sendOperationRequest({ contentLength, body, options }, appendBlockOperationSpec);
|
|
}
|
|
/**
|
|
* The Append Block operation commits a new block of data to the end of an existing append blob where
|
|
* the contents are read from a source url. The Append Block operation is permitted only if the blob
|
|
* was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version
|
|
* 2015-02-21 version or later.
|
|
* @param sourceUrl Specify a URL to the copy source.
|
|
* @param contentLength The length of the request.
|
|
* @param options The options parameters.
|
|
*/
|
|
appendBlockFromUrl(sourceUrl, contentLength, options) {
|
|
return this.client.sendOperationRequest({ sourceUrl, contentLength, options }, appendBlockFromUrlOperationSpec);
|
|
}
|
|
/**
|
|
* The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version
|
|
* 2019-12-12 version or later.
|
|
* @param options The options parameters.
|
|
*/
|
|
seal(options) {
|
|
return this.client.sendOperationRequest({ options }, sealOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const appendBlob_xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const appendBlob_createOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: AppendBlobCreateHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: AppendBlobCreateExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
encryptionScope,
|
|
blobTagsString,
|
|
legalHold1,
|
|
blobType1,
|
|
],
|
|
isXML: true,
|
|
serializer: appendBlob_xmlSerializer,
|
|
};
|
|
const appendBlockOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: AppendBlobAppendBlockHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: AppendBlobAppendBlockExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body1,
|
|
queryParameters: [timeoutInSeconds, comp22],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
structuredBodyType,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
contentType1,
|
|
accept2,
|
|
structuredContentLength,
|
|
maxSize,
|
|
appendPosition,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "binary",
|
|
serializer: appendBlob_xmlSerializer,
|
|
};
|
|
const appendBlockFromUrlOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: AppendBlobAppendBlockFromUrlHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: AppendBlobAppendBlockFromUrlExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp22],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
encryptionScope,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
sourceContentMD5,
|
|
copySourceAuthorization,
|
|
fileRequestIntent,
|
|
transactionalContentMD5,
|
|
sourceUrl,
|
|
sourceContentCrc64,
|
|
sourceEncryptionKey,
|
|
sourceEncryptionKeySha256,
|
|
sourceEncryptionAlgorithm,
|
|
maxSize,
|
|
appendPosition,
|
|
sourceRange1,
|
|
],
|
|
isXML: true,
|
|
serializer: appendBlob_xmlSerializer,
|
|
};
|
|
const sealOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
200: {
|
|
headersMapper: AppendBlobSealHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: AppendBlobSealExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds, comp23],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
appendPosition,
|
|
],
|
|
isXML: true,
|
|
serializer: appendBlob_xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=appendBlob.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/blockBlob.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
/** Class containing BlockBlob operations. */
|
|
class BlockBlobImpl {
|
|
client;
|
|
/**
|
|
* Initialize a new instance of the class BlockBlob class.
|
|
* @param client Reference to the service client
|
|
*/
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
/**
|
|
* The Upload Block Blob operation updates the content of an existing block blob. Updating an existing
|
|
* block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put
|
|
* Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a
|
|
* partial update of the content of a block blob, use the Put Block List operation.
|
|
* @param contentLength The length of the request.
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
upload(contentLength, body, options) {
|
|
return this.client.sendOperationRequest({ contentLength, body, options }, uploadOperationSpec);
|
|
}
|
|
/**
|
|
* The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read
|
|
* from a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are
|
|
* not supported with Put Blob from URL; the content of an existing blob is overwritten with the
|
|
* content of the new blob. To perform partial updates to a block blob’s contents using a source URL,
|
|
* use the Put Block from URL API in conjunction with Put Block List.
|
|
* @param contentLength The length of the request.
|
|
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
|
|
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
|
|
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
|
|
* access signature.
|
|
* @param options The options parameters.
|
|
*/
|
|
putBlobFromUrl(contentLength, copySource, options) {
|
|
return this.client.sendOperationRequest({ contentLength, copySource, options }, putBlobFromUrlOperationSpec);
|
|
}
|
|
/**
|
|
* The Stage Block operation creates a new block to be committed as part of a blob
|
|
* @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
|
|
* must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
|
|
* for the blockid parameter must be the same size for each block.
|
|
* @param contentLength The length of the request.
|
|
* @param body Initial data
|
|
* @param options The options parameters.
|
|
*/
|
|
stageBlock(blockId, contentLength, body, options) {
|
|
return this.client.sendOperationRequest({ blockId, contentLength, body, options }, stageBlockOperationSpec);
|
|
}
|
|
/**
|
|
* The Stage Block operation creates a new block to be committed as part of a blob where the contents
|
|
* are read from a URL.
|
|
* @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
|
|
* must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
|
|
* for the blockid parameter must be the same size for each block.
|
|
* @param contentLength The length of the request.
|
|
* @param sourceUrl Specify a URL to the copy source.
|
|
* @param options The options parameters.
|
|
*/
|
|
stageBlockFromURL(blockId, contentLength, sourceUrl, options) {
|
|
return this.client.sendOperationRequest({ blockId, contentLength, sourceUrl, options }, stageBlockFromURLOperationSpec);
|
|
}
|
|
/**
|
|
* The Commit Block List operation writes a blob by specifying the list of block IDs that make up the
|
|
* blob. In order to be written as part of a blob, a block must have been successfully written to the
|
|
* server in a prior Put Block operation. You can call Put Block List to update a blob by uploading
|
|
* only those blocks that have changed, then committing the new and existing blocks together. You can
|
|
* do this by specifying whether to commit a block from the committed block list or from the
|
|
* uncommitted block list, or to commit the most recently uploaded version of the block, whichever list
|
|
* it may belong to.
|
|
* @param blocks Blob Blocks.
|
|
* @param options The options parameters.
|
|
*/
|
|
commitBlockList(blocks, options) {
|
|
return this.client.sendOperationRequest({ blocks, options }, commitBlockListOperationSpec);
|
|
}
|
|
/**
|
|
* The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block
|
|
* blob
|
|
* @param listType Specifies whether to return the list of committed blocks, the list of uncommitted
|
|
* blocks, or both lists together.
|
|
* @param options The options parameters.
|
|
*/
|
|
getBlockList(listType, options) {
|
|
return this.client.sendOperationRequest({ listType, options }, getBlockListOperationSpec);
|
|
}
|
|
}
|
|
// Operation Specifications
|
|
const blockBlob_xmlSerializer = createSerializer(mappers_namespaceObject, /* isXml */ true);
|
|
const uploadOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlockBlobUploadHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobUploadExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body1,
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
structuredBodyType,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
encryptionScope,
|
|
tier,
|
|
blobTagsString,
|
|
legalHold1,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
contentType1,
|
|
accept2,
|
|
structuredContentLength,
|
|
blobType2,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "binary",
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
const putBlobFromUrlOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlockBlobPutBlobFromUrlHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobPutBlobFromUrlExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [timeoutInSeconds],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
encryptionScope,
|
|
tier,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
sourceIfTags,
|
|
copySource,
|
|
blobTagsString,
|
|
sourceContentMD5,
|
|
copySourceAuthorization,
|
|
copySourceTags,
|
|
fileRequestIntent,
|
|
transactionalContentMD5,
|
|
sourceEncryptionKey,
|
|
sourceEncryptionKeySha256,
|
|
sourceEncryptionAlgorithm,
|
|
blobType2,
|
|
copySourceBlobProperties,
|
|
],
|
|
isXML: true,
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
const stageBlockOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlockBlobStageBlockHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobStageBlockExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: body1,
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp24,
|
|
blockId,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
contentLength,
|
|
leaseId,
|
|
structuredBodyType,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
encryptionScope,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
contentType1,
|
|
accept2,
|
|
structuredContentLength,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "binary",
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
const stageBlockFromURLOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlockBlobStageBlockFromURLHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobStageBlockFromURLExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
comp24,
|
|
blockId,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
contentLength,
|
|
leaseId,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
encryptionScope,
|
|
sourceIfModifiedSince,
|
|
sourceIfUnmodifiedSince,
|
|
sourceIfMatch,
|
|
sourceIfNoneMatch,
|
|
sourceContentMD5,
|
|
copySourceAuthorization,
|
|
fileRequestIntent,
|
|
sourceUrl,
|
|
sourceContentCrc64,
|
|
sourceEncryptionKey,
|
|
sourceEncryptionKeySha256,
|
|
sourceEncryptionAlgorithm,
|
|
sourceRange1,
|
|
],
|
|
isXML: true,
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
const commitBlockListOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "PUT",
|
|
responses: {
|
|
201: {
|
|
headersMapper: BlockBlobCommitBlockListHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobCommitBlockListExceptionHeaders,
|
|
},
|
|
},
|
|
requestBody: blocks,
|
|
queryParameters: [timeoutInSeconds, comp25],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
contentType,
|
|
accept,
|
|
version,
|
|
requestId,
|
|
metadata,
|
|
leaseId,
|
|
ifModifiedSince,
|
|
ifUnmodifiedSince,
|
|
encryptionKey,
|
|
encryptionKeySha256,
|
|
encryptionAlgorithm,
|
|
ifMatch,
|
|
ifNoneMatch,
|
|
ifTags,
|
|
blobCacheControl,
|
|
blobContentType,
|
|
blobContentMD5,
|
|
blobContentEncoding,
|
|
blobContentLanguage,
|
|
blobContentDisposition,
|
|
immutabilityPolicyExpiry,
|
|
immutabilityPolicyMode,
|
|
encryptionScope,
|
|
tier,
|
|
blobTagsString,
|
|
legalHold1,
|
|
transactionalContentMD5,
|
|
transactionalContentCrc64,
|
|
],
|
|
isXML: true,
|
|
contentType: "application/xml; charset=utf-8",
|
|
mediaType: "xml",
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
const getBlockListOperationSpec = {
|
|
path: "/{containerName}/{blob}",
|
|
httpMethod: "GET",
|
|
responses: {
|
|
200: {
|
|
bodyMapper: BlockList,
|
|
headersMapper: BlockBlobGetBlockListHeaders,
|
|
},
|
|
default: {
|
|
bodyMapper: StorageError,
|
|
headersMapper: BlockBlobGetBlockListExceptionHeaders,
|
|
},
|
|
},
|
|
queryParameters: [
|
|
timeoutInSeconds,
|
|
snapshot,
|
|
comp25,
|
|
listType,
|
|
],
|
|
urlParameters: [url],
|
|
headerParameters: [
|
|
version,
|
|
requestId,
|
|
accept1,
|
|
leaseId,
|
|
ifTags,
|
|
],
|
|
isXML: true,
|
|
serializer: blockBlob_xmlSerializer,
|
|
};
|
|
//# sourceMappingURL=blockBlob.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/operations/index.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/storageClient.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
class StorageClient extends ExtendedServiceClient {
|
|
url;
|
|
version;
|
|
/**
|
|
* Initializes a new instance of the StorageClient class.
|
|
* @param url The URL of the service account, container, or blob that is the target of the desired
|
|
* operation.
|
|
* @param options The parameter options
|
|
*/
|
|
constructor(url, options) {
|
|
if (url === undefined) {
|
|
throw new Error("'url' cannot be null");
|
|
}
|
|
// Initializing default values for options
|
|
if (!options) {
|
|
options = {};
|
|
}
|
|
const defaults = {
|
|
requestContentType: "application/json; charset=utf-8",
|
|
};
|
|
const packageDetails = `azsdk-js-azure-storage-blob/12.33.0`;
|
|
const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix
|
|
? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}`
|
|
: `${packageDetails}`;
|
|
const optionsWithDefaults = {
|
|
...defaults,
|
|
...options,
|
|
userAgentOptions: {
|
|
userAgentPrefix,
|
|
},
|
|
endpoint: options.endpoint ?? options.baseUri ?? "{url}",
|
|
};
|
|
super(optionsWithDefaults);
|
|
// Parameter assignments
|
|
this.url = url;
|
|
// Assigning values to Constant parameters
|
|
this.version = options.version || "2026-06-06";
|
|
this.service = new ServiceImpl(this);
|
|
this.container = new ContainerImpl(this);
|
|
this.blob = new BlobImpl(this);
|
|
this.pageBlob = new PageBlobImpl(this);
|
|
this.appendBlob = new AppendBlobImpl(this);
|
|
this.blockBlob = new BlockBlobImpl(this);
|
|
}
|
|
service;
|
|
container;
|
|
blob;
|
|
pageBlob;
|
|
appendBlob;
|
|
blockBlob;
|
|
}
|
|
//# sourceMappingURL=storageClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generated/src/index.js
|
|
/*
|
|
* Copyright (c) Microsoft Corporation.
|
|
* Licensed under the MIT License.
|
|
*
|
|
* Code generated by Microsoft (R) AutoRest Code Generator.
|
|
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
|
|
*/
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/StorageContextClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
class StorageContextClient extends StorageClient {
|
|
async sendOperationRequest(operationArguments, operationSpec) {
|
|
const operationSpecToSend = { ...operationSpec };
|
|
if (operationSpecToSend.path === "/{containerName}" ||
|
|
operationSpecToSend.path === "/{containerName}/{blob}") {
|
|
operationSpecToSend.path = "";
|
|
}
|
|
return super.sendOperationRequest(operationArguments, operationSpecToSend);
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageContextClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/utils.common.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
const accountNameSuffixes = [
|
|
"-secondary-ipv6",
|
|
"-secondary-dualstack",
|
|
"-ipv6",
|
|
"-dualstack",
|
|
"-secondary",
|
|
];
|
|
/**
|
|
* Reserved URL characters must be properly escaped for Storage services like Blob or File.
|
|
*
|
|
* ## URL encode and escape strategy for JS SDKs
|
|
*
|
|
* When customers pass a URL string into XxxClient classes constructor, the URL string may already be URL encoded or not.
|
|
* But before sending to Azure Storage server, the URL must be encoded. However, it's hard for a SDK to guess whether the URL
|
|
* string has been encoded or not. We have 2 potential strategies, and chose strategy two for the XxxClient constructors.
|
|
*
|
|
* ### Strategy One: Assume the customer URL string is not encoded, and always encode URL string in SDK.
|
|
*
|
|
* This is what legacy V2 SDK does, simple and works for most of the cases.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b:",
|
|
* SDK will encode it to "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
|
|
* SDK will encode it to "http://account.blob.core.windows.net/con/b%253A" and send to server. A blob named "b%3A" will be created.
|
|
*
|
|
* But this strategy will make it not possible to create a blob with "?" in it's name. Because when customer URL string is
|
|
* "http://account.blob.core.windows.net/con/blob?name", the "?name" will be treated as URL paramter instead of blob name.
|
|
* If customer URL string is "http://account.blob.core.windows.net/con/blob%3Fname", a blob named "blob%3Fname" will be created.
|
|
* V2 SDK doesn't have this issue because it doesn't allow customer pass in a full URL, it accepts a separate blob name and encodeURIComponent for it.
|
|
* We cannot accept a SDK cannot create a blob name with "?". So we implement strategy two:
|
|
*
|
|
* ### Strategy Two: SDK doesn't assume the URL has been encoded or not. It will just escape the special characters.
|
|
*
|
|
* This is what V10 Blob Go SDK does. It accepts a URL type in Go, and call url.EscapedPath() to escape the special chars unescaped.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b:",
|
|
* SDK will escape ":" like "http://account.blob.core.windows.net/con/b%3A" and send to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%3A",
|
|
* There is no special characters, so send "http://account.blob.core.windows.net/con/b%3A" to server. A blob named "b:" will be created.
|
|
* - When customer URL string is "http://account.blob.core.windows.net/con/b%253A",
|
|
* There is no special characters, so send "http://account.blob.core.windows.net/con/b%253A" to server. A blob named "b%3A" will be created.
|
|
*
|
|
* This strategy gives us flexibility to create with any special characters. But "%" will be treated as a special characters, if the URL string
|
|
* is not encoded, there shouldn't a "%" in the URL string, otherwise the URL is not a valid URL.
|
|
* If customer needs to create a blob with "%" in it's blob name, use "%25" instead of "%". Just like above 3rd sample.
|
|
* And following URL strings are invalid:
|
|
* - "http://account.blob.core.windows.net/con/b%"
|
|
* - "http://account.blob.core.windows.net/con/b%2"
|
|
* - "http://account.blob.core.windows.net/con/b%G"
|
|
*
|
|
* Another special character is "?", use "%2F" to represent a blob name with "?" in a URL string.
|
|
*
|
|
* ### Strategy for containerName, blobName or other specific XXXName parameters in methods such as `containerClient.getBlobClient(blobName)`
|
|
*
|
|
* We will apply strategy one, and call encodeURIComponent for these parameters like blobName. Because what customers passes in is a plain name instead of a URL.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata
|
|
*
|
|
* @param url -
|
|
*/
|
|
function utils_common_escapeURLPath(url) {
|
|
const urlParsed = new URL(url);
|
|
let path = urlParsed.pathname;
|
|
path = path || "/";
|
|
path = utils_utils_common_escape(path);
|
|
urlParsed.pathname = path;
|
|
return urlParsed.toString();
|
|
}
|
|
function utils_common_getProxyUriFromDevConnString(connectionString) {
|
|
// Development Connection String
|
|
// https://learn.microsoft.com/azure/storage/common/storage-configure-connection-string#connect-to-the-emulator-account-using-the-well-known-account-name-and-key
|
|
let proxyUri = "";
|
|
if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) {
|
|
// CONNECTION_STRING=UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://myProxyUri
|
|
const matchCredentials = connectionString.split(";");
|
|
for (const element of matchCredentials) {
|
|
if (element.trim().startsWith("DevelopmentStorageProxyUri=")) {
|
|
proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1];
|
|
}
|
|
}
|
|
}
|
|
return proxyUri;
|
|
}
|
|
function utils_common_getValueInConnString(connectionString, argument) {
|
|
const elements = connectionString.split(";");
|
|
for (const element of elements) {
|
|
if (element.trim().startsWith(argument)) {
|
|
return element.trim().match(argument + "=(.*)")[1];
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
/**
|
|
* Extracts the parts of an Azure Storage account connection string.
|
|
*
|
|
* @param connectionString - Connection string.
|
|
* @returns String key value pairs of the storage account's url and credentials.
|
|
*/
|
|
function utils_common_extractConnectionStringParts(connectionString) {
|
|
let proxyUri = "";
|
|
if (connectionString.startsWith("UseDevelopmentStorage=true")) {
|
|
// Development connection string
|
|
proxyUri = utils_common_getProxyUriFromDevConnString(connectionString);
|
|
connectionString = utils_constants_DevelopmentConnectionString;
|
|
}
|
|
// Matching BlobEndpoint in the Account connection string
|
|
let blobEndpoint = utils_common_getValueInConnString(connectionString, "BlobEndpoint");
|
|
// Slicing off '/' at the end if exists
|
|
// (The methods that use `extractConnectionStringParts` expect the url to not have `/` at the end)
|
|
blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint;
|
|
if (connectionString.search("DefaultEndpointsProtocol=") !== -1 &&
|
|
connectionString.search("AccountKey=") !== -1) {
|
|
// Account connection string
|
|
let defaultEndpointsProtocol = "";
|
|
let accountName = "";
|
|
let accountKey = Buffer.from("accountKey", "base64");
|
|
let endpointSuffix = "";
|
|
// Get account name and key
|
|
accountName = utils_common_getValueInConnString(connectionString, "AccountName");
|
|
accountKey = Buffer.from(utils_common_getValueInConnString(connectionString, "AccountKey"), "base64");
|
|
if (!blobEndpoint) {
|
|
// BlobEndpoint is not present in the Account connection string
|
|
// Can be obtained from `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`
|
|
defaultEndpointsProtocol = utils_common_getValueInConnString(connectionString, "DefaultEndpointsProtocol");
|
|
const protocol = defaultEndpointsProtocol.toLowerCase();
|
|
if (protocol !== "https" && protocol !== "http") {
|
|
throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'");
|
|
}
|
|
endpointSuffix = utils_common_getValueInConnString(connectionString, "EndpointSuffix");
|
|
if (!endpointSuffix) {
|
|
throw new Error("Invalid EndpointSuffix in the provided Connection String");
|
|
}
|
|
blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
|
|
}
|
|
if (!accountName) {
|
|
throw new Error("Invalid AccountName in the provided Connection String");
|
|
}
|
|
else if (accountKey.length === 0) {
|
|
throw new Error("Invalid AccountKey in the provided Connection String");
|
|
}
|
|
return {
|
|
kind: "AccountConnString",
|
|
url: blobEndpoint,
|
|
accountName,
|
|
accountKey,
|
|
proxyUri,
|
|
};
|
|
}
|
|
else {
|
|
// SAS connection string
|
|
let accountSas = utils_common_getValueInConnString(connectionString, "SharedAccessSignature");
|
|
let accountName = utils_common_getValueInConnString(connectionString, "AccountName");
|
|
// if accountName is empty, try to read it from BlobEndpoint
|
|
if (!accountName) {
|
|
accountName = utils_common_getAccountNameFromUrl(blobEndpoint);
|
|
}
|
|
if (!blobEndpoint) {
|
|
throw new Error("Invalid BlobEndpoint in the provided SAS Connection String");
|
|
}
|
|
else if (!accountSas) {
|
|
throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String");
|
|
}
|
|
// client constructors assume accountSas does *not* start with ?
|
|
if (accountSas.startsWith("?")) {
|
|
accountSas = accountSas.substring(1);
|
|
}
|
|
return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas };
|
|
}
|
|
}
|
|
/**
|
|
* Internal escape method implemented Strategy Two mentioned in escapeURL() description.
|
|
*
|
|
* @param text -
|
|
*/
|
|
function utils_utils_common_escape(text) {
|
|
return encodeURIComponent(text)
|
|
.replace(/%2F/g, "/") // Don't escape for "/"
|
|
.replace(/'/g, "%27") // Escape for "'"
|
|
.replace(/\+/g, "%20")
|
|
.replace(/%25/g, "%"); // Revert encoded "%"
|
|
}
|
|
/**
|
|
* Append a string to URL path. Will remove duplicated "/" in front of the string
|
|
* when URL path ends with a "/".
|
|
*
|
|
* @param url - Source URL string
|
|
* @param name - String to be appended to URL
|
|
* @returns An updated URL string
|
|
*/
|
|
function utils_common_appendToURLPath(url, name) {
|
|
const urlParsed = new URL(url);
|
|
let path = urlParsed.pathname;
|
|
path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name;
|
|
urlParsed.pathname = path;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Set URL parameter name and value. If name exists in URL parameters, old value
|
|
* will be replaced by name key. If not provide value, the parameter will be deleted.
|
|
*
|
|
* @param url - Source URL string
|
|
* @param name - Parameter name
|
|
* @param value - Parameter value
|
|
* @returns An updated URL string
|
|
*/
|
|
function utils_common_setURLParameter(url, name, value) {
|
|
const urlParsed = new URL(url);
|
|
const encodedName = encodeURIComponent(name);
|
|
const encodedValue = value ? encodeURIComponent(value) : undefined;
|
|
// mutating searchParams will change the encoding, so we have to do this ourselves
|
|
const searchString = urlParsed.search === "" ? "?" : urlParsed.search;
|
|
const searchPieces = [];
|
|
for (const pair of searchString.slice(1).split("&")) {
|
|
if (pair) {
|
|
const [key] = pair.split("=", 2);
|
|
if (key !== encodedName) {
|
|
searchPieces.push(pair);
|
|
}
|
|
}
|
|
}
|
|
if (encodedValue) {
|
|
searchPieces.push(`${encodedName}=${encodedValue}`);
|
|
}
|
|
urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Get URL parameter by name.
|
|
*
|
|
* @param url -
|
|
* @param name -
|
|
*/
|
|
function utils_common_getURLParameter(url, name) {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.searchParams.get(name) ?? undefined;
|
|
}
|
|
/**
|
|
* Set URL host.
|
|
*
|
|
* @param url - Source URL string
|
|
* @param host - New host string
|
|
* @returns An updated URL string
|
|
*/
|
|
function utils_common_setURLHost(url, host) {
|
|
const urlParsed = new URL(url);
|
|
urlParsed.hostname = host;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Get URL path from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function utils_common_getURLPath(url) {
|
|
try {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.pathname;
|
|
}
|
|
catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
/**
|
|
* Get URL scheme from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function utils_common_getURLScheme(url) {
|
|
try {
|
|
const urlParsed = new URL(url);
|
|
return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol;
|
|
}
|
|
catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
/**
|
|
* Get URL path and query from an URL string.
|
|
*
|
|
* @param url - Source URL string
|
|
*/
|
|
function utils_common_getURLPathAndQuery(url) {
|
|
const urlParsed = new URL(url);
|
|
const pathString = urlParsed.pathname;
|
|
if (!pathString) {
|
|
throw new RangeError("Invalid url without valid path.");
|
|
}
|
|
let queryString = urlParsed.search || "";
|
|
queryString = queryString.trim();
|
|
if (queryString !== "") {
|
|
queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; // Ensure query string start with '?'
|
|
}
|
|
return `${pathString}${queryString}`;
|
|
}
|
|
/**
|
|
* Get URL query key value pairs from an URL string.
|
|
*
|
|
* @param url -
|
|
*/
|
|
function utils_common_getURLQueries(url) {
|
|
let queryString = new URL(url).search;
|
|
if (!queryString) {
|
|
return {};
|
|
}
|
|
queryString = queryString.trim();
|
|
queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString;
|
|
let querySubStrings = queryString.split("&");
|
|
querySubStrings = querySubStrings.filter((value) => {
|
|
const indexOfEqual = value.indexOf("=");
|
|
const lastIndexOfEqual = value.lastIndexOf("=");
|
|
return (indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1);
|
|
});
|
|
const queries = {};
|
|
for (const querySubString of querySubStrings) {
|
|
const splitResults = querySubString.split("=");
|
|
const key = splitResults[0];
|
|
const value = splitResults[1];
|
|
queries[key] = value;
|
|
}
|
|
return queries;
|
|
}
|
|
/**
|
|
* Append a string to URL query.
|
|
*
|
|
* @param url - Source URL string.
|
|
* @param queryParts - String to be appended to the URL query.
|
|
* @returns An updated URL string.
|
|
*/
|
|
function utils_common_appendToURLQuery(url, queryParts) {
|
|
const urlParsed = new URL(url);
|
|
let query = urlParsed.search;
|
|
if (query) {
|
|
query += "&" + queryParts;
|
|
}
|
|
else {
|
|
query = queryParts;
|
|
}
|
|
urlParsed.search = query;
|
|
return urlParsed.toString();
|
|
}
|
|
/**
|
|
* Rounds a date off to seconds.
|
|
*
|
|
* @param date -
|
|
* @param withMilliseconds - If true, YYYY-MM-DDThh:mm:ss.fffffffZ will be returned;
|
|
* If false, YYYY-MM-DDThh:mm:ssZ will be returned.
|
|
* @returns Date string in ISO8061 format, with or without 7 milliseconds component
|
|
*/
|
|
function utils_common_truncatedISO8061Date(date, withMilliseconds = true) {
|
|
// Date.toISOString() will return like "2018-10-29T06:34:36.139Z"
|
|
const dateString = date.toISOString();
|
|
return withMilliseconds
|
|
? dateString.substring(0, dateString.length - 1) + "0000" + "Z"
|
|
: dateString.substring(0, dateString.length - 5) + "Z";
|
|
}
|
|
/**
|
|
* Base64 encode.
|
|
*
|
|
* @param content -
|
|
*/
|
|
function base64encode(content) {
|
|
return !esm_isNodeLike ? btoa(content) : Buffer.from(content).toString("base64");
|
|
}
|
|
/**
|
|
* Base64 decode.
|
|
*
|
|
* @param encodedString -
|
|
*/
|
|
function base64decode(encodedString) {
|
|
return !isNodeLike ? atob(encodedString) : Buffer.from(encodedString, "base64").toString();
|
|
}
|
|
/**
|
|
* Generate a 64 bytes base64 block ID string.
|
|
*
|
|
* @param blockIndex -
|
|
*/
|
|
function utils_common_generateBlockID(blockIDPrefix, blockIndex) {
|
|
// To generate a 64 bytes base64 string, source string should be 48
|
|
const maxSourceStringLength = 48;
|
|
// A blob can have a maximum of 100,000 uncommitted blocks at any given time
|
|
const maxBlockIndexLength = 6;
|
|
const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength;
|
|
if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) {
|
|
blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength);
|
|
}
|
|
const res = blockIDPrefix +
|
|
utils_common_padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0");
|
|
return base64encode(res);
|
|
}
|
|
/**
|
|
* Delay specified time interval.
|
|
*
|
|
* @param timeInMs -
|
|
* @param aborter -
|
|
* @param abortError -
|
|
*/
|
|
async function utils_utils_common_delay(timeInMs, aborter, abortError) {
|
|
return new Promise((resolve, reject) => {
|
|
/* eslint-disable-next-line prefer-const */
|
|
let timeout;
|
|
const abortHandler = () => {
|
|
if (timeout !== undefined) {
|
|
clearTimeout(timeout);
|
|
}
|
|
reject(abortError);
|
|
};
|
|
const resolveHandler = () => {
|
|
if (aborter !== undefined) {
|
|
aborter.removeEventListener("abort", abortHandler);
|
|
}
|
|
resolve();
|
|
};
|
|
timeout = setTimeout(resolveHandler, timeInMs);
|
|
if (aborter !== undefined) {
|
|
aborter.addEventListener("abort", abortHandler);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* String.prototype.padStart()
|
|
*
|
|
* @param currentString -
|
|
* @param targetLength -
|
|
* @param padString -
|
|
*/
|
|
function utils_common_padStart(currentString, targetLength, padString = " ") {
|
|
// @ts-expect-error: TS doesn't know this code needs to run downlevel sometimes
|
|
if (String.prototype.padStart) {
|
|
return currentString.padStart(targetLength, padString);
|
|
}
|
|
padString = padString || " ";
|
|
if (currentString.length > targetLength) {
|
|
return currentString;
|
|
}
|
|
else {
|
|
targetLength = targetLength - currentString.length;
|
|
if (targetLength > padString.length) {
|
|
padString += padString.repeat(targetLength / padString.length);
|
|
}
|
|
return padString.slice(0, targetLength) + currentString;
|
|
}
|
|
}
|
|
function utils_common_sanitizeURL(url) {
|
|
let safeURL = url;
|
|
if (utils_common_getURLParameter(safeURL, URLConstants.Parameters.SIGNATURE)) {
|
|
safeURL = utils_common_setURLParameter(safeURL, URLConstants.Parameters.SIGNATURE, "*****");
|
|
}
|
|
return safeURL;
|
|
}
|
|
function utils_common_sanitizeHeaders(originalHeader) {
|
|
const headers = createHttpHeaders();
|
|
for (const [name, value] of originalHeader) {
|
|
if (name.toLowerCase() === HeaderConstants.AUTHORIZATION.toLowerCase()) {
|
|
headers.set(name, "*****");
|
|
}
|
|
else if (name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) {
|
|
headers.set(name, utils_common_sanitizeURL(value));
|
|
}
|
|
else {
|
|
headers.set(name, value);
|
|
}
|
|
}
|
|
return headers;
|
|
}
|
|
/**
|
|
* If two strings are equal when compared case insensitive.
|
|
*
|
|
* @param str1 -
|
|
* @param str2 -
|
|
*/
|
|
function utils_common_iEqual(str1, str2) {
|
|
return str1.toLocaleLowerCase() === str2.toLocaleLowerCase();
|
|
}
|
|
/**
|
|
* Extracts account name from the url
|
|
* @param url - url to extract the account name from
|
|
* @returns with the account name
|
|
*/
|
|
function utils_common_getAccountNameFromUrl(url) {
|
|
const parsedUrl = new URL(url);
|
|
let accountName;
|
|
try {
|
|
if (parsedUrl.hostname.split(".")[1] === "blob") {
|
|
// `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`;
|
|
// `${defaultEndpointsProtocol}://${accountName}-suffix.blob.${endpointSuffix}`;
|
|
accountName = parsedUrl.hostname.split(".")[0];
|
|
for (let i = 0; i < accountNameSuffixes.length; ++i) {
|
|
const suffix = accountNameSuffixes[i];
|
|
if (accountName.endsWith(suffix)) {
|
|
accountName = accountName.substring(0, accountName.length - suffix.length);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (utils_common_isIpEndpointStyle(parsedUrl)) {
|
|
// IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/
|
|
// Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/
|
|
// .getPath() -> /devstoreaccount1/
|
|
accountName = parsedUrl.pathname.split("/")[1];
|
|
}
|
|
else {
|
|
// Custom domain case: "https://customdomain.com/containername/blob".
|
|
accountName = "";
|
|
}
|
|
return accountName;
|
|
}
|
|
catch (error) {
|
|
throw new Error("Unable to extract accountName with provided information.");
|
|
}
|
|
}
|
|
function utils_common_isIpEndpointStyle(parsedUrl) {
|
|
const host = parsedUrl.host;
|
|
// Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'.
|
|
// Case 2: localhost(:port) or host.docker.internal, use broad regex to match port part.
|
|
// Case 3: Ipv4, use broad regex which just check if host contains Ipv4.
|
|
// For valid host please refer to https://man7.org/linux/man-pages/man7/hostname.7.html.
|
|
return (/^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) ||
|
|
(Boolean(parsedUrl.port) && utils_constants_PathStylePorts.includes(parsedUrl.port)));
|
|
}
|
|
/**
|
|
* Convert Tags to encoded string.
|
|
*
|
|
* @param tags -
|
|
*/
|
|
function toBlobTagsString(tags) {
|
|
if (tags === undefined) {
|
|
return undefined;
|
|
}
|
|
const tagPairs = [];
|
|
for (const key in tags) {
|
|
if (Object.prototype.hasOwnProperty.call(tags, key)) {
|
|
const value = tags[key];
|
|
tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
}
|
|
}
|
|
return tagPairs.join("&");
|
|
}
|
|
/**
|
|
* Convert Tags type to BlobTags.
|
|
*
|
|
* @param tags -
|
|
*/
|
|
function toBlobTags(tags) {
|
|
if (tags === undefined) {
|
|
return undefined;
|
|
}
|
|
const res = {
|
|
blobTagSet: [],
|
|
};
|
|
for (const key in tags) {
|
|
if (Object.prototype.hasOwnProperty.call(tags, key)) {
|
|
const value = tags[key];
|
|
res.blobTagSet.push({
|
|
key,
|
|
value,
|
|
});
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
/**
|
|
* Covert BlobTags to Tags type.
|
|
*
|
|
* @param tags -
|
|
*/
|
|
function toTags(tags) {
|
|
if (tags === undefined) {
|
|
return undefined;
|
|
}
|
|
const res = {};
|
|
for (const blobTag of tags.blobTagSet) {
|
|
res[blobTag.key] = blobTag.value;
|
|
}
|
|
return res;
|
|
}
|
|
/**
|
|
* Convert BlobQueryTextConfiguration to QuerySerialization type.
|
|
*
|
|
* @param textConfiguration -
|
|
*/
|
|
function toQuerySerialization(textConfiguration) {
|
|
if (textConfiguration === undefined) {
|
|
return undefined;
|
|
}
|
|
switch (textConfiguration.kind) {
|
|
case "csv":
|
|
return {
|
|
format: {
|
|
type: "delimited",
|
|
delimitedTextConfiguration: {
|
|
columnSeparator: textConfiguration.columnSeparator || ",",
|
|
fieldQuote: textConfiguration.fieldQuote || "",
|
|
recordSeparator: textConfiguration.recordSeparator,
|
|
escapeChar: textConfiguration.escapeCharacter || "",
|
|
headersPresent: textConfiguration.hasHeaders || false,
|
|
},
|
|
},
|
|
};
|
|
case "json":
|
|
return {
|
|
format: {
|
|
type: "json",
|
|
jsonTextConfiguration: {
|
|
recordSeparator: textConfiguration.recordSeparator,
|
|
},
|
|
},
|
|
};
|
|
case "arrow":
|
|
return {
|
|
format: {
|
|
type: "arrow",
|
|
arrowConfiguration: {
|
|
schema: textConfiguration.schema,
|
|
},
|
|
},
|
|
};
|
|
case "parquet":
|
|
return {
|
|
format: {
|
|
type: "parquet",
|
|
},
|
|
};
|
|
default:
|
|
throw Error("Invalid BlobQueryTextConfiguration.");
|
|
}
|
|
}
|
|
function parseObjectReplicationRecord(objectReplicationRecord) {
|
|
if (!objectReplicationRecord) {
|
|
return undefined;
|
|
}
|
|
if ("policy-id" in objectReplicationRecord) {
|
|
// If the dictionary contains a key with policy id, we are not required to do any parsing since
|
|
// the policy id should already be stored in the ObjectReplicationDestinationPolicyId.
|
|
return undefined;
|
|
}
|
|
const orProperties = [];
|
|
for (const key in objectReplicationRecord) {
|
|
const ids = key.split("_");
|
|
const policyPrefix = "or-";
|
|
if (ids[0].startsWith(policyPrefix)) {
|
|
ids[0] = ids[0].substring(policyPrefix.length);
|
|
}
|
|
const rule = {
|
|
ruleId: ids[1],
|
|
replicationStatus: objectReplicationRecord[key],
|
|
};
|
|
const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]);
|
|
if (policyIndex > -1) {
|
|
orProperties[policyIndex].rules.push(rule);
|
|
}
|
|
else {
|
|
orProperties.push({
|
|
policyId: ids[0],
|
|
rules: [rule],
|
|
});
|
|
}
|
|
}
|
|
return orProperties;
|
|
}
|
|
/**
|
|
* Attach a TokenCredential to an object.
|
|
*
|
|
* @param thing -
|
|
* @param credential -
|
|
*/
|
|
function utils_common_attachCredential(thing, credential) {
|
|
thing.credential = credential;
|
|
return thing;
|
|
}
|
|
function utils_common_httpAuthorizationToString(httpAuthorization) {
|
|
return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined;
|
|
}
|
|
function BlobNameToString(name) {
|
|
if (name.encoded) {
|
|
return decodeURIComponent(name.content);
|
|
}
|
|
else {
|
|
return name.content;
|
|
}
|
|
}
|
|
function ConvertInternalResponseOfListBlobFlat(internalResponse) {
|
|
return {
|
|
...internalResponse,
|
|
segment: {
|
|
blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
|
|
const blobItem = {
|
|
...blobItemInteral,
|
|
name: BlobNameToString(blobItemInteral.name),
|
|
};
|
|
return blobItem;
|
|
}),
|
|
},
|
|
};
|
|
}
|
|
function ConvertInternalResponseOfListBlobHierarchy(internalResponse) {
|
|
return {
|
|
...internalResponse,
|
|
segment: {
|
|
blobPrefixes: internalResponse.segment.blobPrefixes?.map((blobPrefixInternal) => {
|
|
const blobPrefix = {
|
|
...blobPrefixInternal,
|
|
name: BlobNameToString(blobPrefixInternal.name),
|
|
};
|
|
return blobPrefix;
|
|
}),
|
|
blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => {
|
|
const blobItem = {
|
|
...blobItemInteral,
|
|
name: BlobNameToString(blobItemInteral.name),
|
|
};
|
|
return blobItem;
|
|
}),
|
|
},
|
|
};
|
|
}
|
|
function* ExtractPageRangeInfoItems(getPageRangesSegment) {
|
|
let pageRange = [];
|
|
let clearRange = [];
|
|
if (getPageRangesSegment.pageRange)
|
|
pageRange = getPageRangesSegment.pageRange;
|
|
if (getPageRangesSegment.clearRange)
|
|
clearRange = getPageRangesSegment.clearRange;
|
|
let pageRangeIndex = 0;
|
|
let clearRangeIndex = 0;
|
|
while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) {
|
|
if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) {
|
|
yield {
|
|
start: pageRange[pageRangeIndex].start,
|
|
end: pageRange[pageRangeIndex].end,
|
|
isClear: false,
|
|
};
|
|
++pageRangeIndex;
|
|
}
|
|
else {
|
|
yield {
|
|
start: clearRange[clearRangeIndex].start,
|
|
end: clearRange[clearRangeIndex].end,
|
|
isClear: true,
|
|
};
|
|
++clearRangeIndex;
|
|
}
|
|
}
|
|
for (; pageRangeIndex < pageRange.length; ++pageRangeIndex) {
|
|
yield {
|
|
start: pageRange[pageRangeIndex].start,
|
|
end: pageRange[pageRangeIndex].end,
|
|
isClear: false,
|
|
};
|
|
}
|
|
for (; clearRangeIndex < clearRange.length; ++clearRangeIndex) {
|
|
yield {
|
|
start: clearRange[clearRangeIndex].start,
|
|
end: clearRange[clearRangeIndex].end,
|
|
isClear: true,
|
|
};
|
|
}
|
|
}
|
|
/**
|
|
* Escape the blobName but keep path separator ('/').
|
|
*/
|
|
function utils_common_EscapePath(blobName) {
|
|
const split = blobName.split("/");
|
|
for (let i = 0; i < split.length; i++) {
|
|
split[i] = encodeURIComponent(split[i]);
|
|
}
|
|
return split.join("/");
|
|
}
|
|
/**
|
|
* A typesafe helper for ensuring that a given response object has
|
|
* the original _response attached.
|
|
* @param response - A response object from calling a client operation
|
|
* @returns The same object, but with known _response property
|
|
*/
|
|
function utils_common_assertResponse(response) {
|
|
if (`_response` in response) {
|
|
return response;
|
|
}
|
|
throw new TypeError(`Unexpected response object ${response}`);
|
|
}
|
|
async function setUploadChecksumParameters(body, contentLength, parameters, uploadOptions, configContentChecksumAlgorithm) {
|
|
let contentChecksumAlgorithm = uploadOptions.contentChecksumAlgorithm ?? configContentChecksumAlgorithm;
|
|
if (contentChecksumAlgorithm === undefined) {
|
|
contentChecksumAlgorithm = "Customized";
|
|
}
|
|
if (contentChecksumAlgorithm === "Auto") {
|
|
contentChecksumAlgorithm = "StorageCrc64";
|
|
}
|
|
let bodyInfo = undefined;
|
|
if (contentChecksumAlgorithm === "Customized") {
|
|
parameters.transactionalContentMD5 = uploadOptions.transactionalContentMD5;
|
|
parameters.transactionalContentCrc64 = uploadOptions.transactionalContentCrc64;
|
|
}
|
|
else if (contentChecksumAlgorithm === "StorageCrc64") {
|
|
await StorageCRC64Calculator.init();
|
|
bodyInfo = await structuredMessageEncoding(body, contentLength);
|
|
parameters.structuredBodyType = "XSM/1.0; properties=crc64";
|
|
parameters.structuredContentLength = contentLength;
|
|
}
|
|
return {
|
|
body: contentChecksumAlgorithm === "StorageCrc64" ? bodyInfo.body : body,
|
|
contentLength: contentChecksumAlgorithm === "StorageCrc64" ? bodyInfo.encodedContentLength : contentLength,
|
|
contentChecksumAlgorithm: contentChecksumAlgorithm,
|
|
};
|
|
}
|
|
//# sourceMappingURL=utils.common.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/StorageClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}
|
|
* and etc.
|
|
*/
|
|
class StorageClient_StorageClient {
|
|
/**
|
|
* Encoded URL string value.
|
|
*/
|
|
url;
|
|
accountName;
|
|
/**
|
|
* Request policy pipeline.
|
|
*
|
|
* @internal
|
|
*/
|
|
pipeline;
|
|
/**
|
|
* 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.
|
|
*/
|
|
credential;
|
|
/**
|
|
* StorageClient is a reference to protocol layer operations entry, which is
|
|
* generated by AutoRest generator.
|
|
*/
|
|
storageClientContext;
|
|
/**
|
|
*/
|
|
isHttps;
|
|
/**
|
|
* Creates an instance of StorageClient.
|
|
* @param url - url to resource
|
|
* @param pipeline - request policy pipeline.
|
|
*/
|
|
constructor(url, pipeline) {
|
|
// URL should be encoded and only once, protocol layer shouldn't encode URL again
|
|
this.url = utils_common_escapeURLPath(url);
|
|
this.accountName = utils_common_getAccountNameFromUrl(url);
|
|
this.pipeline = pipeline;
|
|
this.storageClientContext = new StorageContextClient(this.url, getCoreClientOptions(pipeline));
|
|
this.isHttps = utils_common_iEqual(utils_common_getURLScheme(this.url) || "", "https");
|
|
this.credential = getCredentialFromPipeline(pipeline);
|
|
// Override protocol layer's default content-type
|
|
const storageClientContext = this.storageClientContext;
|
|
storageClientContext.requestContentType = undefined;
|
|
}
|
|
}
|
|
//# sourceMappingURL=StorageClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/tracing.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Creates a span using the global tracer.
|
|
* @internal
|
|
*/
|
|
const tracingClient = createTracingClient({
|
|
packageName: "@azure/storage-blob",
|
|
packageVersion: esm_utils_constants_SDK_VERSION,
|
|
namespace: "Microsoft.Storage",
|
|
});
|
|
//# sourceMappingURL=tracing.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/BlobSASPermissions.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a blob. Setting
|
|
* a value to true means that any SAS which uses these permissions will grant permissions for that operation. Once all
|
|
* the values are set, this should be serialized with toString and set as the permissions field on a
|
|
* {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
|
|
* the order of the permissions is particular and this class guarantees correctness.
|
|
*/
|
|
class BlobSASPermissions {
|
|
/**
|
|
* Creates a {@link BlobSASPermissions} from the specified permissions string. This method will throw an
|
|
* Error if it encounters a character that does not correspond to a valid permission.
|
|
*
|
|
* @param permissions -
|
|
*/
|
|
static parse(permissions) {
|
|
const blobSASPermissions = new BlobSASPermissions();
|
|
for (const char of permissions) {
|
|
switch (char) {
|
|
case "r":
|
|
blobSASPermissions.read = true;
|
|
break;
|
|
case "a":
|
|
blobSASPermissions.add = true;
|
|
break;
|
|
case "c":
|
|
blobSASPermissions.create = true;
|
|
break;
|
|
case "w":
|
|
blobSASPermissions.write = true;
|
|
break;
|
|
case "d":
|
|
blobSASPermissions.delete = true;
|
|
break;
|
|
case "x":
|
|
blobSASPermissions.deleteVersion = true;
|
|
break;
|
|
case "t":
|
|
blobSASPermissions.tag = true;
|
|
break;
|
|
case "m":
|
|
blobSASPermissions.move = true;
|
|
break;
|
|
case "e":
|
|
blobSASPermissions.execute = true;
|
|
break;
|
|
case "i":
|
|
blobSASPermissions.setImmutabilityPolicy = true;
|
|
break;
|
|
case "y":
|
|
blobSASPermissions.permanentDelete = true;
|
|
break;
|
|
default:
|
|
throw new RangeError(`Invalid permission: ${char}`);
|
|
}
|
|
}
|
|
return blobSASPermissions;
|
|
}
|
|
/**
|
|
* Creates a {@link BlobSASPermissions} from a raw object which contains same keys as it
|
|
* and boolean values for them.
|
|
*
|
|
* @param permissionLike -
|
|
*/
|
|
static from(permissionLike) {
|
|
const blobSASPermissions = new BlobSASPermissions();
|
|
if (permissionLike.read) {
|
|
blobSASPermissions.read = true;
|
|
}
|
|
if (permissionLike.add) {
|
|
blobSASPermissions.add = true;
|
|
}
|
|
if (permissionLike.create) {
|
|
blobSASPermissions.create = true;
|
|
}
|
|
if (permissionLike.write) {
|
|
blobSASPermissions.write = true;
|
|
}
|
|
if (permissionLike.delete) {
|
|
blobSASPermissions.delete = true;
|
|
}
|
|
if (permissionLike.deleteVersion) {
|
|
blobSASPermissions.deleteVersion = true;
|
|
}
|
|
if (permissionLike.tag) {
|
|
blobSASPermissions.tag = true;
|
|
}
|
|
if (permissionLike.move) {
|
|
blobSASPermissions.move = true;
|
|
}
|
|
if (permissionLike.execute) {
|
|
blobSASPermissions.execute = true;
|
|
}
|
|
if (permissionLike.setImmutabilityPolicy) {
|
|
blobSASPermissions.setImmutabilityPolicy = true;
|
|
}
|
|
if (permissionLike.permanentDelete) {
|
|
blobSASPermissions.permanentDelete = true;
|
|
}
|
|
return blobSASPermissions;
|
|
}
|
|
/**
|
|
* Specifies Read access granted.
|
|
*/
|
|
read = false;
|
|
/**
|
|
* Specifies Add access granted.
|
|
*/
|
|
add = false;
|
|
/**
|
|
* Specifies Create access granted.
|
|
*/
|
|
create = false;
|
|
/**
|
|
* Specifies Write access granted.
|
|
*/
|
|
write = false;
|
|
/**
|
|
* Specifies Delete access granted.
|
|
*/
|
|
delete = false;
|
|
/**
|
|
* Specifies Delete version access granted.
|
|
*/
|
|
deleteVersion = false;
|
|
/**
|
|
* Specfies Tag access granted.
|
|
*/
|
|
tag = false;
|
|
/**
|
|
* Specifies Move access granted.
|
|
*/
|
|
move = false;
|
|
/**
|
|
* Specifies Execute access granted.
|
|
*/
|
|
execute = false;
|
|
/**
|
|
* Specifies SetImmutabilityPolicy access granted.
|
|
*/
|
|
setImmutabilityPolicy = false;
|
|
/**
|
|
* Specifies that Permanent Delete is permitted.
|
|
*/
|
|
permanentDelete = false;
|
|
/**
|
|
* Converts the given permissions to a string. Using this method will guarantee the permissions are in an
|
|
* order accepted by the service.
|
|
*
|
|
* @returns A string which represents the BlobSASPermissions
|
|
*/
|
|
toString() {
|
|
const permissions = [];
|
|
if (this.read) {
|
|
permissions.push("r");
|
|
}
|
|
if (this.add) {
|
|
permissions.push("a");
|
|
}
|
|
if (this.create) {
|
|
permissions.push("c");
|
|
}
|
|
if (this.write) {
|
|
permissions.push("w");
|
|
}
|
|
if (this.delete) {
|
|
permissions.push("d");
|
|
}
|
|
if (this.deleteVersion) {
|
|
permissions.push("x");
|
|
}
|
|
if (this.tag) {
|
|
permissions.push("t");
|
|
}
|
|
if (this.move) {
|
|
permissions.push("m");
|
|
}
|
|
if (this.execute) {
|
|
permissions.push("e");
|
|
}
|
|
if (this.setImmutabilityPolicy) {
|
|
permissions.push("i");
|
|
}
|
|
if (this.permanentDelete) {
|
|
permissions.push("y");
|
|
}
|
|
return permissions.join("");
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobSASPermissions.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/ContainerSASPermissions.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* This is a helper class to construct a string representing the permissions granted by a ServiceSAS to a container.
|
|
* Setting a value to true means that any SAS which uses these permissions will grant permissions for that operation.
|
|
* Once all the values are set, this should be serialized with toString and set as the permissions field on a
|
|
* {@link BlobSASSignatureValues} object. It is possible to construct the permissions string without this class, but
|
|
* the order of the permissions is particular and this class guarantees correctness.
|
|
*/
|
|
class ContainerSASPermissions {
|
|
/**
|
|
* Creates an {@link ContainerSASPermissions} from the specified permissions string. This method will throw an
|
|
* Error if it encounters a character that does not correspond to a valid permission.
|
|
*
|
|
* @param permissions -
|
|
*/
|
|
static parse(permissions) {
|
|
const containerSASPermissions = new ContainerSASPermissions();
|
|
for (const char of permissions) {
|
|
switch (char) {
|
|
case "r":
|
|
containerSASPermissions.read = true;
|
|
break;
|
|
case "a":
|
|
containerSASPermissions.add = true;
|
|
break;
|
|
case "c":
|
|
containerSASPermissions.create = true;
|
|
break;
|
|
case "w":
|
|
containerSASPermissions.write = true;
|
|
break;
|
|
case "d":
|
|
containerSASPermissions.delete = true;
|
|
break;
|
|
case "l":
|
|
containerSASPermissions.list = true;
|
|
break;
|
|
case "t":
|
|
containerSASPermissions.tag = true;
|
|
break;
|
|
case "x":
|
|
containerSASPermissions.deleteVersion = true;
|
|
break;
|
|
case "m":
|
|
containerSASPermissions.move = true;
|
|
break;
|
|
case "e":
|
|
containerSASPermissions.execute = true;
|
|
break;
|
|
case "i":
|
|
containerSASPermissions.setImmutabilityPolicy = true;
|
|
break;
|
|
case "y":
|
|
containerSASPermissions.permanentDelete = true;
|
|
break;
|
|
case "f":
|
|
containerSASPermissions.filterByTags = true;
|
|
break;
|
|
default:
|
|
throw new RangeError(`Invalid permission ${char}`);
|
|
}
|
|
}
|
|
return containerSASPermissions;
|
|
}
|
|
/**
|
|
* Creates a {@link ContainerSASPermissions} from a raw object which contains same keys as it
|
|
* and boolean values for them.
|
|
*
|
|
* @param permissionLike -
|
|
*/
|
|
static from(permissionLike) {
|
|
const containerSASPermissions = new ContainerSASPermissions();
|
|
if (permissionLike.read) {
|
|
containerSASPermissions.read = true;
|
|
}
|
|
if (permissionLike.add) {
|
|
containerSASPermissions.add = true;
|
|
}
|
|
if (permissionLike.create) {
|
|
containerSASPermissions.create = true;
|
|
}
|
|
if (permissionLike.write) {
|
|
containerSASPermissions.write = true;
|
|
}
|
|
if (permissionLike.delete) {
|
|
containerSASPermissions.delete = true;
|
|
}
|
|
if (permissionLike.list) {
|
|
containerSASPermissions.list = true;
|
|
}
|
|
if (permissionLike.deleteVersion) {
|
|
containerSASPermissions.deleteVersion = true;
|
|
}
|
|
if (permissionLike.tag) {
|
|
containerSASPermissions.tag = true;
|
|
}
|
|
if (permissionLike.move) {
|
|
containerSASPermissions.move = true;
|
|
}
|
|
if (permissionLike.execute) {
|
|
containerSASPermissions.execute = true;
|
|
}
|
|
if (permissionLike.setImmutabilityPolicy) {
|
|
containerSASPermissions.setImmutabilityPolicy = true;
|
|
}
|
|
if (permissionLike.permanentDelete) {
|
|
containerSASPermissions.permanentDelete = true;
|
|
}
|
|
if (permissionLike.filterByTags) {
|
|
containerSASPermissions.filterByTags = true;
|
|
}
|
|
return containerSASPermissions;
|
|
}
|
|
/**
|
|
* Specifies Read access granted.
|
|
*/
|
|
read = false;
|
|
/**
|
|
* Specifies Add access granted.
|
|
*/
|
|
add = false;
|
|
/**
|
|
* Specifies Create access granted.
|
|
*/
|
|
create = false;
|
|
/**
|
|
* Specifies Write access granted.
|
|
*/
|
|
write = false;
|
|
/**
|
|
* Specifies Delete access granted.
|
|
*/
|
|
delete = false;
|
|
/**
|
|
* Specifies Delete version access granted.
|
|
*/
|
|
deleteVersion = false;
|
|
/**
|
|
* Specifies List access granted.
|
|
*/
|
|
list = false;
|
|
/**
|
|
* Specfies Tag access granted.
|
|
*/
|
|
tag = false;
|
|
/**
|
|
* Specifies Move access granted.
|
|
*/
|
|
move = false;
|
|
/**
|
|
* Specifies Execute access granted.
|
|
*/
|
|
execute = false;
|
|
/**
|
|
* Specifies SetImmutabilityPolicy access granted.
|
|
*/
|
|
setImmutabilityPolicy = false;
|
|
/**
|
|
* Specifies that Permanent Delete is permitted.
|
|
*/
|
|
permanentDelete = false;
|
|
/**
|
|
* Specifies that Filter Blobs by Tags is permitted.
|
|
*/
|
|
filterByTags = false;
|
|
/**
|
|
* Converts the given permissions to a string. Using this method will guarantee the permissions are in an
|
|
* order accepted by the service.
|
|
*
|
|
* The order of the characters should be as specified here to ensure correctness.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
*/
|
|
toString() {
|
|
const permissions = [];
|
|
if (this.read) {
|
|
permissions.push("r");
|
|
}
|
|
if (this.add) {
|
|
permissions.push("a");
|
|
}
|
|
if (this.create) {
|
|
permissions.push("c");
|
|
}
|
|
if (this.write) {
|
|
permissions.push("w");
|
|
}
|
|
if (this.delete) {
|
|
permissions.push("d");
|
|
}
|
|
if (this.deleteVersion) {
|
|
permissions.push("x");
|
|
}
|
|
if (this.list) {
|
|
permissions.push("l");
|
|
}
|
|
if (this.tag) {
|
|
permissions.push("t");
|
|
}
|
|
if (this.move) {
|
|
permissions.push("m");
|
|
}
|
|
if (this.execute) {
|
|
permissions.push("e");
|
|
}
|
|
if (this.setImmutabilityPolicy) {
|
|
permissions.push("i");
|
|
}
|
|
if (this.permanentDelete) {
|
|
permissions.push("y");
|
|
}
|
|
if (this.filterByTags) {
|
|
permissions.push("f");
|
|
}
|
|
return permissions.join("");
|
|
}
|
|
}
|
|
//# sourceMappingURL=ContainerSASPermissions.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/SasIPRange.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Generate SasIPRange format string. For example:
|
|
*
|
|
* "8.8.8.8" or "1.1.1.1-255.255.255.255"
|
|
*
|
|
* @param ipRange -
|
|
*/
|
|
function ipRangeToString(ipRange) {
|
|
return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start;
|
|
}
|
|
//# sourceMappingURL=SasIPRange.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/SASQueryParameters.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* Protocols for generated SAS.
|
|
*/
|
|
var SASProtocol;
|
|
(function (SASProtocol) {
|
|
/**
|
|
* Protocol that allows HTTPS only
|
|
*/
|
|
SASProtocol["Https"] = "https";
|
|
/**
|
|
* Protocol that allows both HTTPS and HTTP
|
|
*/
|
|
SASProtocol["HttpsAndHttp"] = "https,http";
|
|
})(SASProtocol || (SASProtocol = {}));
|
|
/**
|
|
* Represents the components that make up an Azure Storage SAS' query parameters. This type is not constructed directly
|
|
* by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link BlobSASSignatureValues}
|
|
* types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should
|
|
* be taken here in case there are existing query parameters, which might affect the appropriate means of appending
|
|
* these query parameters).
|
|
*
|
|
* NOTE: Instances of this class are immutable.
|
|
*/
|
|
class SASQueryParameters {
|
|
/**
|
|
* The storage API version.
|
|
*/
|
|
version;
|
|
/**
|
|
* Optional. The allowed HTTP protocol(s).
|
|
*/
|
|
protocol;
|
|
/**
|
|
* Optional. The start time for this SAS token.
|
|
*/
|
|
startsOn;
|
|
/**
|
|
* Optional only when identifier is provided. The expiry time for this SAS token.
|
|
*/
|
|
expiresOn;
|
|
/**
|
|
* Optional only when identifier is provided.
|
|
* Please refer to {@link AccountSASPermissions}, {@link BlobSASPermissions}, or {@link ContainerSASPermissions} for
|
|
* more details.
|
|
*/
|
|
permissions;
|
|
/**
|
|
* Optional. The storage services being accessed (only for Account SAS). Please refer to {@link AccountSASServices}
|
|
* for more details.
|
|
*/
|
|
services;
|
|
/**
|
|
* Optional. The storage resource types being accessed (only for Account SAS). Please refer to
|
|
* {@link AccountSASResourceTypes} for more details.
|
|
*/
|
|
resourceTypes;
|
|
/**
|
|
* Optional. The signed identifier (only for {@link BlobSASSignatureValues}).
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/establishing-a-stored-access-policy
|
|
*/
|
|
identifier;
|
|
/**
|
|
* Optional. Beginning in version 2025-07-05, this value specifies the Entra ID of the user would is authorized to
|
|
* use the resulting SAS URL. The resulting SAS URL must be used in conjunction with an Entra ID token that has been
|
|
* issued to the user specified in this value.
|
|
*/
|
|
delegatedUserObjectId;
|
|
/**
|
|
* Optional. Encryption scope to use when sending requests authorized with this SAS URI.
|
|
*/
|
|
encryptionScope;
|
|
/**
|
|
* Optional. Specifies which resources are accessible via the SAS (only for {@link BlobSASSignatureValues}).
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-service-sas#specifying-the-signed-resource-blob-service-only
|
|
*/
|
|
resource;
|
|
/**
|
|
* The signature for the SAS token.
|
|
*/
|
|
signature;
|
|
/**
|
|
* Value for cache-control header in Blob/File Service SAS.
|
|
*/
|
|
cacheControl;
|
|
/**
|
|
* Value for content-disposition header in Blob/File Service SAS.
|
|
*/
|
|
contentDisposition;
|
|
/**
|
|
* Value for content-encoding header in Blob/File Service SAS.
|
|
*/
|
|
contentEncoding;
|
|
/**
|
|
* Value for content-length header in Blob/File Service SAS.
|
|
*/
|
|
contentLanguage;
|
|
/**
|
|
* Value for content-type header in Blob/File Service SAS.
|
|
*/
|
|
contentType;
|
|
/**
|
|
* Inner value of getter ipRange.
|
|
*/
|
|
ipRangeInner;
|
|
/**
|
|
* The Azure Active Directory object ID in GUID format.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedOid;
|
|
/**
|
|
* The Azure Active Directory tenant ID in GUID format.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedTenantId;
|
|
/**
|
|
* The date-time the key is active.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedStartsOn;
|
|
/**
|
|
* The date-time the key expires.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedExpiresOn;
|
|
/**
|
|
* Abbreviation of the Azure Storage service that accepts the user delegation key.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedService;
|
|
/**
|
|
* The service version that created the user delegation key.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedVersion;
|
|
/**
|
|
* The delegated user tenant id in Azure AD.
|
|
* Property of user delegation key.
|
|
*/
|
|
signedDelegatedUserTid;
|
|
/**
|
|
* Authorized AAD Object ID in GUID format. The AAD Object ID of a user authorized by the owner of the User Delegation Key
|
|
* to perform the action granted by the SAS. The Azure Storage service will ensure that the owner of the user delegation key
|
|
* has the required permissions before granting access but no additional permission check for the user specified in
|
|
* this value will be performed. This is only used for User Delegation SAS.
|
|
*/
|
|
preauthorizedAgentObjectId;
|
|
/**
|
|
* A GUID value that will be logged in the storage diagnostic logs and can be used to correlate SAS generation with storage resource access.
|
|
* This is only used for User Delegation SAS.
|
|
*/
|
|
correlationId;
|
|
/**
|
|
* Keys for request headers required in the SAS token
|
|
*/
|
|
requestHeaderKeys;
|
|
/**
|
|
* Keys for request query parameters required in the SAS token
|
|
*/
|
|
requestQueryParameterKeys;
|
|
/** To indicate the depth of the virtual blob directory specified
|
|
* in the canonicalizedresource field of the string-to-sign.
|
|
*/
|
|
directoryDepth;
|
|
/**
|
|
* Optional. IP range allowed for this SAS.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get ipRange() {
|
|
if (this.ipRangeInner) {
|
|
return {
|
|
end: this.ipRangeInner.end,
|
|
start: this.ipRangeInner.start,
|
|
};
|
|
}
|
|
return undefined;
|
|
}
|
|
constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope, delegatedUserObjectId, requestHeaderKeys, requestQueryParameterKeys, directoryDepth) {
|
|
this.version = version;
|
|
this.signature = signature;
|
|
if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") {
|
|
// SASQueryParametersOptions
|
|
this.permissions = permissionsOrOptions.permissions;
|
|
this.services = permissionsOrOptions.services;
|
|
this.resourceTypes = permissionsOrOptions.resourceTypes;
|
|
this.protocol = permissionsOrOptions.protocol;
|
|
this.startsOn = permissionsOrOptions.startsOn;
|
|
this.expiresOn = permissionsOrOptions.expiresOn;
|
|
this.ipRangeInner = permissionsOrOptions.ipRange;
|
|
this.identifier = permissionsOrOptions.identifier;
|
|
this.delegatedUserObjectId = permissionsOrOptions.delegatedUserObjectId;
|
|
this.encryptionScope = permissionsOrOptions.encryptionScope;
|
|
this.resource = permissionsOrOptions.resource;
|
|
this.cacheControl = permissionsOrOptions.cacheControl;
|
|
this.contentDisposition = permissionsOrOptions.contentDisposition;
|
|
this.contentEncoding = permissionsOrOptions.contentEncoding;
|
|
this.contentLanguage = permissionsOrOptions.contentLanguage;
|
|
this.contentType = permissionsOrOptions.contentType;
|
|
this.requestHeaderKeys = permissionsOrOptions.requestHeaderKeys;
|
|
this.requestQueryParameterKeys = permissionsOrOptions.requestQueryParameterKeys;
|
|
this.directoryDepth = permissionsOrOptions.directoryDepth;
|
|
if (permissionsOrOptions.userDelegationKey) {
|
|
this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId;
|
|
this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId;
|
|
this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn;
|
|
this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn;
|
|
this.signedService = permissionsOrOptions.userDelegationKey.signedService;
|
|
this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion;
|
|
this.signedDelegatedUserTid =
|
|
permissionsOrOptions.userDelegationKey.signedDelegatedUserTenantId;
|
|
this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId;
|
|
this.correlationId = permissionsOrOptions.correlationId;
|
|
}
|
|
}
|
|
else {
|
|
this.services = services;
|
|
this.resourceTypes = resourceTypes;
|
|
this.expiresOn = expiresOn;
|
|
this.permissions = permissionsOrOptions;
|
|
this.protocol = protocol;
|
|
this.startsOn = startsOn;
|
|
this.ipRangeInner = ipRange;
|
|
this.delegatedUserObjectId = delegatedUserObjectId;
|
|
this.encryptionScope = encryptionScope;
|
|
this.identifier = identifier;
|
|
this.resource = resource;
|
|
this.cacheControl = cacheControl;
|
|
this.contentDisposition = contentDisposition;
|
|
this.contentEncoding = contentEncoding;
|
|
this.contentLanguage = contentLanguage;
|
|
this.contentType = contentType;
|
|
this.requestHeaderKeys = requestHeaderKeys;
|
|
this.requestQueryParameterKeys = requestQueryParameterKeys;
|
|
this.directoryDepth = directoryDepth;
|
|
if (userDelegationKey) {
|
|
this.signedOid = userDelegationKey.signedObjectId;
|
|
this.signedTenantId = userDelegationKey.signedTenantId;
|
|
this.signedStartsOn = userDelegationKey.signedStartsOn;
|
|
this.signedExpiresOn = userDelegationKey.signedExpiresOn;
|
|
this.signedService = userDelegationKey.signedService;
|
|
this.signedVersion = userDelegationKey.signedVersion;
|
|
this.signedDelegatedUserTid = userDelegationKey.signedDelegatedUserTenantId;
|
|
this.preauthorizedAgentObjectId = preauthorizedAgentObjectId;
|
|
this.correlationId = correlationId;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Encodes all SAS query parameters into a string that can be appended to a URL.
|
|
*
|
|
*/
|
|
toString() {
|
|
const params = [
|
|
"sv",
|
|
"ss",
|
|
"srt",
|
|
"spr",
|
|
"st",
|
|
"se",
|
|
"sip",
|
|
"si",
|
|
"ses",
|
|
"skoid", // Signed object ID
|
|
"sktid", // Signed tenant ID
|
|
"skt", // Signed key start time
|
|
"ske", // Signed key expiry time
|
|
"sks", // Signed key service
|
|
"skv", // Signed key version
|
|
"sr",
|
|
"sp",
|
|
"rscc",
|
|
"rscd",
|
|
"rsce",
|
|
"rscl",
|
|
"rsct",
|
|
"saoid",
|
|
"scid",
|
|
"sdd",
|
|
"sduoid", // Signed key user delegation object ID
|
|
"skdutid", // Signed key user delegation tenant ID
|
|
"srh", // Request Headers
|
|
"srq", // Request QueryParameters
|
|
"sig",
|
|
];
|
|
const queries = [];
|
|
for (const param of params) {
|
|
switch (param) {
|
|
case "sv":
|
|
this.tryAppendQueryParameter(queries, param, this.version);
|
|
break;
|
|
case "ss":
|
|
this.tryAppendQueryParameter(queries, param, this.services);
|
|
break;
|
|
case "srt":
|
|
this.tryAppendQueryParameter(queries, param, this.resourceTypes);
|
|
break;
|
|
case "spr":
|
|
this.tryAppendQueryParameter(queries, param, this.protocol);
|
|
break;
|
|
case "st":
|
|
this.tryAppendQueryParameter(queries, param, this.startsOn ? utils_common_truncatedISO8061Date(this.startsOn, false) : undefined);
|
|
break;
|
|
case "se":
|
|
this.tryAppendQueryParameter(queries, param, this.expiresOn ? utils_common_truncatedISO8061Date(this.expiresOn, false) : undefined);
|
|
break;
|
|
case "sip":
|
|
this.tryAppendQueryParameter(queries, param, this.ipRange ? ipRangeToString(this.ipRange) : undefined);
|
|
break;
|
|
case "si":
|
|
this.tryAppendQueryParameter(queries, param, this.identifier);
|
|
break;
|
|
case "ses":
|
|
this.tryAppendQueryParameter(queries, param, this.encryptionScope);
|
|
break;
|
|
case "skoid": // Signed object ID
|
|
this.tryAppendQueryParameter(queries, param, this.signedOid);
|
|
break;
|
|
case "sktid": // Signed tenant ID
|
|
this.tryAppendQueryParameter(queries, param, this.signedTenantId);
|
|
break;
|
|
case "skt": // Signed key start time
|
|
this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? utils_common_truncatedISO8061Date(this.signedStartsOn, false) : undefined);
|
|
break;
|
|
case "ske": // Signed key expiry time
|
|
this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? utils_common_truncatedISO8061Date(this.signedExpiresOn, false) : undefined);
|
|
break;
|
|
case "sks": // Signed key service
|
|
this.tryAppendQueryParameter(queries, param, this.signedService);
|
|
break;
|
|
case "skv": // Signed key version
|
|
this.tryAppendQueryParameter(queries, param, this.signedVersion);
|
|
break;
|
|
case "skdutid":
|
|
this.tryAppendQueryParameter(queries, param, this.signedDelegatedUserTid);
|
|
break;
|
|
case "sr":
|
|
this.tryAppendQueryParameter(queries, param, this.resource);
|
|
break;
|
|
case "sp":
|
|
this.tryAppendQueryParameter(queries, param, this.permissions);
|
|
break;
|
|
case "sig":
|
|
this.tryAppendQueryParameter(queries, param, this.signature);
|
|
break;
|
|
case "rscc":
|
|
this.tryAppendQueryParameter(queries, param, this.cacheControl);
|
|
break;
|
|
case "rscd":
|
|
this.tryAppendQueryParameter(queries, param, this.contentDisposition);
|
|
break;
|
|
case "rsce":
|
|
this.tryAppendQueryParameter(queries, param, this.contentEncoding);
|
|
break;
|
|
case "rscl":
|
|
this.tryAppendQueryParameter(queries, param, this.contentLanguage);
|
|
break;
|
|
case "rsct":
|
|
this.tryAppendQueryParameter(queries, param, this.contentType);
|
|
break;
|
|
case "saoid":
|
|
this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId);
|
|
break;
|
|
case "scid":
|
|
this.tryAppendQueryParameter(queries, param, this.correlationId);
|
|
break;
|
|
case "sduoid":
|
|
this.tryAppendQueryParameter(queries, param, this.delegatedUserObjectId);
|
|
break;
|
|
case "srh": // Request headers
|
|
this.tryAppendQueryParameter(queries, param, this.requestHeaderKeys);
|
|
break;
|
|
case "srq": // Request headers
|
|
this.tryAppendQueryParameter(queries, param, this.requestQueryParameterKeys);
|
|
break;
|
|
case "sdd": // Directory depth
|
|
this.tryAppendQueryParameter(queries, param, this.directoryDepth !== undefined ? this.directoryDepth.toString() : "");
|
|
break;
|
|
}
|
|
}
|
|
return queries.join("&");
|
|
}
|
|
/**
|
|
* A private helper method used to filter and append query key/value pairs into an array.
|
|
*
|
|
* @param queries -
|
|
* @param key -
|
|
* @param value -
|
|
*/
|
|
tryAppendQueryParameter(queries, key, value) {
|
|
if (!value) {
|
|
return;
|
|
}
|
|
key = encodeURIComponent(key);
|
|
value = encodeURIComponent(value);
|
|
if (key.length > 0 && value.length > 0) {
|
|
queries.push(`${key}=${value}`);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=SASQueryParameters.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/BlobSASSignatureValues.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
|
|
return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters;
|
|
}
|
|
function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) {
|
|
const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;
|
|
const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential
|
|
? sharedKeyCredentialOrUserDelegationKey
|
|
: undefined;
|
|
let userDelegationKeyCredential;
|
|
if (sharedKeyCredential === undefined && accountName !== undefined) {
|
|
userDelegationKeyCredential = new UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey);
|
|
}
|
|
if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) {
|
|
throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName.");
|
|
}
|
|
// Version 2020-12-06 adds support for encryptionscope in SAS.
|
|
if (version >= "2020-12-06") {
|
|
if (sharedKeyCredential !== undefined) {
|
|
return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential);
|
|
}
|
|
else {
|
|
if (version >= "2026-04-06") {
|
|
return generateBlobSASQueryParametersUDK20260406(blobSASSignatureValues, userDelegationKeyCredential);
|
|
}
|
|
else if (version >= "2025-07-05") {
|
|
return generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential);
|
|
}
|
|
else {
|
|
return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential);
|
|
}
|
|
}
|
|
}
|
|
// Version 2019-12-12 adds support for the blob tags permission.
|
|
// Version 2018-11-09 adds support for the signed resource and signed blob snapshot time fields.
|
|
// https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string
|
|
if (version >= "2018-11-09") {
|
|
if (sharedKeyCredential !== undefined) {
|
|
// Version 2020-02-10 delegation SAS signature construction supports blob name as a virtual directory.
|
|
if (version >= "2020-02-10") {
|
|
return generateBlobSASQueryParameters20200210(blobSASSignatureValues, sharedKeyCredential);
|
|
}
|
|
else {
|
|
return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential);
|
|
}
|
|
}
|
|
else {
|
|
// Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId.
|
|
if (version >= "2020-02-10") {
|
|
return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential);
|
|
}
|
|
else {
|
|
return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential);
|
|
}
|
|
}
|
|
}
|
|
if (version >= "2015-04-05") {
|
|
if (sharedKeyCredential !== undefined) {
|
|
return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential);
|
|
}
|
|
else {
|
|
throw new RangeError("'version' must be >= '2018-11-09' when generating user delegation SAS using user delegation key.");
|
|
}
|
|
}
|
|
throw new RangeError("'version' must be >= '2015-04-05'.");
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2015-04-05 AND BEFORE 2018-11-09.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn and identifier.
|
|
*
|
|
* WARNING: When identifier is not provided, permissions and expiresOn are required.
|
|
* You MUST assign value to identifier or expiresOn & permissions manually if you initial with
|
|
* this constructor.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param sharedKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
if (!blobSASSignatureValues.identifier &&
|
|
!(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
|
|
}
|
|
let resource = "c";
|
|
if (blobSASSignatureValues.blobName) {
|
|
resource = "b";
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
blobSASSignatureValues.identifier,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
|
|
blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
|
|
blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
|
|
blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
|
|
blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
|
|
].join("\n");
|
|
const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn and identifier.
|
|
*
|
|
* WARNING: When identifier is not provided, permissions and expiresOn are required.
|
|
* You MUST assign value to identifier or expiresOn & permissions manually if you initial with
|
|
* this constructor.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param sharedKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
if (!blobSASSignatureValues.identifier &&
|
|
!(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
if (blobSASSignatureValues.blobName) {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
blobSASSignatureValues.identifier,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
|
|
blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
|
|
blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
|
|
blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
|
|
blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
|
|
].join("\n");
|
|
const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-02-10.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn and identifier.
|
|
*
|
|
* WARNING: When identifier is not provided, permissions and expiresOn are required.
|
|
* You MUST assign value to identifier or expiresOn & permissions manually if you initial with
|
|
* this constructor.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param sharedKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParameters20200210(blobSASSignatureValues, sharedKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
if (!blobSASSignatureValues.identifier &&
|
|
!(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
blobSASSignatureValues.identifier,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
|
|
blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
|
|
blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
|
|
blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
|
|
blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
|
|
].join("\n");
|
|
const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, undefined, undefined, undefined, undefined, directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn and identifier.
|
|
*
|
|
* WARNING: When identifier is not provided, permissions and expiresOn are required.
|
|
* You MUST assign value to identifier or expiresOn & permissions manually if you initial with
|
|
* this constructor.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param sharedKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
if (!blobSASSignatureValues.identifier &&
|
|
!(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
blobSASSignatureValues.identifier,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.encryptionScope,
|
|
blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "",
|
|
blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "",
|
|
blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "",
|
|
blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "",
|
|
blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "",
|
|
].join("\n");
|
|
const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope, undefined, undefined, undefined, directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2018-11-09.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn.
|
|
*
|
|
* WARNING: identifier will be ignored, permissions and expiresOn are required.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param userDelegationKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
// Stored access policies are not supported for a user delegation SAS.
|
|
if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
if (blobSASSignatureValues.blobName) {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
userDelegationKeyCredential.userDelegationKey.signedObjectId,
|
|
userDelegationKeyCredential.userDelegationKey.signedTenantId,
|
|
userDelegationKeyCredential.userDelegationKey.signedStartsOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedExpiresOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedService,
|
|
userDelegationKeyCredential.userDelegationKey.signedVersion,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.cacheControl,
|
|
blobSASSignatureValues.contentDisposition,
|
|
blobSASSignatureValues.contentEncoding,
|
|
blobSASSignatureValues.contentLanguage,
|
|
blobSASSignatureValues.contentType,
|
|
].join("\n");
|
|
const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-02-10.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn.
|
|
*
|
|
* WARNING: identifier will be ignored, permissions and expiresOn are required.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param userDelegationKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
// Stored access policies are not supported for a user delegation SAS.
|
|
if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
userDelegationKeyCredential.userDelegationKey.signedObjectId,
|
|
userDelegationKeyCredential.userDelegationKey.signedTenantId,
|
|
userDelegationKeyCredential.userDelegationKey.signedStartsOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedExpiresOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedService,
|
|
userDelegationKeyCredential.userDelegationKey.signedVersion,
|
|
blobSASSignatureValues.preauthorizedAgentObjectId,
|
|
undefined, // agentObjectId
|
|
blobSASSignatureValues.correlationId,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.cacheControl,
|
|
blobSASSignatureValues.contentDisposition,
|
|
blobSASSignatureValues.contentEncoding,
|
|
blobSASSignatureValues.contentLanguage,
|
|
blobSASSignatureValues.contentType,
|
|
].join("\n");
|
|
const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, undefined, undefined, undefined, undefined, directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn.
|
|
*
|
|
* WARNING: identifier will be ignored, permissions and expiresOn are required.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param userDelegationKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
// Stored access policies are not supported for a user delegation SAS.
|
|
if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
userDelegationKeyCredential.userDelegationKey.signedObjectId,
|
|
userDelegationKeyCredential.userDelegationKey.signedTenantId,
|
|
userDelegationKeyCredential.userDelegationKey.signedStartsOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedExpiresOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedService,
|
|
userDelegationKeyCredential.userDelegationKey.signedVersion,
|
|
blobSASSignatureValues.preauthorizedAgentObjectId,
|
|
undefined, // agentObjectId
|
|
blobSASSignatureValues.correlationId,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.encryptionScope,
|
|
blobSASSignatureValues.cacheControl,
|
|
blobSASSignatureValues.contentDisposition,
|
|
blobSASSignatureValues.contentEncoding,
|
|
blobSASSignatureValues.contentLanguage,
|
|
blobSASSignatureValues.contentType,
|
|
].join("\n");
|
|
const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, undefined, undefined, undefined, directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn.
|
|
*
|
|
* WARNING: identifier will be ignored, permissions and expiresOn are required.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param userDelegationKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userDelegationKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
// Stored access policies are not supported for a user delegation SAS.
|
|
if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
userDelegationKeyCredential.userDelegationKey.signedObjectId,
|
|
userDelegationKeyCredential.userDelegationKey.signedTenantId,
|
|
userDelegationKeyCredential.userDelegationKey.signedStartsOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedExpiresOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedService,
|
|
userDelegationKeyCredential.userDelegationKey.signedVersion,
|
|
blobSASSignatureValues.preauthorizedAgentObjectId,
|
|
undefined, // agentObjectId
|
|
blobSASSignatureValues.correlationId,
|
|
userDelegationKeyCredential.userDelegationKey.signedDelegatedUserTenantId, // SignedKeyDelegatedUserTenantId, will be added in a future release.
|
|
blobSASSignatureValues.delegatedUserObjectId,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.encryptionScope,
|
|
blobSASSignatureValues.cacheControl,
|
|
blobSASSignatureValues.contentDisposition,
|
|
blobSASSignatureValues.contentEncoding,
|
|
blobSASSignatureValues.contentLanguage,
|
|
blobSASSignatureValues.contentType,
|
|
].join("\n");
|
|
const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId, undefined, undefined, directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
* IMPLEMENTATION FOR API VERSION FROM 2020-12-06.
|
|
*
|
|
* Creates an instance of SASQueryParameters.
|
|
*
|
|
* Only accepts required settings needed to create a SAS. For optional settings please
|
|
* set corresponding properties directly, such as permissions, startsOn.
|
|
*
|
|
* WARNING: identifier will be ignored, permissions and expiresOn are required.
|
|
*
|
|
* @param blobSASSignatureValues -
|
|
* @param userDelegationKeyCredential -
|
|
*/
|
|
function generateBlobSASQueryParametersUDK20260406(blobSASSignatureValues, userDelegationKeyCredential) {
|
|
blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues);
|
|
// Stored access policies are not supported for a user delegation SAS.
|
|
if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) {
|
|
throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS.");
|
|
}
|
|
let resource = "c";
|
|
let timestamp = blobSASSignatureValues.snapshotTime;
|
|
let directoryDepth = undefined;
|
|
if (blobSASSignatureValues.blobName) {
|
|
if (blobSASSignatureValues.isDirectory === true) {
|
|
resource = "d";
|
|
directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length;
|
|
}
|
|
else {
|
|
resource = "b";
|
|
if (blobSASSignatureValues.snapshotTime) {
|
|
resource = "bs";
|
|
}
|
|
else if (blobSASSignatureValues.versionId) {
|
|
resource = "bv";
|
|
timestamp = blobSASSignatureValues.versionId;
|
|
}
|
|
}
|
|
}
|
|
// Calling parse and toString guarantees the proper ordering and throws on invalid characters.
|
|
let verifiedPermissions;
|
|
if (blobSASSignatureValues.permissions) {
|
|
if (blobSASSignatureValues.blobName) {
|
|
verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
else {
|
|
verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString();
|
|
}
|
|
}
|
|
// Signature is generated on the un-url-encoded values.
|
|
const stringToSign = [
|
|
verifiedPermissions ? verifiedPermissions : "",
|
|
blobSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false)
|
|
: "",
|
|
blobSASSignatureValues.expiresOn
|
|
? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false)
|
|
: "",
|
|
getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName),
|
|
userDelegationKeyCredential.userDelegationKey.signedObjectId,
|
|
userDelegationKeyCredential.userDelegationKey.signedTenantId,
|
|
userDelegationKeyCredential.userDelegationKey.signedStartsOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedExpiresOn
|
|
? utils_common_truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false)
|
|
: "",
|
|
userDelegationKeyCredential.userDelegationKey.signedService,
|
|
userDelegationKeyCredential.userDelegationKey.signedVersion,
|
|
blobSASSignatureValues.preauthorizedAgentObjectId,
|
|
undefined, // agentObjectId
|
|
blobSASSignatureValues.correlationId,
|
|
userDelegationKeyCredential.userDelegationKey.signedDelegatedUserTenantId, // SignedKeyDelegatedUserTenantId, will be added in a future release.
|
|
blobSASSignatureValues.delegatedUserObjectId,
|
|
blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "",
|
|
blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "",
|
|
blobSASSignatureValues.version,
|
|
resource,
|
|
timestamp,
|
|
blobSASSignatureValues.encryptionScope,
|
|
formatRequestHeadersForSasSigning(blobSASSignatureValues.requestHeaders),
|
|
formatRequestQueryParametersForSasSigning(blobSASSignatureValues.requestQueryParameters),
|
|
blobSASSignatureValues.cacheControl,
|
|
blobSASSignatureValues.contentDisposition,
|
|
blobSASSignatureValues.contentEncoding,
|
|
blobSASSignatureValues.contentLanguage,
|
|
blobSASSignatureValues.contentType,
|
|
].join("\n");
|
|
const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId, getKeysOfRequestHeaders(blobSASSignatureValues.requestHeaders), getKeysOfRequestHeaders(blobSASSignatureValues.requestQueryParameters), directoryDepth),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
function formatRequestHeadersForSasSigning(requestHeaders) {
|
|
if (requestHeaders === undefined) {
|
|
return undefined;
|
|
}
|
|
let canonicalValue = "";
|
|
Object.keys(requestHeaders).forEach(function (key) {
|
|
// key: the name of the object key
|
|
// index: the ordinal position of the key within the object
|
|
canonicalValue = canonicalValue + key + ":" + requestHeaders[key] + "\n";
|
|
});
|
|
return canonicalValue;
|
|
}
|
|
function formatRequestQueryParametersForSasSigning(queryParameters) {
|
|
if (queryParameters === undefined) {
|
|
return undefined;
|
|
}
|
|
let canonicalValue = "";
|
|
Object.keys(queryParameters).forEach(function (key) {
|
|
// key: the name of the object key
|
|
// index: the ordinal position of the key within the object
|
|
canonicalValue = canonicalValue + "\n" + key + ":" + queryParameters[key];
|
|
});
|
|
return canonicalValue;
|
|
}
|
|
function getKeysOfRequestHeaders(requestHeaders) {
|
|
if (requestHeaders === undefined) {
|
|
return undefined;
|
|
}
|
|
let requestKeys = "";
|
|
let index = 0;
|
|
Object.keys(requestHeaders).forEach(function (key) {
|
|
// key: the name of the object key
|
|
// index: the ordinal position of the key within the object
|
|
if (index !== 0) {
|
|
requestKeys = requestKeys + ",";
|
|
}
|
|
requestKeys = requestKeys + key;
|
|
++index;
|
|
});
|
|
return requestKeys;
|
|
}
|
|
function getCanonicalName(accountName, containerName, blobName) {
|
|
// Container: "/blob/account/containerName"
|
|
// Blob: "/blob/account/containerName/blobName"
|
|
const elements = [`/blob/${accountName}/${containerName}`];
|
|
if (blobName) {
|
|
elements.push(`/${blobName}`);
|
|
}
|
|
return elements.join("");
|
|
}
|
|
function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) {
|
|
const version = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION;
|
|
if (blobSASSignatureValues.snapshotTime && version < "2018-11-09") {
|
|
throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'.");
|
|
}
|
|
if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) {
|
|
throw RangeError("Must provide 'blobName' when providing 'snapshotTime'.");
|
|
}
|
|
if (blobSASSignatureValues.versionId && version < "2019-10-10") {
|
|
throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'.");
|
|
}
|
|
if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) {
|
|
throw RangeError("Must provide 'blobName' when providing 'versionId'.");
|
|
}
|
|
if (blobSASSignatureValues.permissions &&
|
|
blobSASSignatureValues.permissions.setImmutabilityPolicy &&
|
|
version < "2020-08-04") {
|
|
throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
|
|
}
|
|
if (blobSASSignatureValues.permissions &&
|
|
blobSASSignatureValues.permissions.deleteVersion &&
|
|
version < "2019-10-10") {
|
|
throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission.");
|
|
}
|
|
if (blobSASSignatureValues.permissions &&
|
|
blobSASSignatureValues.permissions.permanentDelete &&
|
|
version < "2019-10-10") {
|
|
throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission.");
|
|
}
|
|
if (blobSASSignatureValues.permissions &&
|
|
blobSASSignatureValues.permissions.tag &&
|
|
version < "2019-12-12") {
|
|
throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission.");
|
|
}
|
|
if (version < "2020-02-10" &&
|
|
blobSASSignatureValues.permissions &&
|
|
(blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) {
|
|
throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission.");
|
|
}
|
|
if (version < "2021-04-10" &&
|
|
blobSASSignatureValues.permissions &&
|
|
blobSASSignatureValues.permissions.filterByTags) {
|
|
throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission.");
|
|
}
|
|
if (version < "2020-02-10" &&
|
|
(blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) {
|
|
throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'.");
|
|
}
|
|
if (blobSASSignatureValues.encryptionScope && version < "2020-12-06") {
|
|
throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
|
|
}
|
|
blobSASSignatureValues.version = version;
|
|
return blobSASSignatureValues;
|
|
}
|
|
function trimBlobName(blobName) {
|
|
let internalName = blobName;
|
|
while (internalName.startsWith("/")) {
|
|
internalName = internalName.substring(1);
|
|
}
|
|
while (internalName.endsWith("/")) {
|
|
internalName = internalName.substring(0, internalName.length - 1);
|
|
}
|
|
return internalName;
|
|
}
|
|
//# sourceMappingURL=BlobSASSignatureValues.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobLeaseClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.
|
|
*/
|
|
class BlobLeaseClient {
|
|
_leaseId;
|
|
_url;
|
|
_containerOrBlobOperation;
|
|
_isContainer;
|
|
/**
|
|
* Gets the lease Id.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseId() {
|
|
return this._leaseId;
|
|
}
|
|
/**
|
|
* Gets the url.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get url() {
|
|
return this._url;
|
|
}
|
|
/**
|
|
* Creates an instance of BlobLeaseClient.
|
|
* @param client - The client to make the lease operation requests.
|
|
* @param leaseId - Initial proposed lease id.
|
|
*/
|
|
constructor(client, leaseId) {
|
|
const clientContext = client.storageClientContext;
|
|
this._url = client.url;
|
|
if (client.name === undefined) {
|
|
this._isContainer = true;
|
|
this._containerOrBlobOperation = clientContext.container;
|
|
}
|
|
else {
|
|
this._isContainer = false;
|
|
this._containerOrBlobOperation = clientContext.blob;
|
|
}
|
|
if (!leaseId) {
|
|
leaseId = esm_randomUUID();
|
|
}
|
|
this._leaseId = leaseId;
|
|
}
|
|
/**
|
|
* Establishes and manages a lock on a container for delete operations, or on a blob
|
|
* for write and delete operations.
|
|
* The lock duration can be 15 to 60 seconds, or can be infinite.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-container
|
|
* and
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
|
|
*
|
|
* @param duration - Must be between 15 to 60 seconds, or infinite (-1)
|
|
* @param options - option to configure lease management operations.
|
|
* @returns Response data for acquire lease operation.
|
|
*/
|
|
async acquireLease(duration, options = {}) {
|
|
if (this._isContainer &&
|
|
((options.conditions?.ifMatch && options.conditions?.ifMatch !== ETagNone) ||
|
|
(options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== ETagNone) ||
|
|
options.conditions?.tagConditions)) {
|
|
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
|
|
}
|
|
return tracingClient.withSpan("BlobLeaseClient-acquireLease", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this._containerOrBlobOperation.acquireLease({
|
|
abortSignal: options.abortSignal,
|
|
duration,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
proposedLeaseId: this._leaseId,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* To change the ID of the lease.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-container
|
|
* and
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
|
|
*
|
|
* @param proposedLeaseId - the proposed new lease Id.
|
|
* @param options - option to configure lease management operations.
|
|
* @returns Response data for change lease operation.
|
|
*/
|
|
async changeLease(proposedLeaseId, options = {}) {
|
|
if (this._isContainer &&
|
|
((options.conditions?.ifMatch && options.conditions?.ifMatch !== ETagNone) ||
|
|
(options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== ETagNone) ||
|
|
options.conditions?.tagConditions)) {
|
|
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
|
|
}
|
|
return tracingClient.withSpan("BlobLeaseClient-changeLease", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, {
|
|
abortSignal: options.abortSignal,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
this._leaseId = proposedLeaseId;
|
|
return response;
|
|
});
|
|
}
|
|
/**
|
|
* To free the lease if it is no longer needed so that another client may
|
|
* immediately acquire a lease against the container or the blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-container
|
|
* and
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
|
|
*
|
|
* @param options - option to configure lease management operations.
|
|
* @returns Response data for release lease operation.
|
|
*/
|
|
async releaseLease(options = {}) {
|
|
if (this._isContainer &&
|
|
((options.conditions?.ifMatch && options.conditions?.ifMatch !== ETagNone) ||
|
|
(options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== ETagNone) ||
|
|
options.conditions?.tagConditions)) {
|
|
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
|
|
}
|
|
return tracingClient.withSpan("BlobLeaseClient-releaseLease", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this._containerOrBlobOperation.releaseLease(this._leaseId, {
|
|
abortSignal: options.abortSignal,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* To renew the lease.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-container
|
|
* and
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
|
|
*
|
|
* @param options - Optional option to configure lease management operations.
|
|
* @returns Response data for renew lease operation.
|
|
*/
|
|
async renewLease(options = {}) {
|
|
if (this._isContainer &&
|
|
((options.conditions?.ifMatch && options.conditions?.ifMatch !== ETagNone) ||
|
|
(options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== ETagNone) ||
|
|
options.conditions?.tagConditions)) {
|
|
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
|
|
}
|
|
return tracingClient.withSpan("BlobLeaseClient-renewLease", options, async (updatedOptions) => {
|
|
return this._containerOrBlobOperation.renewLease(this._leaseId, {
|
|
abortSignal: options.abortSignal,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* To end the lease but ensure that another client cannot acquire a new lease
|
|
* until the current lease period has expired.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-container
|
|
* and
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/lease-blob
|
|
*
|
|
* @param breakPeriod - Break period
|
|
* @param options - Optional options to configure lease management operations.
|
|
* @returns Response data for break lease operation.
|
|
*/
|
|
async breakLease(breakPeriod, options = {}) {
|
|
if (this._isContainer &&
|
|
((options.conditions?.ifMatch && options.conditions?.ifMatch !== ETagNone) ||
|
|
(options.conditions?.ifNoneMatch && options.conditions?.ifNoneMatch !== ETagNone) ||
|
|
options.conditions?.tagConditions)) {
|
|
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
|
|
}
|
|
return tracingClient.withSpan("BlobLeaseClient-breakLease", options, async (updatedOptions) => {
|
|
const operationOptions = {
|
|
abortSignal: options.abortSignal,
|
|
breakPeriod,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
};
|
|
return utils_common_assertResponse(await this._containerOrBlobOperation.breakLease(operationOptions));
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobLeaseClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/RetriableReadableStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends.
|
|
*/
|
|
class RetriableReadableStream extends external_node_stream_.Readable {
|
|
start;
|
|
offset;
|
|
end;
|
|
getter;
|
|
source;
|
|
retries = 0;
|
|
maxRetryRequests;
|
|
onProgress;
|
|
options;
|
|
/**
|
|
* Creates an instance of RetriableReadableStream.
|
|
*
|
|
* @param source - The current ReadableStream returned from getter
|
|
* @param getter - A method calling downloading request returning
|
|
* a new ReadableStream from specified offset
|
|
* @param offset - Offset position in original data source to read
|
|
* @param count - How much data in original data source to read
|
|
* @param options -
|
|
*/
|
|
constructor(source, getter, offset, count, options = {}) {
|
|
super({ highWaterMark: options.highWaterMark });
|
|
this.getter = getter;
|
|
this.source = source;
|
|
this.start = offset;
|
|
this.offset = offset;
|
|
this.end = offset + count - 1;
|
|
this.maxRetryRequests =
|
|
options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0;
|
|
this.onProgress = options.onProgress;
|
|
this.options = options;
|
|
this.setSourceEventHandlers();
|
|
}
|
|
_read() {
|
|
this.source.resume();
|
|
}
|
|
setSourceEventHandlers() {
|
|
this.source.on("data", this.sourceDataHandler);
|
|
this.source.on("end", this.sourceErrorOrEndHandler);
|
|
this.source.on("error", this.sourceErrorOrEndHandler);
|
|
// needed for Node14
|
|
this.source.on("aborted", this.sourceAbortedHandler);
|
|
}
|
|
removeSourceEventHandlers() {
|
|
this.source.removeListener("data", this.sourceDataHandler);
|
|
this.source.removeListener("end", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("error", this.sourceErrorOrEndHandler);
|
|
this.source.removeListener("aborted", this.sourceAbortedHandler);
|
|
}
|
|
sourceDataHandler = (data) => {
|
|
if (this.options.doInjectErrorOnce) {
|
|
this.options.doInjectErrorOnce = undefined;
|
|
this.source.pause();
|
|
this.sourceErrorOrEndHandler();
|
|
this.source.destroy();
|
|
return;
|
|
}
|
|
// console.log(
|
|
// `Offset: ${this.offset}, Received ${data.length} from internal stream`
|
|
// );
|
|
this.offset += data.length;
|
|
if (this.onProgress) {
|
|
this.onProgress({ loadedBytes: this.offset - this.start });
|
|
}
|
|
if (!this.push(data)) {
|
|
this.source.pause();
|
|
}
|
|
};
|
|
sourceAbortedHandler = () => {
|
|
const abortError = new AbortError_AbortError("The operation was aborted.");
|
|
this.destroy(abortError);
|
|
};
|
|
sourceErrorOrEndHandler = (err) => {
|
|
if (err && err.name === "AbortError") {
|
|
this.destroy(err);
|
|
return;
|
|
}
|
|
// console.log(
|
|
// `Source stream emits end or error, offset: ${
|
|
// this.offset
|
|
// }, dest end : ${this.end}`
|
|
// );
|
|
this.removeSourceEventHandlers();
|
|
if (this.offset - 1 === this.end) {
|
|
this.push(null);
|
|
}
|
|
else if (this.offset <= this.end) {
|
|
// TODO if error is CRC64 not match, directly throw out the error.
|
|
// console.log(
|
|
// `retries: ${this.retries}, max retries: ${this.maxRetries}`
|
|
// );
|
|
if (this.retries < this.maxRetryRequests) {
|
|
this.retries += 1;
|
|
this.getter(this.offset)
|
|
.then((newSource) => {
|
|
this.source = newSource;
|
|
this.setSourceEventHandlers();
|
|
return;
|
|
})
|
|
.catch((error) => {
|
|
this.destroy(error);
|
|
});
|
|
}
|
|
else {
|
|
this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`));
|
|
}
|
|
}
|
|
else {
|
|
this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`));
|
|
}
|
|
};
|
|
_destroy(error, callback) {
|
|
// remove listener from source and release source
|
|
this.removeSourceEventHandlers();
|
|
this.source.destroy();
|
|
callback(error === null ? undefined : error);
|
|
}
|
|
}
|
|
//# sourceMappingURL=RetriableReadableStream.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobDownloadResponse.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will
|
|
* automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot
|
|
* trigger retries defined in pipeline retry policy.)
|
|
*
|
|
* The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js
|
|
* Readable stream.
|
|
*/
|
|
class BlobDownloadResponse {
|
|
/**
|
|
* Indicates that the service supports
|
|
* requests for partial file content.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get acceptRanges() {
|
|
return this.originalResponse.acceptRanges;
|
|
}
|
|
/**
|
|
* Returns if it was previously specified
|
|
* for the file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get cacheControl() {
|
|
return this.originalResponse.cacheControl;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the 'x-ms-content-disposition' header and specifies how to process the
|
|
* response.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentDisposition() {
|
|
return this.originalResponse.contentDisposition;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the Content-Encoding request header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentEncoding() {
|
|
return this.originalResponse.contentEncoding;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the Content-Language request header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentLanguage() {
|
|
return this.originalResponse.contentLanguage;
|
|
}
|
|
/**
|
|
* The current sequence number for a
|
|
* page blob. This header is not returned for block blobs or append blobs.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobSequenceNumber() {
|
|
return this.originalResponse.blobSequenceNumber;
|
|
}
|
|
/**
|
|
* The blob's type. Possible values include:
|
|
* 'BlockBlob', 'PageBlob', 'AppendBlob'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobType() {
|
|
return this.originalResponse.blobType;
|
|
}
|
|
/**
|
|
* The number of bytes present in the
|
|
* response body.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentLength() {
|
|
return this.originalResponse.contentLength;
|
|
}
|
|
/**
|
|
* If the file has an MD5 hash and the
|
|
* request is to read the full file, this response header is returned so that
|
|
* the client can check for message content integrity. If the request is to
|
|
* read a specified range and the 'x-ms-range-get-content-md5' is set to
|
|
* true, then the request returns an MD5 hash for the range, as long as the
|
|
* range size is less than or equal to 4 MB. If neither of these sets of
|
|
* conditions is true, then no value is returned for the 'Content-MD5'
|
|
* header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentMD5() {
|
|
return this.originalResponse.contentMD5;
|
|
}
|
|
/**
|
|
* Indicates the range of bytes returned if
|
|
* the client requested a subset of the file by setting the Range request
|
|
* header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentRange() {
|
|
return this.originalResponse.contentRange;
|
|
}
|
|
/**
|
|
* The content type specified for the file.
|
|
* The default content type is 'application/octet-stream'
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentType() {
|
|
return this.originalResponse.contentType;
|
|
}
|
|
/**
|
|
* Conclusion time of the last attempted
|
|
* Copy File operation where this file was the destination file. This value
|
|
* can specify the time of a completed, aborted, or failed copy attempt.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyCompletedOn() {
|
|
return this.originalResponse.copyCompletedOn;
|
|
}
|
|
/**
|
|
* String identifier for the last attempted Copy
|
|
* File operation where this file was the destination file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyId() {
|
|
return this.originalResponse.copyId;
|
|
}
|
|
/**
|
|
* Contains the number of bytes copied and
|
|
* the total bytes in the source in the last attempted Copy File operation
|
|
* where this file was the destination file. Can show between 0 and
|
|
* Content-Length bytes copied.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyProgress() {
|
|
return this.originalResponse.copyProgress;
|
|
}
|
|
/**
|
|
* URL up to 2KB in length that specifies the
|
|
* source file used in the last attempted Copy File operation where this file
|
|
* was the destination file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copySource() {
|
|
return this.originalResponse.copySource;
|
|
}
|
|
/**
|
|
* State of the copy operation
|
|
* identified by 'x-ms-copy-id'. Possible values include: 'pending',
|
|
* 'success', 'aborted', 'failed'
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyStatus() {
|
|
return this.originalResponse.copyStatus;
|
|
}
|
|
/**
|
|
* Only appears when
|
|
* x-ms-copy-status is failed or pending. Describes cause of fatal or
|
|
* non-fatal copy operation failure.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyStatusDescription() {
|
|
return this.originalResponse.copyStatusDescription;
|
|
}
|
|
/**
|
|
* When a blob is leased,
|
|
* specifies whether the lease is of infinite or fixed duration. Possible
|
|
* values include: 'infinite', 'fixed'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseDuration() {
|
|
return this.originalResponse.leaseDuration;
|
|
}
|
|
/**
|
|
* Lease state of the blob. Possible
|
|
* values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseState() {
|
|
return this.originalResponse.leaseState;
|
|
}
|
|
/**
|
|
* The current lease status of the
|
|
* blob. Possible values include: 'locked', 'unlocked'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseStatus() {
|
|
return this.originalResponse.leaseStatus;
|
|
}
|
|
/**
|
|
* A UTC date/time value generated by the service that
|
|
* indicates the time at which the response was initiated.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get date() {
|
|
return this.originalResponse.date;
|
|
}
|
|
/**
|
|
* The number of committed blocks
|
|
* present in the blob. This header is returned only for append blobs.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobCommittedBlockCount() {
|
|
return this.originalResponse.blobCommittedBlockCount;
|
|
}
|
|
/**
|
|
* The ETag contains a value that you can use to
|
|
* perform operations conditionally, in quotes.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get etag() {
|
|
return this.originalResponse.etag;
|
|
}
|
|
/**
|
|
* The number of tags associated with the blob
|
|
*
|
|
* @readonly
|
|
*/
|
|
get tagCount() {
|
|
return this.originalResponse.tagCount;
|
|
}
|
|
/**
|
|
* The error code.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get errorCode() {
|
|
return this.originalResponse.errorCode;
|
|
}
|
|
/**
|
|
* The value of this header is set to
|
|
* true if the file data and application metadata are completely encrypted
|
|
* using the specified algorithm. Otherwise, the value is set to false (when
|
|
* the file is unencrypted, or if only parts of the file/application metadata
|
|
* are encrypted).
|
|
*
|
|
* @readonly
|
|
*/
|
|
get isServerEncrypted() {
|
|
return this.originalResponse.isServerEncrypted;
|
|
}
|
|
/**
|
|
* If the blob has a MD5 hash, and if
|
|
* request contains range header (Range or x-ms-range), this response header
|
|
* is returned with the value of the whole blob's MD5 value. This value may
|
|
* or may not be equal to the value returned in Content-MD5 header, with the
|
|
* latter calculated from the requested range.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobContentMD5() {
|
|
return this.originalResponse.blobContentMD5;
|
|
}
|
|
/**
|
|
* Returns the date and time the file was last
|
|
* modified. Any operation that modifies the file or its properties updates
|
|
* the last modified time.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get lastModified() {
|
|
return this.originalResponse.lastModified;
|
|
}
|
|
/**
|
|
* Returns the UTC date and time generated by the service that indicates the time at which the blob was
|
|
* last read or written to.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get lastAccessed() {
|
|
return this.originalResponse.lastAccessed;
|
|
}
|
|
/**
|
|
* Returns the date and time the blob was created.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get createdOn() {
|
|
return this.originalResponse.createdOn;
|
|
}
|
|
/**
|
|
* A name-value pair
|
|
* to associate with a file storage object.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get metadata() {
|
|
return this.originalResponse.metadata;
|
|
}
|
|
/**
|
|
* This header uniquely identifies the request
|
|
* that was made and can be used for troubleshooting the request.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get requestId() {
|
|
return this.originalResponse.requestId;
|
|
}
|
|
/**
|
|
* If a client request id header is sent in the request, this header will be present in the
|
|
* response with the same value.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get clientRequestId() {
|
|
return this.originalResponse.clientRequestId;
|
|
}
|
|
/**
|
|
* Indicates the version of the Blob service used
|
|
* to execute the request.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get version() {
|
|
return this.originalResponse.version;
|
|
}
|
|
/**
|
|
* Indicates the versionId of the downloaded blob version.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get versionId() {
|
|
return this.originalResponse.versionId;
|
|
}
|
|
/**
|
|
* Indicates whether version of this blob is a current version.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get isCurrentVersion() {
|
|
return this.originalResponse.isCurrentVersion;
|
|
}
|
|
/**
|
|
* The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
|
|
* when the blob was encrypted with a customer-provided key.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get encryptionKeySha256() {
|
|
return this.originalResponse.encryptionKeySha256;
|
|
}
|
|
/**
|
|
* If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
|
|
* true, then the request returns a crc64 for the range, as long as the range size is less than
|
|
* or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
|
|
* specified in the same request, it will fail with 400(Bad Request)
|
|
*/
|
|
get contentCrc64() {
|
|
return this.originalResponse.contentCrc64;
|
|
}
|
|
/**
|
|
* Object Replication Policy Id of the destination blob.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get objectReplicationDestinationPolicyId() {
|
|
return this.originalResponse.objectReplicationDestinationPolicyId;
|
|
}
|
|
/**
|
|
* Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get objectReplicationSourceProperties() {
|
|
return this.originalResponse.objectReplicationSourceProperties;
|
|
}
|
|
/**
|
|
* If this blob has been sealed.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get isSealed() {
|
|
return this.originalResponse.isSealed;
|
|
}
|
|
/**
|
|
* UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get immutabilityPolicyExpiresOn() {
|
|
return this.originalResponse.immutabilityPolicyExpiresOn;
|
|
}
|
|
/**
|
|
* Indicates immutability policy mode.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get immutabilityPolicyMode() {
|
|
return this.originalResponse.immutabilityPolicyMode;
|
|
}
|
|
/**
|
|
* Indicates if a legal hold is present on the blob.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get legalHold() {
|
|
return this.originalResponse.legalHold;
|
|
}
|
|
get structuredBodyType() {
|
|
return this.originalResponse.structuredBodyType;
|
|
}
|
|
/**
|
|
* The response body as a browser Blob.
|
|
* Always undefined in node.js.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentAsBlob() {
|
|
return this.originalResponse.blobBody;
|
|
}
|
|
/**
|
|
* The response body as a node.js Readable stream.
|
|
* Always undefined in the browser.
|
|
*
|
|
* It will automatically retry when internal read stream unexpected ends.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get readableStreamBody() {
|
|
return esm_isNodeLike ? this.blobDownloadStream : undefined;
|
|
}
|
|
/**
|
|
* The HTTP response.
|
|
*/
|
|
get _response() {
|
|
return this.originalResponse._response;
|
|
}
|
|
originalResponse;
|
|
blobDownloadStream;
|
|
/**
|
|
* Creates an instance of BlobDownloadResponse.
|
|
*
|
|
* @param originalResponse -
|
|
* @param getter -
|
|
* @param offset -
|
|
* @param count -
|
|
* @param options -
|
|
*/
|
|
constructor(originalResponse, getter, offset, count, options = {}) {
|
|
this.originalResponse = originalResponse;
|
|
const streamBody = this.originalResponse.structuredBodyType === undefined
|
|
? this.originalResponse.readableStreamBody
|
|
: structuredMessageDecodingStream(this.originalResponse.readableStreamBody, options);
|
|
this.blobDownloadStream = new RetriableReadableStream(streamBody, getter, offset, count, options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobDownloadResponse.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/AvroConstants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
const AVRO_SYNC_MARKER_SIZE = 16;
|
|
const AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]);
|
|
const AVRO_CODEC_KEY = "avro.codec";
|
|
const AVRO_SCHEMA_KEY = "avro.schema";
|
|
//# sourceMappingURL=AvroConstants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/AvroParser.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
class AvroParser {
|
|
/**
|
|
* Reads a fixed number of bytes from the stream.
|
|
*
|
|
* @param stream -
|
|
* @param length -
|
|
* @param options -
|
|
*/
|
|
static async readFixedBytes(stream, length, options = {}) {
|
|
const bytes = await stream.read(length, { abortSignal: options.abortSignal });
|
|
if (bytes.length !== length) {
|
|
throw new Error("Hit stream end.");
|
|
}
|
|
return bytes;
|
|
}
|
|
/**
|
|
* Reads a single byte from the stream.
|
|
*
|
|
* @param stream -
|
|
* @param options -
|
|
*/
|
|
static async readByte(stream, options = {}) {
|
|
const buf = await AvroParser.readFixedBytes(stream, 1, options);
|
|
return buf[0];
|
|
}
|
|
// int and long are stored in variable-length zig-zag coding.
|
|
// variable-length: https://lucene.apache.org/core/3_5_0/fileformats.html#VInt
|
|
// zig-zag: https://developers.google.com/protocol-buffers/docs/encoding?csw=1#types
|
|
static async readZigZagLong(stream, options = {}) {
|
|
let zigZagEncoded = 0;
|
|
let significanceInBit = 0;
|
|
let byte, haveMoreByte, significanceInFloat;
|
|
do {
|
|
byte = await AvroParser.readByte(stream, options);
|
|
haveMoreByte = byte & 0x80;
|
|
zigZagEncoded |= (byte & 0x7f) << significanceInBit;
|
|
significanceInBit += 7;
|
|
} while (haveMoreByte && significanceInBit < 28); // bitwise operation only works for 32-bit integers
|
|
if (haveMoreByte) {
|
|
// Switch to float arithmetic
|
|
// eslint-disable-next-line no-self-assign
|
|
zigZagEncoded = zigZagEncoded;
|
|
significanceInFloat = 268435456; // 2 ** 28.
|
|
do {
|
|
byte = await AvroParser.readByte(stream, options);
|
|
zigZagEncoded += (byte & 0x7f) * significanceInFloat;
|
|
significanceInFloat *= 128; // 2 ** 7
|
|
} while (byte & 0x80);
|
|
const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2;
|
|
if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) {
|
|
throw new Error("Integer overflow.");
|
|
}
|
|
return res;
|
|
}
|
|
return (zigZagEncoded >> 1) ^ -(zigZagEncoded & 1);
|
|
}
|
|
static async readLong(stream, options = {}) {
|
|
return AvroParser.readZigZagLong(stream, options);
|
|
}
|
|
static async readInt(stream, options = {}) {
|
|
return AvroParser.readZigZagLong(stream, options);
|
|
}
|
|
static async readNull() {
|
|
return null;
|
|
}
|
|
static async readBoolean(stream, options = {}) {
|
|
const b = await AvroParser.readByte(stream, options);
|
|
if (b === 1) {
|
|
return true;
|
|
}
|
|
else if (b === 0) {
|
|
return false;
|
|
}
|
|
else {
|
|
throw new Error("Byte was not a boolean.");
|
|
}
|
|
}
|
|
static async readFloat(stream, options = {}) {
|
|
const u8arr = await AvroParser.readFixedBytes(stream, 4, options);
|
|
const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
|
|
return view.getFloat32(0, true); // littleEndian = true
|
|
}
|
|
static async readDouble(stream, options = {}) {
|
|
const u8arr = await AvroParser.readFixedBytes(stream, 8, options);
|
|
const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength);
|
|
return view.getFloat64(0, true); // littleEndian = true
|
|
}
|
|
static async readBytes(stream, options = {}) {
|
|
const size = await AvroParser.readLong(stream, options);
|
|
if (size < 0) {
|
|
throw new Error("Bytes size was negative.");
|
|
}
|
|
return stream.read(size, { abortSignal: options.abortSignal });
|
|
}
|
|
static async readString(stream, options = {}) {
|
|
const u8arr = await AvroParser.readBytes(stream, options);
|
|
const utf8decoder = new TextDecoder();
|
|
return utf8decoder.decode(u8arr);
|
|
}
|
|
static async readMapPair(stream, readItemMethod, options = {}) {
|
|
const key = await AvroParser.readString(stream, options);
|
|
// FUTURE: this won't work with readFixed (currently not supported) which needs a length as the parameter.
|
|
const value = await readItemMethod(stream, options);
|
|
return { key, value };
|
|
}
|
|
static async readMap(stream, readItemMethod, options = {}) {
|
|
const readPairMethod = (s, opts = {}) => {
|
|
return AvroParser.readMapPair(s, readItemMethod, opts);
|
|
};
|
|
const pairs = await AvroParser.readArray(stream, readPairMethod, options);
|
|
const dict = {};
|
|
for (const pair of pairs) {
|
|
dict[pair.key] = pair.value;
|
|
}
|
|
return dict;
|
|
}
|
|
static async readArray(stream, readItemMethod, options = {}) {
|
|
const items = [];
|
|
for (let count = await AvroParser.readLong(stream, options); count !== 0; count = await AvroParser.readLong(stream, options)) {
|
|
if (count < 0) {
|
|
// Ignore block sizes
|
|
await AvroParser.readLong(stream, options);
|
|
count = -count;
|
|
}
|
|
while (count--) {
|
|
const item = await readItemMethod(stream, options);
|
|
items.push(item);
|
|
}
|
|
}
|
|
return items;
|
|
}
|
|
}
|
|
var AvroComplex;
|
|
(function (AvroComplex) {
|
|
AvroComplex["RECORD"] = "record";
|
|
AvroComplex["ENUM"] = "enum";
|
|
AvroComplex["ARRAY"] = "array";
|
|
AvroComplex["MAP"] = "map";
|
|
AvroComplex["UNION"] = "union";
|
|
AvroComplex["FIXED"] = "fixed";
|
|
})(AvroComplex || (AvroComplex = {}));
|
|
var AvroPrimitive;
|
|
(function (AvroPrimitive) {
|
|
AvroPrimitive["NULL"] = "null";
|
|
AvroPrimitive["BOOLEAN"] = "boolean";
|
|
AvroPrimitive["INT"] = "int";
|
|
AvroPrimitive["LONG"] = "long";
|
|
AvroPrimitive["FLOAT"] = "float";
|
|
AvroPrimitive["DOUBLE"] = "double";
|
|
AvroPrimitive["BYTES"] = "bytes";
|
|
AvroPrimitive["STRING"] = "string";
|
|
})(AvroPrimitive || (AvroPrimitive = {}));
|
|
class AvroType {
|
|
/**
|
|
* Determines the AvroType from the Avro Schema.
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
static fromSchema(schema) {
|
|
if (typeof schema === "string") {
|
|
return AvroType.fromStringSchema(schema);
|
|
}
|
|
else if (Array.isArray(schema)) {
|
|
return AvroType.fromArraySchema(schema);
|
|
}
|
|
else {
|
|
return AvroType.fromObjectSchema(schema);
|
|
}
|
|
}
|
|
static fromStringSchema(schema) {
|
|
switch (schema) {
|
|
case AvroPrimitive.NULL:
|
|
case AvroPrimitive.BOOLEAN:
|
|
case AvroPrimitive.INT:
|
|
case AvroPrimitive.LONG:
|
|
case AvroPrimitive.FLOAT:
|
|
case AvroPrimitive.DOUBLE:
|
|
case AvroPrimitive.BYTES:
|
|
case AvroPrimitive.STRING:
|
|
return new AvroPrimitiveType(schema);
|
|
default:
|
|
throw new Error(`Unexpected Avro type ${schema}`);
|
|
}
|
|
}
|
|
static fromArraySchema(schema) {
|
|
return new AvroUnionType(schema.map(AvroType.fromSchema));
|
|
}
|
|
static fromObjectSchema(schema) {
|
|
const type = schema.type;
|
|
// Primitives can be defined as strings or objects
|
|
try {
|
|
return AvroType.fromStringSchema(type);
|
|
}
|
|
catch {
|
|
// no-op
|
|
}
|
|
switch (type) {
|
|
case AvroComplex.RECORD:
|
|
if (schema.aliases) {
|
|
throw new Error(`aliases currently is not supported, schema: ${schema}`);
|
|
}
|
|
if (!schema.name) {
|
|
throw new Error(`Required attribute 'name' doesn't exist on schema: ${schema}`);
|
|
}
|
|
// eslint-disable-next-line no-case-declarations
|
|
const fields = {};
|
|
if (!schema.fields) {
|
|
throw new Error(`Required attribute 'fields' doesn't exist on schema: ${schema}`);
|
|
}
|
|
for (const field of schema.fields) {
|
|
fields[field.name] = AvroType.fromSchema(field.type);
|
|
}
|
|
return new AvroRecordType(fields, schema.name);
|
|
case AvroComplex.ENUM:
|
|
if (schema.aliases) {
|
|
throw new Error(`aliases currently is not supported, schema: ${schema}`);
|
|
}
|
|
if (!schema.symbols) {
|
|
throw new Error(`Required attribute 'symbols' doesn't exist on schema: ${schema}`);
|
|
}
|
|
return new AvroEnumType(schema.symbols);
|
|
case AvroComplex.MAP:
|
|
if (!schema.values) {
|
|
throw new Error(`Required attribute 'values' doesn't exist on schema: ${schema}`);
|
|
}
|
|
return new AvroMapType(AvroType.fromSchema(schema.values));
|
|
case AvroComplex.ARRAY: // Unused today
|
|
case AvroComplex.FIXED: // Unused today
|
|
default:
|
|
throw new Error(`Unexpected Avro type ${type} in ${schema}`);
|
|
}
|
|
}
|
|
}
|
|
class AvroPrimitiveType extends AvroType {
|
|
_primitive;
|
|
constructor(primitive) {
|
|
super();
|
|
this._primitive = primitive;
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
read(stream, options = {}) {
|
|
switch (this._primitive) {
|
|
case AvroPrimitive.NULL:
|
|
return AvroParser.readNull();
|
|
case AvroPrimitive.BOOLEAN:
|
|
return AvroParser.readBoolean(stream, options);
|
|
case AvroPrimitive.INT:
|
|
return AvroParser.readInt(stream, options);
|
|
case AvroPrimitive.LONG:
|
|
return AvroParser.readLong(stream, options);
|
|
case AvroPrimitive.FLOAT:
|
|
return AvroParser.readFloat(stream, options);
|
|
case AvroPrimitive.DOUBLE:
|
|
return AvroParser.readDouble(stream, options);
|
|
case AvroPrimitive.BYTES:
|
|
return AvroParser.readBytes(stream, options);
|
|
case AvroPrimitive.STRING:
|
|
return AvroParser.readString(stream, options);
|
|
default:
|
|
throw new Error("Unknown Avro Primitive");
|
|
}
|
|
}
|
|
}
|
|
class AvroEnumType extends AvroType {
|
|
_symbols;
|
|
constructor(symbols) {
|
|
super();
|
|
this._symbols = symbols;
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
async read(stream, options = {}) {
|
|
const value = await AvroParser.readInt(stream, options);
|
|
return this._symbols[value];
|
|
}
|
|
}
|
|
class AvroUnionType extends AvroType {
|
|
_types;
|
|
constructor(types) {
|
|
super();
|
|
this._types = types;
|
|
}
|
|
async read(stream, options = {}) {
|
|
const typeIndex = await AvroParser.readInt(stream, options);
|
|
return this._types[typeIndex].read(stream, options);
|
|
}
|
|
}
|
|
class AvroMapType extends AvroType {
|
|
_itemType;
|
|
constructor(itemType) {
|
|
super();
|
|
this._itemType = itemType;
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
read(stream, options = {}) {
|
|
const readItemMethod = (s, opts) => {
|
|
return this._itemType.read(s, opts);
|
|
};
|
|
return AvroParser.readMap(stream, readItemMethod, options);
|
|
}
|
|
}
|
|
class AvroRecordType extends AvroType {
|
|
_name;
|
|
_fields;
|
|
constructor(fields, name) {
|
|
super();
|
|
this._fields = fields;
|
|
this._name = name;
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
async read(stream, options = {}) {
|
|
// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
|
|
const record = {};
|
|
record["$schema"] = this._name;
|
|
for (const key in this._fields) {
|
|
if (Object.prototype.hasOwnProperty.call(this._fields, key)) {
|
|
record[key] = await this._fields[key].read(stream, options);
|
|
}
|
|
}
|
|
return record;
|
|
}
|
|
}
|
|
//# sourceMappingURL=AvroParser.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/utils/utils.common.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
function arraysEqual(a, b) {
|
|
if (a === b)
|
|
return true;
|
|
if (a == null || b == null)
|
|
return false;
|
|
if (a.length !== b.length)
|
|
return false;
|
|
for (let i = 0; i < a.length; ++i) {
|
|
if (a[i] !== b[i])
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
//# sourceMappingURL=utils.common.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/AvroReader.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
// TODO: Do a review of non-interfaces
|
|
/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */
|
|
|
|
|
|
|
|
class AvroReader {
|
|
_dataStream;
|
|
_headerStream;
|
|
_syncMarker;
|
|
_metadata;
|
|
_itemType;
|
|
_itemsRemainingInBlock;
|
|
// Remembers where we started if partial data stream was provided.
|
|
_initialBlockOffset;
|
|
/// The byte offset within the Avro file (both header and data)
|
|
/// of the start of the current block.
|
|
_blockOffset;
|
|
get blockOffset() {
|
|
return this._blockOffset;
|
|
}
|
|
_objectIndex;
|
|
get objectIndex() {
|
|
return this._objectIndex;
|
|
}
|
|
_initialized;
|
|
constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) {
|
|
this._dataStream = dataStream;
|
|
this._headerStream = headerStream || dataStream;
|
|
this._initialized = false;
|
|
this._blockOffset = currentBlockOffset || 0;
|
|
this._objectIndex = indexWithinCurrentBlock || 0;
|
|
this._initialBlockOffset = currentBlockOffset || 0;
|
|
}
|
|
async initialize(options = {}) {
|
|
const header = await AvroParser.readFixedBytes(this._headerStream, AVRO_INIT_BYTES.length, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
if (!arraysEqual(header, AVRO_INIT_BYTES)) {
|
|
throw new Error("Stream is not an Avro file.");
|
|
}
|
|
// File metadata is written as if defined by the following map schema:
|
|
// { "type": "map", "values": "bytes"}
|
|
this._metadata = await AvroParser.readMap(this._headerStream, AvroParser.readString, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
// Validate codec
|
|
const codec = this._metadata[AVRO_CODEC_KEY];
|
|
if (!(codec === undefined || codec === null || codec === "null")) {
|
|
throw new Error("Codecs are not supported");
|
|
}
|
|
// The 16-byte, randomly-generated sync marker for this file.
|
|
this._syncMarker = await AvroParser.readFixedBytes(this._headerStream, AVRO_SYNC_MARKER_SIZE, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
// Parse the schema
|
|
const schema = JSON.parse(this._metadata[AVRO_SCHEMA_KEY]);
|
|
this._itemType = AvroType.fromSchema(schema);
|
|
if (this._blockOffset === 0) {
|
|
this._blockOffset = this._initialBlockOffset + this._dataStream.position;
|
|
}
|
|
this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
// skip block length
|
|
await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
|
|
this._initialized = true;
|
|
if (this._objectIndex && this._objectIndex > 0) {
|
|
for (let i = 0; i < this._objectIndex; i++) {
|
|
await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal });
|
|
this._itemsRemainingInBlock--;
|
|
}
|
|
}
|
|
}
|
|
hasNext() {
|
|
return !this._initialized || this._itemsRemainingInBlock > 0;
|
|
}
|
|
async *parseObjects(options = {}) {
|
|
if (!this._initialized) {
|
|
await this.initialize(options);
|
|
}
|
|
while (this.hasNext()) {
|
|
const result = await this._itemType.read(this._dataStream, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
this._itemsRemainingInBlock--;
|
|
this._objectIndex++;
|
|
if (this._itemsRemainingInBlock === 0) {
|
|
const marker = await AvroParser.readFixedBytes(this._dataStream, AVRO_SYNC_MARKER_SIZE, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
this._blockOffset = this._initialBlockOffset + this._dataStream.position;
|
|
this._objectIndex = 0;
|
|
if (!arraysEqual(this._syncMarker, marker)) {
|
|
throw new Error("Stream is not a valid Avro file.");
|
|
}
|
|
try {
|
|
this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
}
|
|
catch {
|
|
// We hit the end of the stream.
|
|
this._itemsRemainingInBlock = 0;
|
|
}
|
|
if (this._itemsRemainingInBlock > 0) {
|
|
// Ignore block size
|
|
await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal });
|
|
}
|
|
}
|
|
yield result;
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=AvroReader.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/AvroReadable.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
class AvroReadable {
|
|
}
|
|
//# sourceMappingURL=AvroReadable.js.map
|
|
// EXTERNAL MODULE: external "buffer"
|
|
var external_buffer_ = __webpack_require__(181);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/AvroReadableFromStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
const ABORT_ERROR = new AbortError_AbortError("Reading from the avro stream was aborted.");
|
|
class AvroReadableFromStream extends AvroReadable {
|
|
_position;
|
|
_readable;
|
|
toUint8Array(data) {
|
|
if (typeof data === "string") {
|
|
return external_buffer_.Buffer.from(data);
|
|
}
|
|
return data;
|
|
}
|
|
constructor(readable) {
|
|
super();
|
|
this._readable = readable;
|
|
this._position = 0;
|
|
}
|
|
get position() {
|
|
return this._position;
|
|
}
|
|
async read(size, options = {}) {
|
|
if (options.abortSignal?.aborted) {
|
|
throw ABORT_ERROR;
|
|
}
|
|
if (size < 0) {
|
|
throw new Error(`size parameter should be positive: ${size}`);
|
|
}
|
|
if (size === 0) {
|
|
return new Uint8Array();
|
|
}
|
|
if (!this._readable.readable) {
|
|
throw new Error("Stream no longer readable.");
|
|
}
|
|
// See if there is already enough data.
|
|
const chunk = this._readable.read(size);
|
|
if (chunk) {
|
|
this._position += chunk.length;
|
|
// chunk.length maybe less than desired size if the stream ends.
|
|
return this.toUint8Array(chunk);
|
|
}
|
|
else {
|
|
// register callback to wait for enough data to read
|
|
return new Promise((resolve, reject) => {
|
|
/* eslint-disable @typescript-eslint/no-use-before-define */
|
|
const cleanUp = () => {
|
|
this._readable.removeListener("readable", readableCallback);
|
|
this._readable.removeListener("error", rejectCallback);
|
|
this._readable.removeListener("end", rejectCallback);
|
|
this._readable.removeListener("close", rejectCallback);
|
|
if (options.abortSignal) {
|
|
options.abortSignal.removeEventListener("abort", abortHandler);
|
|
}
|
|
};
|
|
const readableCallback = () => {
|
|
const callbackChunk = this._readable.read(size);
|
|
if (callbackChunk) {
|
|
this._position += callbackChunk.length;
|
|
cleanUp();
|
|
// callbackChunk.length maybe less than desired size if the stream ends.
|
|
resolve(this.toUint8Array(callbackChunk));
|
|
}
|
|
};
|
|
const rejectCallback = () => {
|
|
cleanUp();
|
|
reject();
|
|
};
|
|
const abortHandler = () => {
|
|
cleanUp();
|
|
reject(ABORT_ERROR);
|
|
};
|
|
this._readable.on("readable", readableCallback);
|
|
this._readable.once("error", rejectCallback);
|
|
this._readable.once("end", rejectCallback);
|
|
this._readable.once("close", rejectCallback);
|
|
if (options.abortSignal) {
|
|
options.abortSignal.addEventListener("abort", abortHandler);
|
|
}
|
|
/* eslint-enable @typescript-eslint/no-use-before-define */
|
|
});
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=AvroReadableFromStream.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/internal-avro/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/BlobQuickQueryStream.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* A Node.js BlobQuickQueryStream will internally parse avro data stream for blob query.
|
|
*/
|
|
class BlobQuickQueryStream extends external_node_stream_.Readable {
|
|
source;
|
|
avroReader;
|
|
avroIter;
|
|
avroPaused = true;
|
|
onProgress;
|
|
onError;
|
|
/**
|
|
* Creates an instance of BlobQuickQueryStream.
|
|
*
|
|
* @param source - The current ReadableStream returned from getter
|
|
* @param options -
|
|
*/
|
|
constructor(source, options = {}) {
|
|
super();
|
|
this.source = source;
|
|
this.onProgress = options.onProgress;
|
|
this.onError = options.onError;
|
|
this.avroReader = new AvroReader(new AvroReadableFromStream(this.source));
|
|
this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal });
|
|
}
|
|
_read() {
|
|
if (this.avroPaused) {
|
|
this.readInternal().catch((err) => {
|
|
this.emit("error", err);
|
|
});
|
|
}
|
|
}
|
|
async readInternal() {
|
|
this.avroPaused = false;
|
|
let avroNext;
|
|
do {
|
|
avroNext = await this.avroIter.next();
|
|
if (avroNext.done) {
|
|
break;
|
|
}
|
|
const obj = avroNext.value;
|
|
const schema = obj.$schema;
|
|
if (typeof schema !== "string") {
|
|
throw Error("Missing schema in avro record.");
|
|
}
|
|
switch (schema) {
|
|
case "com.microsoft.azure.storage.queryBlobContents.resultData":
|
|
{
|
|
const data = obj.data;
|
|
if (data instanceof Uint8Array === false) {
|
|
throw Error("Invalid data in avro result record.");
|
|
}
|
|
if (!this.push(Buffer.from(data))) {
|
|
this.avroPaused = true;
|
|
}
|
|
}
|
|
break;
|
|
case "com.microsoft.azure.storage.queryBlobContents.progress":
|
|
{
|
|
const bytesScanned = obj.bytesScanned;
|
|
if (typeof bytesScanned !== "number") {
|
|
throw Error("Invalid bytesScanned in avro progress record.");
|
|
}
|
|
if (this.onProgress) {
|
|
this.onProgress({ loadedBytes: bytesScanned });
|
|
}
|
|
}
|
|
break;
|
|
case "com.microsoft.azure.storage.queryBlobContents.end":
|
|
if (this.onProgress) {
|
|
const totalBytes = obj.totalBytes;
|
|
if (typeof totalBytes !== "number") {
|
|
throw Error("Invalid totalBytes in avro end record.");
|
|
}
|
|
this.onProgress({ loadedBytes: totalBytes });
|
|
}
|
|
this.push(null);
|
|
break;
|
|
case "com.microsoft.azure.storage.queryBlobContents.error":
|
|
if (this.onError) {
|
|
const fatal = obj.fatal;
|
|
if (typeof fatal !== "boolean") {
|
|
throw Error("Invalid fatal in avro error record.");
|
|
}
|
|
const name = obj.name;
|
|
if (typeof name !== "string") {
|
|
throw Error("Invalid name in avro error record.");
|
|
}
|
|
const description = obj.description;
|
|
if (typeof description !== "string") {
|
|
throw Error("Invalid description in avro error record.");
|
|
}
|
|
const position = obj.position;
|
|
if (typeof position !== "number") {
|
|
throw Error("Invalid position in avro error record.");
|
|
}
|
|
this.onError({
|
|
position,
|
|
name,
|
|
isFatal: fatal,
|
|
description,
|
|
});
|
|
}
|
|
break;
|
|
default:
|
|
throw Error(`Unknown schema ${schema} in avro progress record.`);
|
|
}
|
|
} while (!avroNext.done && !this.avroPaused);
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobQuickQueryStream.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobQueryResponse.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will
|
|
* parse avro data returned by blob query.
|
|
*/
|
|
class BlobQueryResponse {
|
|
/**
|
|
* Indicates that the service supports
|
|
* requests for partial file content.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get acceptRanges() {
|
|
return this.originalResponse.acceptRanges;
|
|
}
|
|
/**
|
|
* Returns if it was previously specified
|
|
* for the file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get cacheControl() {
|
|
return this.originalResponse.cacheControl;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the 'x-ms-content-disposition' header and specifies how to process the
|
|
* response.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentDisposition() {
|
|
return this.originalResponse.contentDisposition;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the Content-Encoding request header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentEncoding() {
|
|
return this.originalResponse.contentEncoding;
|
|
}
|
|
/**
|
|
* Returns the value that was specified
|
|
* for the Content-Language request header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentLanguage() {
|
|
return this.originalResponse.contentLanguage;
|
|
}
|
|
/**
|
|
* The current sequence number for a
|
|
* page blob. This header is not returned for block blobs or append blobs.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobSequenceNumber() {
|
|
return this.originalResponse.blobSequenceNumber;
|
|
}
|
|
/**
|
|
* The blob's type. Possible values include:
|
|
* 'BlockBlob', 'PageBlob', 'AppendBlob'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobType() {
|
|
return this.originalResponse.blobType;
|
|
}
|
|
/**
|
|
* The number of bytes present in the
|
|
* response body.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentLength() {
|
|
return this.originalResponse.contentLength;
|
|
}
|
|
/**
|
|
* If the file has an MD5 hash and the
|
|
* request is to read the full file, this response header is returned so that
|
|
* the client can check for message content integrity. If the request is to
|
|
* read a specified range and the 'x-ms-range-get-content-md5' is set to
|
|
* true, then the request returns an MD5 hash for the range, as long as the
|
|
* range size is less than or equal to 4 MB. If neither of these sets of
|
|
* conditions is true, then no value is returned for the 'Content-MD5'
|
|
* header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentMD5() {
|
|
return this.originalResponse.contentMD5;
|
|
}
|
|
/**
|
|
* Indicates the range of bytes returned if
|
|
* the client requested a subset of the file by setting the Range request
|
|
* header.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentRange() {
|
|
return this.originalResponse.contentRange;
|
|
}
|
|
/**
|
|
* The content type specified for the file.
|
|
* The default content type is 'application/octet-stream'
|
|
*
|
|
* @readonly
|
|
*/
|
|
get contentType() {
|
|
return this.originalResponse.contentType;
|
|
}
|
|
/**
|
|
* Conclusion time of the last attempted
|
|
* Copy File operation where this file was the destination file. This value
|
|
* can specify the time of a completed, aborted, or failed copy attempt.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyCompletedOn() {
|
|
return undefined;
|
|
}
|
|
/**
|
|
* String identifier for the last attempted Copy
|
|
* File operation where this file was the destination file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyId() {
|
|
return this.originalResponse.copyId;
|
|
}
|
|
/**
|
|
* Contains the number of bytes copied and
|
|
* the total bytes in the source in the last attempted Copy File operation
|
|
* where this file was the destination file. Can show between 0 and
|
|
* Content-Length bytes copied.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyProgress() {
|
|
return this.originalResponse.copyProgress;
|
|
}
|
|
/**
|
|
* URL up to 2KB in length that specifies the
|
|
* source file used in the last attempted Copy File operation where this file
|
|
* was the destination file.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copySource() {
|
|
return this.originalResponse.copySource;
|
|
}
|
|
/**
|
|
* State of the copy operation
|
|
* identified by 'x-ms-copy-id'. Possible values include: 'pending',
|
|
* 'success', 'aborted', 'failed'
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyStatus() {
|
|
return this.originalResponse.copyStatus;
|
|
}
|
|
/**
|
|
* Only appears when
|
|
* x-ms-copy-status is failed or pending. Describes cause of fatal or
|
|
* non-fatal copy operation failure.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get copyStatusDescription() {
|
|
return this.originalResponse.copyStatusDescription;
|
|
}
|
|
/**
|
|
* When a blob is leased,
|
|
* specifies whether the lease is of infinite or fixed duration. Possible
|
|
* values include: 'infinite', 'fixed'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseDuration() {
|
|
return this.originalResponse.leaseDuration;
|
|
}
|
|
/**
|
|
* Lease state of the blob. Possible
|
|
* values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseState() {
|
|
return this.originalResponse.leaseState;
|
|
}
|
|
/**
|
|
* The current lease status of the
|
|
* blob. Possible values include: 'locked', 'unlocked'.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get leaseStatus() {
|
|
return this.originalResponse.leaseStatus;
|
|
}
|
|
/**
|
|
* A UTC date/time value generated by the service that
|
|
* indicates the time at which the response was initiated.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get date() {
|
|
return this.originalResponse.date;
|
|
}
|
|
/**
|
|
* The number of committed blocks
|
|
* present in the blob. This header is returned only for append blobs.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobCommittedBlockCount() {
|
|
return this.originalResponse.blobCommittedBlockCount;
|
|
}
|
|
/**
|
|
* The ETag contains a value that you can use to
|
|
* perform operations conditionally, in quotes.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get etag() {
|
|
return this.originalResponse.etag;
|
|
}
|
|
/**
|
|
* The error code.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get errorCode() {
|
|
return this.originalResponse.errorCode;
|
|
}
|
|
/**
|
|
* The value of this header is set to
|
|
* true if the file data and application metadata are completely encrypted
|
|
* using the specified algorithm. Otherwise, the value is set to false (when
|
|
* the file is unencrypted, or if only parts of the file/application metadata
|
|
* are encrypted).
|
|
*
|
|
* @readonly
|
|
*/
|
|
get isServerEncrypted() {
|
|
return this.originalResponse.isServerEncrypted;
|
|
}
|
|
/**
|
|
* If the blob has a MD5 hash, and if
|
|
* request contains range header (Range or x-ms-range), this response header
|
|
* is returned with the value of the whole blob's MD5 value. This value may
|
|
* or may not be equal to the value returned in Content-MD5 header, with the
|
|
* latter calculated from the requested range.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobContentMD5() {
|
|
return this.originalResponse.blobContentMD5;
|
|
}
|
|
/**
|
|
* Returns the date and time the file was last
|
|
* modified. Any operation that modifies the file or its properties updates
|
|
* the last modified time.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get lastModified() {
|
|
return this.originalResponse.lastModified;
|
|
}
|
|
/**
|
|
* A name-value pair
|
|
* to associate with a file storage object.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get metadata() {
|
|
return this.originalResponse.metadata;
|
|
}
|
|
/**
|
|
* This header uniquely identifies the request
|
|
* that was made and can be used for troubleshooting the request.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get requestId() {
|
|
return this.originalResponse.requestId;
|
|
}
|
|
/**
|
|
* If a client request id header is sent in the request, this header will be present in the
|
|
* response with the same value.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get clientRequestId() {
|
|
return this.originalResponse.clientRequestId;
|
|
}
|
|
/**
|
|
* Indicates the version of the File service used
|
|
* to execute the request.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get version() {
|
|
return this.originalResponse.version;
|
|
}
|
|
/**
|
|
* The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
|
|
* when the blob was encrypted with a customer-provided key.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get encryptionKeySha256() {
|
|
return this.originalResponse.encryptionKeySha256;
|
|
}
|
|
/**
|
|
* If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
|
|
* true, then the request returns a crc64 for the range, as long as the range size is less than
|
|
* or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
|
|
* specified in the same request, it will fail with 400(Bad Request)
|
|
*/
|
|
get contentCrc64() {
|
|
return this.originalResponse.contentCrc64;
|
|
}
|
|
/**
|
|
* The response body as a browser Blob.
|
|
* Always undefined in node.js.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get blobBody() {
|
|
return undefined;
|
|
}
|
|
/**
|
|
* The response body as a node.js Readable stream.
|
|
* Always undefined in the browser.
|
|
*
|
|
* It will parse avor data returned by blob query.
|
|
*
|
|
* @readonly
|
|
*/
|
|
get readableStreamBody() {
|
|
return esm_isNodeLike ? this.blobDownloadStream : undefined;
|
|
}
|
|
/**
|
|
* The HTTP response.
|
|
*/
|
|
get _response() {
|
|
return this.originalResponse._response;
|
|
}
|
|
originalResponse;
|
|
blobDownloadStream;
|
|
/**
|
|
* Creates an instance of BlobQueryResponse.
|
|
*
|
|
* @param originalResponse -
|
|
* @param options -
|
|
*/
|
|
constructor(originalResponse, options = {}) {
|
|
this.originalResponse = originalResponse;
|
|
this.blobDownloadStream = new BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobQueryResponse.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/models.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
/**
|
|
* Represents the access tier on a blob.
|
|
* For detailed information about block blob level tiering see {@link https://learn.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}
|
|
*/
|
|
var BlockBlobTier;
|
|
(function (BlockBlobTier) {
|
|
/**
|
|
* Optimized for storing data that is accessed frequently.
|
|
*/
|
|
BlockBlobTier["Hot"] = "Hot";
|
|
/**
|
|
* Optimized for storing data that is infrequently accessed and stored for at least 30 days.
|
|
*/
|
|
BlockBlobTier["Cool"] = "Cool";
|
|
/**
|
|
* Optimized for storing data that is rarely accessed.
|
|
*/
|
|
BlockBlobTier["Cold"] = "Cold";
|
|
/**
|
|
* Optimized for storing data that is rarely accessed and stored for at least 180 days
|
|
* with flexible latency requirements (on the order of hours).
|
|
*/
|
|
BlockBlobTier["Archive"] = "Archive";
|
|
})(BlockBlobTier || (BlockBlobTier = {}));
|
|
/**
|
|
* Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.
|
|
* Please see {@link https://learn.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}
|
|
* for detailed information on the corresponding IOPS and throughput per PageBlobTier.
|
|
*/
|
|
var PremiumPageBlobTier;
|
|
(function (PremiumPageBlobTier) {
|
|
/**
|
|
* P4 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P4"] = "P4";
|
|
/**
|
|
* P6 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P6"] = "P6";
|
|
/**
|
|
* P10 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P10"] = "P10";
|
|
/**
|
|
* P15 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P15"] = "P15";
|
|
/**
|
|
* P20 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P20"] = "P20";
|
|
/**
|
|
* P30 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P30"] = "P30";
|
|
/**
|
|
* P40 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P40"] = "P40";
|
|
/**
|
|
* P50 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P50"] = "P50";
|
|
/**
|
|
* P60 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P60"] = "P60";
|
|
/**
|
|
* P70 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P70"] = "P70";
|
|
/**
|
|
* P80 Tier.
|
|
*/
|
|
PremiumPageBlobTier["P80"] = "P80";
|
|
})(PremiumPageBlobTier || (PremiumPageBlobTier = {}));
|
|
function toAccessTier(tier) {
|
|
if (tier === undefined) {
|
|
return undefined;
|
|
}
|
|
return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).
|
|
}
|
|
function ensureCpkIfSpecified(cpk, isHttps) {
|
|
if (cpk && !isHttps) {
|
|
throw new RangeError("Customer-provided encryption key must be used over HTTPS.");
|
|
}
|
|
if (cpk && !cpk.encryptionAlgorithm) {
|
|
cpk.encryptionAlgorithm = EncryptionAlgorithmAES25;
|
|
}
|
|
}
|
|
/**
|
|
* Defines the known cloud audiences for Storage.
|
|
*/
|
|
var StorageBlobAudience;
|
|
(function (StorageBlobAudience) {
|
|
/**
|
|
* The OAuth scope to use to retrieve an AAD token for Azure Storage.
|
|
*/
|
|
StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";
|
|
/**
|
|
* The OAuth scope to use to retrieve an AAD token for Azure Disk.
|
|
*/
|
|
StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";
|
|
})(StorageBlobAudience || (StorageBlobAudience = {}));
|
|
/**
|
|
*
|
|
* To get OAuth audience for a storage account for blob service.
|
|
*/
|
|
function getBlobServiceAccountAudience(storageAccountName) {
|
|
return `https://${storageAccountName}.blob.core.windows.net/.default`;
|
|
}
|
|
//# sourceMappingURL=models.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/PageBlobRangeResponse.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Function that converts PageRange and ClearRange to a common Range object.
|
|
* PageRange and ClearRange have start and end while Range offset and count
|
|
* this function normalizes to Range.
|
|
* @param response - Model PageBlob Range response
|
|
*/
|
|
function rangeResponseFromModel(response) {
|
|
const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({
|
|
offset: x.start,
|
|
count: x.end - x.start,
|
|
}));
|
|
const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({
|
|
offset: x.start,
|
|
count: x.end - x.start,
|
|
}));
|
|
return {
|
|
...response,
|
|
pageRange,
|
|
clearRange,
|
|
_response: {
|
|
...response._response,
|
|
parsedBody: {
|
|
pageRange,
|
|
clearRange,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=PageBlobRangeResponse.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/logger.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
/**
|
|
* The `@azure/logger` configuration for this package.
|
|
* @internal
|
|
*/
|
|
const logger_logger = esm_createClientLogger("core-lro");
|
|
//# sourceMappingURL=logger.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/constants.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
/**
|
|
* The default time interval to wait before sending the next polling request.
|
|
*/
|
|
const constants_POLL_INTERVAL_IN_MS = 2000;
|
|
/**
|
|
* The closed set of terminal states.
|
|
*/
|
|
const terminalStates = ["succeeded", "canceled", "failed"];
|
|
//# sourceMappingURL=constants.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/operation.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
/**
|
|
* Deserializes the state
|
|
*/
|
|
function operation_deserializeState(serializedState) {
|
|
try {
|
|
return JSON.parse(serializedState).state;
|
|
}
|
|
catch (e) {
|
|
throw new Error(`Unable to deserialize input state: ${serializedState}`);
|
|
}
|
|
}
|
|
function setStateError(inputs) {
|
|
const { state, stateProxy, isOperationError } = inputs;
|
|
return (error) => {
|
|
if (isOperationError(error)) {
|
|
stateProxy.setError(state, error);
|
|
stateProxy.setFailed(state);
|
|
}
|
|
throw error;
|
|
};
|
|
}
|
|
function appendReadableErrorMessage(currentMessage, innerMessage) {
|
|
let message = currentMessage;
|
|
if (message.slice(-1) !== ".") {
|
|
message = message + ".";
|
|
}
|
|
return message + " " + innerMessage;
|
|
}
|
|
function simplifyError(err) {
|
|
let message = err.message;
|
|
let code = err.code;
|
|
let curErr = err;
|
|
while (curErr.innererror) {
|
|
curErr = curErr.innererror;
|
|
code = curErr.code;
|
|
message = appendReadableErrorMessage(message, curErr.message);
|
|
}
|
|
return {
|
|
code,
|
|
message,
|
|
};
|
|
}
|
|
function processOperationStatus(result) {
|
|
const { state, stateProxy, status, isDone, processResult, getError, response, setErrorAsResult } = result;
|
|
switch (status) {
|
|
case "succeeded": {
|
|
stateProxy.setSucceeded(state);
|
|
break;
|
|
}
|
|
case "failed": {
|
|
const err = getError === null || getError === void 0 ? void 0 : getError(response);
|
|
let postfix = "";
|
|
if (err) {
|
|
const { code, message } = simplifyError(err);
|
|
postfix = `. ${code}. ${message}`;
|
|
}
|
|
const errStr = `The long-running operation has failed${postfix}`;
|
|
stateProxy.setError(state, new Error(errStr));
|
|
stateProxy.setFailed(state);
|
|
logger_logger.warning(errStr);
|
|
break;
|
|
}
|
|
case "canceled": {
|
|
stateProxy.setCanceled(state);
|
|
break;
|
|
}
|
|
}
|
|
if ((isDone === null || isDone === void 0 ? void 0 : isDone(response, state)) ||
|
|
(isDone === undefined &&
|
|
["succeeded", "canceled"].concat(setErrorAsResult ? [] : ["failed"]).includes(status))) {
|
|
stateProxy.setResult(state, buildResult({
|
|
response,
|
|
state,
|
|
processResult,
|
|
}));
|
|
}
|
|
}
|
|
function buildResult(inputs) {
|
|
const { processResult, response, state } = inputs;
|
|
return processResult ? processResult(response, state) : response;
|
|
}
|
|
/**
|
|
* Initiates the long-running operation.
|
|
*/
|
|
async function operation_initOperation(inputs) {
|
|
const { init, stateProxy, processResult, getOperationStatus, withOperationLocation, setErrorAsResult, } = inputs;
|
|
const { operationLocation, resourceLocation, metadata, response } = await init();
|
|
if (operationLocation)
|
|
withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
|
|
const config = {
|
|
metadata,
|
|
operationLocation,
|
|
resourceLocation,
|
|
};
|
|
logger_logger.verbose(`LRO: Operation description:`, config);
|
|
const state = stateProxy.initState(config);
|
|
const status = getOperationStatus({ response, state, operationLocation });
|
|
processOperationStatus({ state, status, stateProxy, response, setErrorAsResult, processResult });
|
|
return state;
|
|
}
|
|
async function pollOperationHelper(inputs) {
|
|
const { poll, state, stateProxy, operationLocation, getOperationStatus, getResourceLocation, isOperationError, options, } = inputs;
|
|
const response = await poll(operationLocation, options).catch(setStateError({
|
|
state,
|
|
stateProxy,
|
|
isOperationError,
|
|
}));
|
|
const status = getOperationStatus(response, state);
|
|
logger_logger.verbose(`LRO: Status:\n\tPolling from: ${state.config.operationLocation}\n\tOperation status: ${status}\n\tPolling status: ${terminalStates.includes(status) ? "Stopped" : "Running"}`);
|
|
if (status === "succeeded") {
|
|
const resourceLocation = getResourceLocation(response, state);
|
|
if (resourceLocation !== undefined) {
|
|
return {
|
|
response: await poll(resourceLocation).catch(setStateError({ state, stateProxy, isOperationError })),
|
|
status,
|
|
};
|
|
}
|
|
}
|
|
return { response, status };
|
|
}
|
|
/** Polls the long-running operation. */
|
|
async function operation_pollOperation(inputs) {
|
|
const { poll, state, stateProxy, options, getOperationStatus, getResourceLocation, getOperationLocation, isOperationError, withOperationLocation, getPollingInterval, processResult, getError, updateState, setDelay, isDone, setErrorAsResult, } = inputs;
|
|
const { operationLocation } = state.config;
|
|
if (operationLocation !== undefined) {
|
|
const { response, status } = await pollOperationHelper({
|
|
poll,
|
|
getOperationStatus,
|
|
state,
|
|
stateProxy,
|
|
operationLocation,
|
|
getResourceLocation,
|
|
isOperationError,
|
|
options,
|
|
});
|
|
processOperationStatus({
|
|
status,
|
|
response,
|
|
state,
|
|
stateProxy,
|
|
isDone,
|
|
processResult,
|
|
getError,
|
|
setErrorAsResult,
|
|
});
|
|
if (!terminalStates.includes(status)) {
|
|
const intervalInMs = getPollingInterval === null || getPollingInterval === void 0 ? void 0 : getPollingInterval(response);
|
|
if (intervalInMs)
|
|
setDelay(intervalInMs);
|
|
const location = getOperationLocation === null || getOperationLocation === void 0 ? void 0 : getOperationLocation(response, state);
|
|
if (location !== undefined) {
|
|
const isUpdated = operationLocation !== location;
|
|
state.config.operationLocation = location;
|
|
withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(location, isUpdated);
|
|
}
|
|
else
|
|
withOperationLocation === null || withOperationLocation === void 0 ? void 0 : withOperationLocation(operationLocation, false);
|
|
}
|
|
updateState === null || updateState === void 0 ? void 0 : updateState(state, response);
|
|
}
|
|
}
|
|
//# sourceMappingURL=operation.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/http/operation.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
function getOperationLocationPollingUrl(inputs) {
|
|
const { azureAsyncOperation, operationLocation } = inputs;
|
|
return operationLocation !== null && operationLocation !== void 0 ? operationLocation : azureAsyncOperation;
|
|
}
|
|
function getLocationHeader(rawResponse) {
|
|
return rawResponse.headers["location"];
|
|
}
|
|
function getOperationLocationHeader(rawResponse) {
|
|
return rawResponse.headers["operation-location"];
|
|
}
|
|
function getAzureAsyncOperationHeader(rawResponse) {
|
|
return rawResponse.headers["azure-asyncoperation"];
|
|
}
|
|
function findResourceLocation(inputs) {
|
|
var _a;
|
|
const { location, requestMethod, requestPath, resourceLocationConfig } = inputs;
|
|
switch (requestMethod) {
|
|
case "PUT": {
|
|
return requestPath;
|
|
}
|
|
case "DELETE": {
|
|
return undefined;
|
|
}
|
|
case "PATCH": {
|
|
return (_a = getDefault()) !== null && _a !== void 0 ? _a : requestPath;
|
|
}
|
|
default: {
|
|
return getDefault();
|
|
}
|
|
}
|
|
function getDefault() {
|
|
switch (resourceLocationConfig) {
|
|
case "azure-async-operation": {
|
|
return undefined;
|
|
}
|
|
case "original-uri": {
|
|
return requestPath;
|
|
}
|
|
case "location":
|
|
default: {
|
|
return location;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function operation_inferLroMode(inputs) {
|
|
const { rawResponse, requestMethod, requestPath, resourceLocationConfig } = inputs;
|
|
const operationLocation = getOperationLocationHeader(rawResponse);
|
|
const azureAsyncOperation = getAzureAsyncOperationHeader(rawResponse);
|
|
const pollingUrl = getOperationLocationPollingUrl({ operationLocation, azureAsyncOperation });
|
|
const location = getLocationHeader(rawResponse);
|
|
const normalizedRequestMethod = requestMethod === null || requestMethod === void 0 ? void 0 : requestMethod.toLocaleUpperCase();
|
|
if (pollingUrl !== undefined) {
|
|
return {
|
|
mode: "OperationLocation",
|
|
operationLocation: pollingUrl,
|
|
resourceLocation: findResourceLocation({
|
|
requestMethod: normalizedRequestMethod,
|
|
location,
|
|
requestPath,
|
|
resourceLocationConfig,
|
|
}),
|
|
};
|
|
}
|
|
else if (location !== undefined) {
|
|
return {
|
|
mode: "ResourceLocation",
|
|
operationLocation: location,
|
|
};
|
|
}
|
|
else if (normalizedRequestMethod === "PUT" && requestPath) {
|
|
return {
|
|
mode: "Body",
|
|
operationLocation: requestPath,
|
|
};
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
function transformStatus(inputs) {
|
|
const { status, statusCode } = inputs;
|
|
if (typeof status !== "string" && status !== undefined) {
|
|
throw new Error(`Polling was unsuccessful. Expected status to have a string value or no value but it has instead: ${status}. This doesn't necessarily indicate the operation has failed. Check your Azure subscription or resource status for more information.`);
|
|
}
|
|
switch (status === null || status === void 0 ? void 0 : status.toLocaleLowerCase()) {
|
|
case undefined:
|
|
return toOperationStatus(statusCode);
|
|
case "succeeded":
|
|
return "succeeded";
|
|
case "failed":
|
|
return "failed";
|
|
case "running":
|
|
case "accepted":
|
|
case "started":
|
|
case "canceling":
|
|
case "cancelling":
|
|
return "running";
|
|
case "canceled":
|
|
case "cancelled":
|
|
return "canceled";
|
|
default: {
|
|
logger_logger.verbose(`LRO: unrecognized operation status: ${status}`);
|
|
return status;
|
|
}
|
|
}
|
|
}
|
|
function getStatus(rawResponse) {
|
|
var _a;
|
|
const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
|
|
return transformStatus({ status, statusCode: rawResponse.statusCode });
|
|
}
|
|
function getProvisioningState(rawResponse) {
|
|
var _a, _b;
|
|
const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
|
|
const status = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;
|
|
return transformStatus({ status, statusCode: rawResponse.statusCode });
|
|
}
|
|
function toOperationStatus(statusCode) {
|
|
if (statusCode === 202) {
|
|
return "running";
|
|
}
|
|
else if (statusCode < 300) {
|
|
return "succeeded";
|
|
}
|
|
else {
|
|
return "failed";
|
|
}
|
|
}
|
|
function operation_parseRetryAfter({ rawResponse }) {
|
|
const retryAfter = rawResponse.headers["retry-after"];
|
|
if (retryAfter !== undefined) {
|
|
// Retry-After header value is either in HTTP date format, or in seconds
|
|
const retryAfterInSeconds = parseInt(retryAfter);
|
|
return isNaN(retryAfterInSeconds)
|
|
? calculatePollingIntervalFromDate(new Date(retryAfter))
|
|
: retryAfterInSeconds * 1000;
|
|
}
|
|
return undefined;
|
|
}
|
|
function operation_getErrorFromResponse(response) {
|
|
const error = accessBodyProperty(response, "error");
|
|
if (!error) {
|
|
logger_logger.warning(`The long-running operation failed but there is no error property in the response's body`);
|
|
return;
|
|
}
|
|
if (!error.code || !error.message) {
|
|
logger_logger.warning(`The long-running operation failed but the error property in the response's body doesn't contain code or message`);
|
|
return;
|
|
}
|
|
return error;
|
|
}
|
|
function calculatePollingIntervalFromDate(retryAfterDate) {
|
|
const timeNow = Math.floor(new Date().getTime());
|
|
const retryAfterTime = retryAfterDate.getTime();
|
|
if (timeNow < retryAfterTime) {
|
|
return retryAfterTime - timeNow;
|
|
}
|
|
return undefined;
|
|
}
|
|
function operation_getStatusFromInitialResponse(inputs) {
|
|
const { response, state, operationLocation } = inputs;
|
|
function helper() {
|
|
var _a;
|
|
const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
|
|
switch (mode) {
|
|
case undefined:
|
|
return toOperationStatus(response.rawResponse.statusCode);
|
|
case "Body":
|
|
return operation_getOperationStatus(response, state);
|
|
default:
|
|
return "running";
|
|
}
|
|
}
|
|
const status = helper();
|
|
return status === "running" && operationLocation === undefined ? "succeeded" : status;
|
|
}
|
|
/**
|
|
* Initiates the long-running operation.
|
|
*/
|
|
async function initHttpOperation(inputs) {
|
|
const { stateProxy, resourceLocationConfig, processResult, lro, setErrorAsResult } = inputs;
|
|
return operation_initOperation({
|
|
init: async () => {
|
|
const response = await lro.sendInitialRequest();
|
|
const config = operation_inferLroMode({
|
|
rawResponse: response.rawResponse,
|
|
requestPath: lro.requestPath,
|
|
requestMethod: lro.requestMethod,
|
|
resourceLocationConfig,
|
|
});
|
|
return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
|
|
},
|
|
stateProxy,
|
|
processResult: processResult
|
|
? ({ flatResponse }, state) => processResult(flatResponse, state)
|
|
: ({ flatResponse }) => flatResponse,
|
|
getOperationStatus: operation_getStatusFromInitialResponse,
|
|
setErrorAsResult,
|
|
});
|
|
}
|
|
function operation_getOperationLocation({ rawResponse }, state) {
|
|
var _a;
|
|
const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
|
|
switch (mode) {
|
|
case "OperationLocation": {
|
|
return getOperationLocationPollingUrl({
|
|
operationLocation: getOperationLocationHeader(rawResponse),
|
|
azureAsyncOperation: getAzureAsyncOperationHeader(rawResponse),
|
|
});
|
|
}
|
|
case "ResourceLocation": {
|
|
return getLocationHeader(rawResponse);
|
|
}
|
|
case "Body":
|
|
default: {
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
function operation_getOperationStatus({ rawResponse }, state) {
|
|
var _a;
|
|
const mode = (_a = state.config.metadata) === null || _a === void 0 ? void 0 : _a["mode"];
|
|
switch (mode) {
|
|
case "OperationLocation": {
|
|
return getStatus(rawResponse);
|
|
}
|
|
case "ResourceLocation": {
|
|
return toOperationStatus(rawResponse.statusCode);
|
|
}
|
|
case "Body": {
|
|
return getProvisioningState(rawResponse);
|
|
}
|
|
default:
|
|
throw new Error(`Internal error: Unexpected operation mode: ${mode}`);
|
|
}
|
|
}
|
|
function accessBodyProperty({ flatResponse, rawResponse }, prop) {
|
|
var _a, _b;
|
|
return (_a = flatResponse === null || flatResponse === void 0 ? void 0 : flatResponse[prop]) !== null && _a !== void 0 ? _a : (_b = rawResponse.body) === null || _b === void 0 ? void 0 : _b[prop];
|
|
}
|
|
function operation_getResourceLocation(res, state) {
|
|
const loc = accessBodyProperty(res, "resourceLocation");
|
|
if (loc && typeof loc === "string") {
|
|
state.config.resourceLocation = loc;
|
|
}
|
|
return state.config.resourceLocation;
|
|
}
|
|
function operation_isOperationError(e) {
|
|
return e.name === "RestError";
|
|
}
|
|
/** Polls the long-running operation. */
|
|
async function pollHttpOperation(inputs) {
|
|
const { lro, stateProxy, options, processResult, updateState, setDelay, state, setErrorAsResult, } = inputs;
|
|
return operation_pollOperation({
|
|
state,
|
|
stateProxy,
|
|
setDelay,
|
|
processResult: processResult
|
|
? ({ flatResponse }, inputState) => processResult(flatResponse, inputState)
|
|
: ({ flatResponse }) => flatResponse,
|
|
getError: operation_getErrorFromResponse,
|
|
updateState,
|
|
getPollingInterval: operation_parseRetryAfter,
|
|
getOperationLocation: operation_getOperationLocation,
|
|
getOperationStatus: operation_getOperationStatus,
|
|
isOperationError: operation_isOperationError,
|
|
getResourceLocation: operation_getResourceLocation,
|
|
options,
|
|
/**
|
|
* The expansion here is intentional because `lro` could be an object that
|
|
* references an inner this, so we need to preserve a reference to it.
|
|
*/
|
|
poll: async (location, inputOptions) => lro.sendPollRequest(location, inputOptions),
|
|
setErrorAsResult,
|
|
});
|
|
}
|
|
//# sourceMappingURL=operation.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/poller/poller.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
|
|
const createStateProxy = () => ({
|
|
/**
|
|
* The state at this point is created to be of type OperationState<TResult>.
|
|
* It will be updated later to be of type TState when the
|
|
* customer-provided callback, `updateState`, is called during polling.
|
|
*/
|
|
initState: (config) => ({ status: "running", config }),
|
|
setCanceled: (state) => (state.status = "canceled"),
|
|
setError: (state, error) => (state.error = error),
|
|
setResult: (state, result) => (state.result = result),
|
|
setRunning: (state) => (state.status = "running"),
|
|
setSucceeded: (state) => (state.status = "succeeded"),
|
|
setFailed: (state) => (state.status = "failed"),
|
|
getError: (state) => state.error,
|
|
getResult: (state) => state.result,
|
|
isCanceled: (state) => state.status === "canceled",
|
|
isFailed: (state) => state.status === "failed",
|
|
isRunning: (state) => state.status === "running",
|
|
isSucceeded: (state) => state.status === "succeeded",
|
|
});
|
|
/**
|
|
* Returns a poller factory.
|
|
*/
|
|
function poller_buildCreatePoller(inputs) {
|
|
const { getOperationLocation, getStatusFromInitialResponse, getStatusFromPollResponse, isOperationError, getResourceLocation, getPollingInterval, getError, resolveOnUnsuccessful, } = inputs;
|
|
return async ({ init, poll }, options) => {
|
|
const { processResult, updateState, withOperationLocation: withOperationLocationCallback, intervalInMs = POLL_INTERVAL_IN_MS, restoreFrom, } = options || {};
|
|
const stateProxy = createStateProxy();
|
|
const withOperationLocation = withOperationLocationCallback
|
|
? (() => {
|
|
let called = false;
|
|
return (operationLocation, isUpdated) => {
|
|
if (isUpdated)
|
|
withOperationLocationCallback(operationLocation);
|
|
else if (!called)
|
|
withOperationLocationCallback(operationLocation);
|
|
called = true;
|
|
};
|
|
})()
|
|
: undefined;
|
|
const state = restoreFrom
|
|
? deserializeState(restoreFrom)
|
|
: await initOperation({
|
|
init,
|
|
stateProxy,
|
|
processResult,
|
|
getOperationStatus: getStatusFromInitialResponse,
|
|
withOperationLocation,
|
|
setErrorAsResult: !resolveOnUnsuccessful,
|
|
});
|
|
let resultPromise;
|
|
const abortController = new AbortController();
|
|
const handlers = new Map();
|
|
const handleProgressEvents = async () => handlers.forEach((h) => h(state));
|
|
const cancelErrMsg = "Operation was canceled";
|
|
let currentPollIntervalInMs = intervalInMs;
|
|
const poller = {
|
|
getOperationState: () => state,
|
|
getResult: () => state.result,
|
|
isDone: () => ["succeeded", "failed", "canceled"].includes(state.status),
|
|
isStopped: () => resultPromise === undefined,
|
|
stopPolling: () => {
|
|
abortController.abort();
|
|
},
|
|
toString: () => JSON.stringify({
|
|
state,
|
|
}),
|
|
onProgress: (callback) => {
|
|
const s = Symbol();
|
|
handlers.set(s, callback);
|
|
return () => handlers.delete(s);
|
|
},
|
|
pollUntilDone: (pollOptions) => (resultPromise !== null && resultPromise !== void 0 ? resultPromise : (resultPromise = (async () => {
|
|
const { abortSignal: inputAbortSignal } = pollOptions || {};
|
|
// In the future we can use AbortSignal.any() instead
|
|
function abortListener() {
|
|
abortController.abort();
|
|
}
|
|
const abortSignal = abortController.signal;
|
|
if (inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.aborted) {
|
|
abortController.abort();
|
|
}
|
|
else if (!abortSignal.aborted) {
|
|
inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.addEventListener("abort", abortListener, { once: true });
|
|
}
|
|
try {
|
|
if (!poller.isDone()) {
|
|
await poller.poll({ abortSignal });
|
|
while (!poller.isDone()) {
|
|
await delay(currentPollIntervalInMs, { abortSignal });
|
|
await poller.poll({ abortSignal });
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
inputAbortSignal === null || inputAbortSignal === void 0 ? void 0 : inputAbortSignal.removeEventListener("abort", abortListener);
|
|
}
|
|
if (resolveOnUnsuccessful) {
|
|
return poller.getResult();
|
|
}
|
|
else {
|
|
switch (state.status) {
|
|
case "succeeded":
|
|
return poller.getResult();
|
|
case "canceled":
|
|
throw new Error(cancelErrMsg);
|
|
case "failed":
|
|
throw state.error;
|
|
case "notStarted":
|
|
case "running":
|
|
throw new Error(`Polling completed without succeeding or failing`);
|
|
}
|
|
}
|
|
})().finally(() => {
|
|
resultPromise = undefined;
|
|
}))),
|
|
async poll(pollOptions) {
|
|
if (resolveOnUnsuccessful) {
|
|
if (poller.isDone())
|
|
return;
|
|
}
|
|
else {
|
|
switch (state.status) {
|
|
case "succeeded":
|
|
return;
|
|
case "canceled":
|
|
throw new Error(cancelErrMsg);
|
|
case "failed":
|
|
throw state.error;
|
|
}
|
|
}
|
|
await pollOperation({
|
|
poll,
|
|
state,
|
|
stateProxy,
|
|
getOperationLocation,
|
|
isOperationError,
|
|
withOperationLocation,
|
|
getPollingInterval,
|
|
getOperationStatus: getStatusFromPollResponse,
|
|
getResourceLocation,
|
|
processResult,
|
|
getError,
|
|
updateState,
|
|
options: pollOptions,
|
|
setDelay: (pollIntervalInMs) => {
|
|
currentPollIntervalInMs = pollIntervalInMs;
|
|
},
|
|
setErrorAsResult: !resolveOnUnsuccessful,
|
|
});
|
|
await handleProgressEvents();
|
|
if (!resolveOnUnsuccessful) {
|
|
switch (state.status) {
|
|
case "canceled":
|
|
throw new Error(cancelErrMsg);
|
|
case "failed":
|
|
throw state.error;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
return poller;
|
|
};
|
|
}
|
|
//# sourceMappingURL=poller.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/http/poller.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
/**
|
|
* Creates a poller that can be used to poll a long-running operation.
|
|
* @param lro - Description of the long-running operation
|
|
* @param options - options to configure the poller
|
|
* @returns an initialized poller
|
|
*/
|
|
async function createHttpPoller(lro, options) {
|
|
const { resourceLocationConfig, intervalInMs, processResult, restoreFrom, updateState, withOperationLocation, resolveOnUnsuccessful = false, } = options || {};
|
|
return buildCreatePoller({
|
|
getStatusFromInitialResponse,
|
|
getStatusFromPollResponse: getOperationStatus,
|
|
isOperationError,
|
|
getOperationLocation,
|
|
getResourceLocation,
|
|
getPollingInterval: parseRetryAfter,
|
|
getError: getErrorFromResponse,
|
|
resolveOnUnsuccessful,
|
|
})({
|
|
init: async () => {
|
|
const response = await lro.sendInitialRequest();
|
|
const config = inferLroMode({
|
|
rawResponse: response.rawResponse,
|
|
requestPath: lro.requestPath,
|
|
requestMethod: lro.requestMethod,
|
|
resourceLocationConfig,
|
|
});
|
|
return Object.assign({ response, operationLocation: config === null || config === void 0 ? void 0 : config.operationLocation, resourceLocation: config === null || config === void 0 ? void 0 : config.resourceLocation }, ((config === null || config === void 0 ? void 0 : config.mode) ? { metadata: { mode: config.mode } } : {}));
|
|
},
|
|
poll: lro.sendPollRequest,
|
|
}, {
|
|
intervalInMs,
|
|
withOperationLocation,
|
|
restoreFrom,
|
|
updateState,
|
|
processResult: processResult
|
|
? ({ flatResponse }, state) => processResult(flatResponse, state)
|
|
: ({ flatResponse }) => flatResponse,
|
|
});
|
|
}
|
|
//# sourceMappingURL=poller.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/operation.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
const operation_createStateProxy = () => ({
|
|
initState: (config) => ({ config, isStarted: true }),
|
|
setCanceled: (state) => (state.isCancelled = true),
|
|
setError: (state, error) => (state.error = error),
|
|
setResult: (state, result) => (state.result = result),
|
|
setRunning: (state) => (state.isStarted = true),
|
|
setSucceeded: (state) => (state.isCompleted = true),
|
|
setFailed: () => {
|
|
/** empty body */
|
|
},
|
|
getError: (state) => state.error,
|
|
getResult: (state) => state.result,
|
|
isCanceled: (state) => !!state.isCancelled,
|
|
isFailed: (state) => !!state.error,
|
|
isRunning: (state) => !!state.isStarted,
|
|
isSucceeded: (state) => Boolean(state.isCompleted && !state.isCancelled && !state.error),
|
|
});
|
|
class GenericPollOperation {
|
|
constructor(state, lro, setErrorAsResult, lroResourceLocationConfig, processResult, updateState, isDone) {
|
|
this.state = state;
|
|
this.lro = lro;
|
|
this.setErrorAsResult = setErrorAsResult;
|
|
this.lroResourceLocationConfig = lroResourceLocationConfig;
|
|
this.processResult = processResult;
|
|
this.updateState = updateState;
|
|
this.isDone = isDone;
|
|
}
|
|
setPollerConfig(pollerConfig) {
|
|
this.pollerConfig = pollerConfig;
|
|
}
|
|
async update(options) {
|
|
var _a;
|
|
const stateProxy = operation_createStateProxy();
|
|
if (!this.state.isStarted) {
|
|
this.state = Object.assign(Object.assign({}, this.state), (await initHttpOperation({
|
|
lro: this.lro,
|
|
stateProxy,
|
|
resourceLocationConfig: this.lroResourceLocationConfig,
|
|
processResult: this.processResult,
|
|
setErrorAsResult: this.setErrorAsResult,
|
|
})));
|
|
}
|
|
const updateState = this.updateState;
|
|
const isDone = this.isDone;
|
|
if (!this.state.isCompleted && this.state.error === undefined) {
|
|
await pollHttpOperation({
|
|
lro: this.lro,
|
|
state: this.state,
|
|
stateProxy,
|
|
processResult: this.processResult,
|
|
updateState: updateState
|
|
? (state, { rawResponse }) => updateState(state, rawResponse)
|
|
: undefined,
|
|
isDone: isDone
|
|
? ({ flatResponse }, state) => isDone(flatResponse, state)
|
|
: undefined,
|
|
options,
|
|
setDelay: (intervalInMs) => {
|
|
this.pollerConfig.intervalInMs = intervalInMs;
|
|
},
|
|
setErrorAsResult: this.setErrorAsResult,
|
|
});
|
|
}
|
|
(_a = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _a === void 0 ? void 0 : _a.call(options, this.state);
|
|
return this;
|
|
}
|
|
async cancel() {
|
|
logger_logger.error("`cancelOperation` is deprecated because it wasn't implemented");
|
|
return this;
|
|
}
|
|
/**
|
|
* Serializes the Poller operation.
|
|
*/
|
|
toString() {
|
|
return JSON.stringify({
|
|
state: this.state,
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=operation.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/poller.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
/**
|
|
* When a poller is manually stopped through the `stopPolling` method,
|
|
* the poller will be rejected with an instance of the PollerStoppedError.
|
|
*/
|
|
class PollerStoppedError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "PollerStoppedError";
|
|
Object.setPrototypeOf(this, PollerStoppedError.prototype);
|
|
}
|
|
}
|
|
/**
|
|
* When the operation is cancelled, the poller will be rejected with an instance
|
|
* of the PollerCancelledError.
|
|
*/
|
|
class PollerCancelledError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "PollerCancelledError";
|
|
Object.setPrototypeOf(this, PollerCancelledError.prototype);
|
|
}
|
|
}
|
|
/**
|
|
* A class that represents the definition of a program that polls through consecutive requests
|
|
* until it reaches a state of completion.
|
|
*
|
|
* A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.
|
|
* It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.
|
|
* Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.
|
|
*
|
|
* ```ts
|
|
* const poller = new MyPoller();
|
|
*
|
|
* // Polling just once:
|
|
* await poller.poll();
|
|
*
|
|
* // We can try to cancel the request here, by calling:
|
|
* //
|
|
* // await poller.cancelOperation();
|
|
* //
|
|
*
|
|
* // Getting the final result:
|
|
* const result = await poller.pollUntilDone();
|
|
* ```
|
|
*
|
|
* The Poller is defined by two types, a type representing the state of the poller, which
|
|
* must include a basic set of properties from `PollOperationState<TResult>`,
|
|
* and a return type defined by `TResult`, which can be anything.
|
|
*
|
|
* The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having
|
|
* to export the Poller's class directly, and instead only export the already instantiated poller with the PollerLike type.
|
|
*
|
|
* ```ts
|
|
* class Client {
|
|
* public async makePoller: PollerLike<MyOperationState, MyResult> {
|
|
* const poller = new MyPoller({});
|
|
* // It might be preferred to return the poller after the first request is made,
|
|
* // so that some information can be obtained right away.
|
|
* await poller.poll();
|
|
* return poller;
|
|
* }
|
|
* }
|
|
*
|
|
* const poller: PollerLike<MyOperationState, MyResult> = myClient.makePoller();
|
|
* ```
|
|
*
|
|
* A poller can be created through its constructor, then it can be polled until it's completed.
|
|
* At any point in time, the state of the poller can be obtained without delay through the getOperationState method.
|
|
* At any point in time, the intermediate forms of the result type can be requested without delay.
|
|
* Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.
|
|
*
|
|
* ```ts
|
|
* const poller = myClient.makePoller();
|
|
* const state: MyOperationState = poller.getOperationState();
|
|
*
|
|
* // The intermediate result can be obtained at any time.
|
|
* const result: MyResult | undefined = poller.getResult();
|
|
*
|
|
* // The final result can only be obtained after the poller finishes.
|
|
* const result: MyResult = await poller.pollUntilDone();
|
|
* ```
|
|
*
|
|
*/
|
|
// eslint-disable-next-line no-use-before-define
|
|
class Poller {
|
|
/**
|
|
* A poller needs to be initialized by passing in at least the basic properties of the `PollOperation<TState, TResult>`.
|
|
*
|
|
* When writing an implementation of a Poller, this implementation needs to deal with the initialization
|
|
* of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller's
|
|
* operation has already been defined, at least its basic properties. The code below shows how to approach
|
|
* the definition of the constructor of a new custom poller.
|
|
*
|
|
* ```ts
|
|
* export class MyPoller extends Poller<MyOperationState, string> {
|
|
* constructor({
|
|
* // Anything you might need outside of the basics
|
|
* }) {
|
|
* let state: MyOperationState = {
|
|
* privateProperty: private,
|
|
* publicProperty: public,
|
|
* };
|
|
*
|
|
* const operation = {
|
|
* state,
|
|
* update,
|
|
* cancel,
|
|
* toString
|
|
* }
|
|
*
|
|
* // Sending the operation to the parent's constructor.
|
|
* super(operation);
|
|
*
|
|
* // You can assign more local properties here.
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* Inside of this constructor, a new promise is created. This will be used to
|
|
* tell the user when the poller finishes (see `pollUntilDone()`). The promise's
|
|
* resolve and reject methods are also used internally to control when to resolve
|
|
* or reject anyone waiting for the poller to finish.
|
|
*
|
|
* The constructor of a custom implementation of a poller is where any serialized version of
|
|
* a previous poller's operation should be deserialized into the operation sent to the
|
|
* base constructor. For example:
|
|
*
|
|
* ```ts
|
|
* export class MyPoller extends Poller<MyOperationState, string> {
|
|
* constructor(
|
|
* baseOperation: string | undefined
|
|
* ) {
|
|
* let state: MyOperationState = {};
|
|
* if (baseOperation) {
|
|
* state = {
|
|
* ...JSON.parse(baseOperation).state,
|
|
* ...state
|
|
* };
|
|
* }
|
|
* const operation = {
|
|
* state,
|
|
* // ...
|
|
* }
|
|
* super(operation);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param operation - Must contain the basic properties of `PollOperation<State, TResult>`.
|
|
*/
|
|
constructor(operation) {
|
|
/** controls whether to throw an error if the operation failed or was canceled. */
|
|
this.resolveOnUnsuccessful = false;
|
|
this.stopped = true;
|
|
this.pollProgressCallbacks = [];
|
|
this.operation = operation;
|
|
this.promise = new Promise((resolve, reject) => {
|
|
this.resolve = resolve;
|
|
this.reject = reject;
|
|
});
|
|
// This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.
|
|
// The above warning would get thrown if `poller.poll` is called, it returns an error,
|
|
// and pullUntilDone did not have a .catch or await try/catch on it's return value.
|
|
this.promise.catch(() => {
|
|
/* intentionally blank */
|
|
});
|
|
}
|
|
/**
|
|
* Starts a loop that will break only if the poller is done
|
|
* or if the poller is stopped.
|
|
*/
|
|
async startPolling(pollOptions = {}) {
|
|
if (this.stopped) {
|
|
this.stopped = false;
|
|
}
|
|
while (!this.isStopped() && !this.isDone()) {
|
|
await this.poll(pollOptions);
|
|
await this.delay();
|
|
}
|
|
}
|
|
/**
|
|
* pollOnce does one polling, by calling to the update method of the underlying
|
|
* poll operation to make any relevant change effective.
|
|
*
|
|
* It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
|
|
*
|
|
* @param options - Optional properties passed to the operation's update method.
|
|
*/
|
|
async pollOnce(options = {}) {
|
|
if (!this.isDone()) {
|
|
this.operation = await this.operation.update({
|
|
abortSignal: options.abortSignal,
|
|
fireProgress: this.fireProgress.bind(this),
|
|
});
|
|
}
|
|
this.processUpdatedState();
|
|
}
|
|
/**
|
|
* fireProgress calls the functions passed in via onProgress the method of the poller.
|
|
*
|
|
* It loops over all of the callbacks received from onProgress, and executes them, sending them
|
|
* the current operation state.
|
|
*
|
|
* @param state - The current operation state.
|
|
*/
|
|
fireProgress(state) {
|
|
for (const callback of this.pollProgressCallbacks) {
|
|
callback(state);
|
|
}
|
|
}
|
|
/**
|
|
* Invokes the underlying operation's cancel method.
|
|
*/
|
|
async cancelOnce(options = {}) {
|
|
this.operation = await this.operation.cancel(options);
|
|
}
|
|
/**
|
|
* Returns a promise that will resolve once a single polling request finishes.
|
|
* It does this by calling the update method of the Poller's operation.
|
|
*
|
|
* It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
|
|
*
|
|
* @param options - Optional properties passed to the operation's update method.
|
|
*/
|
|
poll(options = {}) {
|
|
if (!this.pollOncePromise) {
|
|
this.pollOncePromise = this.pollOnce(options);
|
|
const clearPollOncePromise = () => {
|
|
this.pollOncePromise = undefined;
|
|
};
|
|
this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);
|
|
}
|
|
return this.pollOncePromise;
|
|
}
|
|
processUpdatedState() {
|
|
if (this.operation.state.error) {
|
|
this.stopped = true;
|
|
if (!this.resolveOnUnsuccessful) {
|
|
this.reject(this.operation.state.error);
|
|
throw this.operation.state.error;
|
|
}
|
|
}
|
|
if (this.operation.state.isCancelled) {
|
|
this.stopped = true;
|
|
if (!this.resolveOnUnsuccessful) {
|
|
const error = new PollerCancelledError("Operation was canceled");
|
|
this.reject(error);
|
|
throw error;
|
|
}
|
|
}
|
|
if (this.isDone() && this.resolve) {
|
|
// If the poller has finished polling, this means we now have a result.
|
|
// However, it can be the case that TResult is instantiated to void, so
|
|
// we are not expecting a result anyway. To assert that we might not
|
|
// have a result eventually after finishing polling, we cast the result
|
|
// to TResult.
|
|
this.resolve(this.getResult());
|
|
}
|
|
}
|
|
/**
|
|
* Returns a promise that will resolve once the underlying operation is completed.
|
|
*/
|
|
async pollUntilDone(pollOptions = {}) {
|
|
if (this.stopped) {
|
|
this.startPolling(pollOptions).catch(this.reject);
|
|
}
|
|
// This is needed because the state could have been updated by
|
|
// `cancelOperation`, e.g. the operation is canceled or an error occurred.
|
|
this.processUpdatedState();
|
|
return this.promise;
|
|
}
|
|
/**
|
|
* Invokes the provided callback after each polling is completed,
|
|
* sending the current state of the poller's operation.
|
|
*
|
|
* It returns a method that can be used to stop receiving updates on the given callback function.
|
|
*/
|
|
onProgress(callback) {
|
|
this.pollProgressCallbacks.push(callback);
|
|
return () => {
|
|
this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);
|
|
};
|
|
}
|
|
/**
|
|
* Returns true if the poller has finished polling.
|
|
*/
|
|
isDone() {
|
|
const state = this.operation.state;
|
|
return Boolean(state.isCompleted || state.isCancelled || state.error);
|
|
}
|
|
/**
|
|
* Stops the poller from continuing to poll.
|
|
*/
|
|
stopPolling() {
|
|
if (!this.stopped) {
|
|
this.stopped = true;
|
|
if (this.reject) {
|
|
this.reject(new PollerStoppedError("This poller is already stopped"));
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Returns true if the poller is stopped.
|
|
*/
|
|
isStopped() {
|
|
return this.stopped;
|
|
}
|
|
/**
|
|
* Attempts to cancel the underlying operation.
|
|
*
|
|
* It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
|
|
*
|
|
* If it's called again before it finishes, it will throw an error.
|
|
*
|
|
* @param options - Optional properties passed to the operation's update method.
|
|
*/
|
|
cancelOperation(options = {}) {
|
|
if (!this.cancelPromise) {
|
|
this.cancelPromise = this.cancelOnce(options);
|
|
}
|
|
else if (options.abortSignal) {
|
|
throw new Error("A cancel request is currently pending");
|
|
}
|
|
return this.cancelPromise;
|
|
}
|
|
/**
|
|
* Returns the state of the operation.
|
|
*
|
|
* Even though TState will be the same type inside any of the methods of any extension of the Poller class,
|
|
* implementations of the pollers can customize what's shared with the public by writing their own
|
|
* version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller
|
|
* and a public type representing a safe to share subset of the properties of the internal state.
|
|
* Their definition of getOperationState can then return their public type.
|
|
*
|
|
* Example:
|
|
*
|
|
* ```ts
|
|
* // Let's say we have our poller's operation state defined as:
|
|
* interface MyOperationState extends PollOperationState<ResultType> {
|
|
* privateProperty?: string;
|
|
* publicProperty?: string;
|
|
* }
|
|
*
|
|
* // To allow us to have a true separation of public and private state, we have to define another interface:
|
|
* interface PublicState extends PollOperationState<ResultType> {
|
|
* publicProperty?: string;
|
|
* }
|
|
*
|
|
* // Then, we define our Poller as follows:
|
|
* export class MyPoller extends Poller<MyOperationState, ResultType> {
|
|
* // ... More content is needed here ...
|
|
*
|
|
* public getOperationState(): PublicState {
|
|
* const state: PublicState = this.operation.state;
|
|
* return {
|
|
* // Properties from PollOperationState<TResult>
|
|
* isStarted: state.isStarted,
|
|
* isCompleted: state.isCompleted,
|
|
* isCancelled: state.isCancelled,
|
|
* error: state.error,
|
|
* result: state.result,
|
|
*
|
|
* // The only other property needed by PublicState.
|
|
* publicProperty: state.publicProperty
|
|
* }
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* You can see this in the tests of this repository, go to the file:
|
|
* `../test/utils/testPoller.ts`
|
|
* and look for the getOperationState implementation.
|
|
*/
|
|
getOperationState() {
|
|
return this.operation.state;
|
|
}
|
|
/**
|
|
* Returns the result value of the operation,
|
|
* regardless of the state of the poller.
|
|
* It can return undefined or an incomplete form of the final TResult value
|
|
* depending on the implementation.
|
|
*/
|
|
getResult() {
|
|
const state = this.operation.state;
|
|
return state.result;
|
|
}
|
|
/**
|
|
* Returns a serialized version of the poller's operation
|
|
* by invoking the operation's toString method.
|
|
*/
|
|
toString() {
|
|
return this.operation.toString();
|
|
}
|
|
}
|
|
//# sourceMappingURL=poller.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/lroEngine.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
|
|
|
|
|
|
/**
|
|
* The LRO Engine, a class that performs polling.
|
|
*/
|
|
class LroEngine extends Poller {
|
|
constructor(lro, options) {
|
|
const { intervalInMs = constants_POLL_INTERVAL_IN_MS, resumeFrom, resolveOnUnsuccessful = false, isDone, lroResourceLocationConfig, processResult, updateState, } = options || {};
|
|
const state = resumeFrom
|
|
? operation_deserializeState(resumeFrom)
|
|
: {};
|
|
const operation = new GenericPollOperation(state, lro, !resolveOnUnsuccessful, lroResourceLocationConfig, processResult, updateState, isDone);
|
|
super(operation);
|
|
this.resolveOnUnsuccessful = resolveOnUnsuccessful;
|
|
this.config = { intervalInMs: intervalInMs };
|
|
operation.setPollerConfig(this.config);
|
|
}
|
|
/**
|
|
* The method used by the poller to wait before attempting to update its operation.
|
|
*/
|
|
delay() {
|
|
return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));
|
|
}
|
|
}
|
|
//# sourceMappingURL=lroEngine.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/legacy/lroEngine/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/core-lro/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
/**
|
|
* This can be uncommented to expose the protocol-agnostic poller
|
|
*/
|
|
// export {
|
|
// BuildCreatePollerOptions,
|
|
// Operation,
|
|
// CreatePollerOptions,
|
|
// OperationConfig,
|
|
// RestorableOperationState,
|
|
// } from "./poller/models";
|
|
// export { buildCreatePoller } from "./poller/poller";
|
|
/** legacy */
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/pollers/BlobStartCopyFromUrlPoller.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
/**
|
|
* This is the poller returned by {@link BlobClient.beginCopyFromURL}.
|
|
* This can not be instantiated directly outside of this package.
|
|
*
|
|
* @hidden
|
|
*/
|
|
class BlobBeginCopyFromUrlPoller extends Poller {
|
|
intervalInMs;
|
|
constructor(options) {
|
|
const { blobClient, copySource, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions, } = options;
|
|
let state;
|
|
if (resumeFrom) {
|
|
state = JSON.parse(resumeFrom).state;
|
|
}
|
|
const operation = makeBlobBeginCopyFromURLPollOperation({
|
|
...state,
|
|
blobClient,
|
|
copySource,
|
|
startCopyFromURLOptions,
|
|
});
|
|
super(operation);
|
|
if (typeof onProgress === "function") {
|
|
this.onProgress(onProgress);
|
|
}
|
|
this.intervalInMs = intervalInMs;
|
|
}
|
|
delay() {
|
|
return delay_delay(this.intervalInMs);
|
|
}
|
|
}
|
|
/**
|
|
* Note: Intentionally using function expression over arrow function expression
|
|
* so that the function can be invoked with a different context.
|
|
* This affects what `this` refers to.
|
|
* @hidden
|
|
*/
|
|
const cancel = async function cancel(options = {}) {
|
|
const state = this.state;
|
|
const { copyId } = state;
|
|
if (state.isCompleted) {
|
|
return makeBlobBeginCopyFromURLPollOperation(state);
|
|
}
|
|
if (!copyId) {
|
|
state.isCancelled = true;
|
|
return makeBlobBeginCopyFromURLPollOperation(state);
|
|
}
|
|
// if abortCopyFromURL throws, it will bubble up to user's poller.cancelOperation call
|
|
await state.blobClient.abortCopyFromURL(copyId, {
|
|
abortSignal: options.abortSignal,
|
|
});
|
|
state.isCancelled = true;
|
|
return makeBlobBeginCopyFromURLPollOperation(state);
|
|
};
|
|
/**
|
|
* Note: Intentionally using function expression over arrow function expression
|
|
* so that the function can be invoked with a different context.
|
|
* This affects what `this` refers to.
|
|
* @hidden
|
|
*/
|
|
const update = async function update(options = {}) {
|
|
const state = this.state;
|
|
const { blobClient, copySource, startCopyFromURLOptions } = state;
|
|
if (!state.isStarted) {
|
|
state.isStarted = true;
|
|
const result = await blobClient.startCopyFromURL(copySource, startCopyFromURLOptions);
|
|
// copyId is needed to abort
|
|
state.copyId = result.copyId;
|
|
if (result.copyStatus === "success") {
|
|
state.result = result;
|
|
state.isCompleted = true;
|
|
}
|
|
}
|
|
else if (!state.isCompleted) {
|
|
try {
|
|
const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal });
|
|
const { copyStatus, copyProgress } = result;
|
|
const prevCopyProgress = state.copyProgress;
|
|
if (copyProgress) {
|
|
state.copyProgress = copyProgress;
|
|
}
|
|
if (copyStatus === "pending" &&
|
|
copyProgress !== prevCopyProgress &&
|
|
typeof options.fireProgress === "function") {
|
|
// trigger in setTimeout, or swallow error?
|
|
options.fireProgress(state);
|
|
}
|
|
else if (copyStatus === "success") {
|
|
state.result = result;
|
|
state.isCompleted = true;
|
|
}
|
|
else if (copyStatus === "failed") {
|
|
state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`);
|
|
state.isCompleted = true;
|
|
}
|
|
}
|
|
catch (err) {
|
|
state.error = err;
|
|
state.isCompleted = true;
|
|
}
|
|
}
|
|
return makeBlobBeginCopyFromURLPollOperation(state);
|
|
};
|
|
/**
|
|
* Note: Intentionally using function expression over arrow function expression
|
|
* so that the function can be invoked with a different context.
|
|
* This affects what `this` refers to.
|
|
* @hidden
|
|
*/
|
|
const BlobStartCopyFromUrlPoller_toString = function toString() {
|
|
return JSON.stringify({ state: this.state }, (key, value) => {
|
|
// remove blobClient from serialized state since a client can't be hydrated from this info.
|
|
if (key === "blobClient") {
|
|
return undefined;
|
|
}
|
|
return value;
|
|
});
|
|
};
|
|
/**
|
|
* Creates a poll operation given the provided state.
|
|
* @hidden
|
|
*/
|
|
function makeBlobBeginCopyFromURLPollOperation(state) {
|
|
return {
|
|
state: { ...state },
|
|
cancel,
|
|
toString: BlobStartCopyFromUrlPoller_toString,
|
|
update,
|
|
};
|
|
}
|
|
//# sourceMappingURL=BlobStartCopyFromUrlPoller.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/Range.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* Generate a range string. For example:
|
|
*
|
|
* "bytes=255-" or "bytes=0-511"
|
|
*
|
|
* @param iRange -
|
|
*/
|
|
function rangeToString(iRange) {
|
|
if (iRange.offset < 0) {
|
|
throw new RangeError(`Range.offset cannot be smaller than 0.`);
|
|
}
|
|
if (iRange.count && iRange.count <= 0) {
|
|
throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);
|
|
}
|
|
return iRange.count
|
|
? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`
|
|
: `bytes=${iRange.offset}-`;
|
|
}
|
|
//# sourceMappingURL=Range.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/Batch.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
// In browser, during webpack or browserify bundling, this module will be replaced by 'events'
|
|
// https://github.com/Gozala/events
|
|
|
|
/**
|
|
* States for Batch.
|
|
*/
|
|
var BatchStates;
|
|
(function (BatchStates) {
|
|
BatchStates[BatchStates["Good"] = 0] = "Good";
|
|
BatchStates[BatchStates["Error"] = 1] = "Error";
|
|
})(BatchStates || (BatchStates = {}));
|
|
/**
|
|
* Batch provides basic parallel execution with concurrency limits.
|
|
* Will stop execute left operations when one of the executed operation throws an error.
|
|
* But Batch cannot cancel ongoing operations, you need to cancel them by yourself.
|
|
*/
|
|
class Batch {
|
|
/**
|
|
* Concurrency. Must be lager than 0.
|
|
*/
|
|
concurrency;
|
|
/**
|
|
* Number of active operations under execution.
|
|
*/
|
|
actives = 0;
|
|
/**
|
|
* Number of completed operations under execution.
|
|
*/
|
|
completed = 0;
|
|
/**
|
|
* Offset of next operation to be executed.
|
|
*/
|
|
offset = 0;
|
|
/**
|
|
* Operation array to be executed.
|
|
*/
|
|
operations = [];
|
|
/**
|
|
* States of Batch. When an error happens, state will turn into error.
|
|
* Batch will stop execute left operations.
|
|
*/
|
|
state = BatchStates.Good;
|
|
/**
|
|
* A private emitter used to pass events inside this class.
|
|
*/
|
|
emitter;
|
|
/**
|
|
* Creates an instance of Batch.
|
|
* @param concurrency -
|
|
*/
|
|
constructor(concurrency = 5) {
|
|
if (concurrency < 1) {
|
|
throw new RangeError("concurrency must be larger than 0");
|
|
}
|
|
this.concurrency = concurrency;
|
|
this.emitter = new external_events_.EventEmitter();
|
|
}
|
|
/**
|
|
* Add a operation into queue.
|
|
*
|
|
* @param operation -
|
|
*/
|
|
addOperation(operation) {
|
|
this.operations.push(async () => {
|
|
try {
|
|
this.actives++;
|
|
await operation();
|
|
this.actives--;
|
|
this.completed++;
|
|
this.parallelExecute();
|
|
}
|
|
catch (error) {
|
|
this.emitter.emit("error", error);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Start execute operations in the queue.
|
|
*
|
|
*/
|
|
async do() {
|
|
if (this.operations.length === 0) {
|
|
return Promise.resolve();
|
|
}
|
|
this.parallelExecute();
|
|
return new Promise((resolve, reject) => {
|
|
this.emitter.on("finish", resolve);
|
|
this.emitter.on("error", (error) => {
|
|
this.state = BatchStates.Error;
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* Get next operation to be executed. Return null when reaching ends.
|
|
*
|
|
*/
|
|
nextOperation() {
|
|
if (this.offset < this.operations.length) {
|
|
return this.operations[this.offset++];
|
|
}
|
|
return null;
|
|
}
|
|
/**
|
|
* Start execute operations. One one the most important difference between
|
|
* this method with do() is that do() wraps as an sync method.
|
|
*
|
|
*/
|
|
parallelExecute() {
|
|
if (this.state === BatchStates.Error) {
|
|
return;
|
|
}
|
|
if (this.completed >= this.operations.length) {
|
|
this.emitter.emit("finish");
|
|
return;
|
|
}
|
|
while (this.actives < this.concurrency) {
|
|
const operation = this.nextOperation();
|
|
if (operation) {
|
|
operation();
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=Batch.js.map
|
|
// EXTERNAL MODULE: external "node:fs"
|
|
var external_node_fs_ = __webpack_require__(3024);
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/utils.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
/**
|
|
* Reads a readable stream into buffer. Fill the buffer from offset to end.
|
|
*
|
|
* @param stream - A Node.js Readable stream
|
|
* @param buffer - Buffer to be filled, length must greater than or equal to offset
|
|
* @param offset - From which position in the buffer to be filled, inclusive
|
|
* @param end - To which position in the buffer to be filled, exclusive
|
|
* @param encoding - Encoding of the Readable stream
|
|
*/
|
|
async function streamToBuffer(stream, buffer, offset, end, encoding) {
|
|
let pos = 0; // Position in stream
|
|
const count = end - offset; // Total amount of data needed in stream
|
|
return new Promise((resolve, reject) => {
|
|
const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), REQUEST_TIMEOUT);
|
|
stream.on("readable", () => {
|
|
// Already filled the requested amount; ignore any further `readable` events.
|
|
if (pos >= count) {
|
|
clearTimeout(timeout);
|
|
resolve();
|
|
return;
|
|
}
|
|
// Drain all currently-buffered chunks. Required since Node.js v26, where
|
|
// `stream.read()` returns one buffered chunk at a time instead of the
|
|
// concatenation of all queued data (see nodejs/node#60441).
|
|
let chunk;
|
|
while ((chunk = stream.read()) !== null) {
|
|
if (typeof chunk === "string") {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
}
|
|
// How much data needed in this chunk
|
|
const chunkLength = pos + chunk.length > count ? count - pos : chunk.length;
|
|
buffer.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength);
|
|
pos += chunkLength;
|
|
if (pos >= count) {
|
|
clearTimeout(timeout);
|
|
resolve();
|
|
return;
|
|
}
|
|
}
|
|
});
|
|
stream.on("end", () => {
|
|
clearTimeout(timeout);
|
|
if (pos < count) {
|
|
reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`));
|
|
}
|
|
resolve();
|
|
});
|
|
stream.on("error", (msg) => {
|
|
clearTimeout(timeout);
|
|
reject(msg);
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* Reads a readable stream into buffer entirely.
|
|
*
|
|
* @param stream - A Node.js Readable stream
|
|
* @param buffer - Buffer to be filled, length must greater than or equal to offset
|
|
* @param encoding - Encoding of the Readable stream
|
|
* @returns with the count of bytes read.
|
|
* @throws `RangeError` If buffer size is not big enough.
|
|
*/
|
|
async function streamToBuffer2(stream, buffer, encoding) {
|
|
let pos = 0; // Position in stream
|
|
const bufferSize = buffer.length;
|
|
return new Promise((resolve, reject) => {
|
|
stream.on("readable", () => {
|
|
// Drain all currently-buffered chunks. Required since Node.js v26, where
|
|
// `stream.read()` returns one buffered chunk at a time instead of the
|
|
// concatenation of all queued data (see nodejs/node#60441).
|
|
let chunk;
|
|
while ((chunk = stream.read()) !== null) {
|
|
if (typeof chunk === "string") {
|
|
chunk = Buffer.from(chunk, encoding);
|
|
}
|
|
if (pos + chunk.length > bufferSize) {
|
|
reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`));
|
|
return;
|
|
}
|
|
buffer.fill(chunk, pos, pos + chunk.length);
|
|
pos += chunk.length;
|
|
}
|
|
});
|
|
stream.on("end", () => {
|
|
resolve(pos);
|
|
});
|
|
stream.on("error", reject);
|
|
});
|
|
}
|
|
/**
|
|
* Reads a readable stream into a buffer.
|
|
*
|
|
* @param stream - A Node.js Readable stream
|
|
* @param encoding - Encoding of the Readable stream
|
|
* @returns with the count of bytes read.
|
|
*/
|
|
async function streamToBuffer3(readableStream, encoding) {
|
|
return new Promise((resolve, reject) => {
|
|
const chunks = [];
|
|
readableStream.on("data", (data) => {
|
|
chunks.push(typeof data === "string" ? Buffer.from(data, encoding) : data);
|
|
});
|
|
readableStream.on("end", () => {
|
|
resolve(Buffer.concat(chunks));
|
|
});
|
|
readableStream.on("error", reject);
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Writes the content of a readstream to a local file. Returns a Promise which is completed after the file handle is closed.
|
|
*
|
|
* @param rs - The read stream.
|
|
* @param file - Destination file path.
|
|
*/
|
|
async function readStreamToLocalFile(rs, file) {
|
|
return new Promise((resolve, reject) => {
|
|
const ws = external_node_fs_.createWriteStream(file);
|
|
rs.on("error", (err) => {
|
|
reject(err);
|
|
});
|
|
ws.on("error", (err) => {
|
|
reject(err);
|
|
});
|
|
ws.on("close", resolve);
|
|
rs.pipe(ws);
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Promisified version of fs.stat().
|
|
*/
|
|
const fsStat = external_node_util_.promisify(external_node_fs_.stat);
|
|
const fsCreateReadStream = external_node_fs_.createReadStream;
|
|
//# sourceMappingURL=utils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/Clients.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A BlobClient represents a URL to an Azure Storage blob; the blob may be a block blob,
|
|
* append blob, or page blob.
|
|
*/
|
|
class BlobClient extends StorageClient_StorageClient {
|
|
/**
|
|
* blobContext provided by protocol layer.
|
|
*/
|
|
blobContext;
|
|
_name;
|
|
_containerName;
|
|
_versionId;
|
|
_snapshot;
|
|
/**
|
|
* Config used in creating blob client instances.
|
|
*/
|
|
blobClientConfig;
|
|
/**
|
|
* The name of the blob.
|
|
*/
|
|
get name() {
|
|
return this._name;
|
|
}
|
|
/**
|
|
* The name of the storage container the blob is associated with.
|
|
*/
|
|
get containerName() {
|
|
return this._containerName;
|
|
}
|
|
constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
options = options || {};
|
|
let pipeline;
|
|
let url;
|
|
if (isPipelineLike(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, pipeline: Pipeline)
|
|
url = urlOrConnectionString;
|
|
pipeline = credentialOrPipelineOrContainerName;
|
|
options = blobNameOrOptions;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipelineOrContainerName instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
pipeline = newPipeline(credentialOrPipelineOrContainerName, options);
|
|
}
|
|
else if (!credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName !== "string") {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
// The second parameter is undefined. Use anonymous credential.
|
|
url = urlOrConnectionString;
|
|
if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
|
|
options = blobNameOrOptions;
|
|
}
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else if (credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName === "string" &&
|
|
blobNameOrOptions &&
|
|
typeof blobNameOrOptions === "string") {
|
|
// (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
|
|
const containerName = credentialOrPipelineOrContainerName;
|
|
const blobName = blobNameOrOptions;
|
|
const extractedCreds = utils_common_extractConnectionStringParts(urlOrConnectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
url = utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
pipeline = newPipeline(sharedKeyCredential, options);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
url =
|
|
utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
|
|
"?" +
|
|
extractedCreds.accountSas;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
else {
|
|
throw new Error("Expecting non-empty strings for containerName and blobName parameters");
|
|
}
|
|
super(url, pipeline);
|
|
({ blobName: this._name, containerName: this._containerName } =
|
|
this.getBlobAndContainerNamesFromUrl());
|
|
this.blobContext = this.storageClientContext.blob;
|
|
this._snapshot = utils_common_getURLParameter(this.url, utils_constants_URLConstants.Parameters.SNAPSHOT);
|
|
this._versionId = utils_common_getURLParameter(this.url, utils_constants_URLConstants.Parameters.VERSIONID);
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a new BlobClient object identical to the source but with the specified snapshot timestamp.
|
|
* Provide "" will remove the snapshot and return a Client to the base blob.
|
|
*
|
|
* @param snapshot - The snapshot timestamp.
|
|
* @returns A new BlobClient object identical to the source but with the specified snapshot timestamp
|
|
*/
|
|
withSnapshot(snapshot) {
|
|
return new BlobClient(utils_common_setURLParameter(this.url, utils_constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a new BlobClient object pointing to a version of this blob.
|
|
* Provide "" will remove the versionId and return a Client to the base blob.
|
|
*
|
|
* @param versionId - The versionId.
|
|
* @returns A new BlobClient object pointing to the version of this blob.
|
|
*/
|
|
withVersion(versionId) {
|
|
return new BlobClient(utils_common_setURLParameter(this.url, utils_constants_URLConstants.Parameters.VERSIONID, versionId.length === 0 ? undefined : versionId), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a AppendBlobClient object.
|
|
*
|
|
*/
|
|
getAppendBlobClient() {
|
|
return new AppendBlobClient(this.url, this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a BlockBlobClient object.
|
|
*
|
|
*/
|
|
getBlockBlobClient() {
|
|
return new BlockBlobClient(this.url, this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a PageBlobClient object.
|
|
*
|
|
*/
|
|
getPageBlobClient() {
|
|
return new PageBlobClient(this.url, this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Reads or downloads a blob from the system, including its metadata and properties.
|
|
* You can also call Get Blob to read a snapshot.
|
|
*
|
|
* * In Node.js, data returns in a Readable stream readableStreamBody
|
|
* * In browsers, data returns in a promise blobBody
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-blob
|
|
*
|
|
* @param offset - From which position of the blob to download, greater than or equal to 0
|
|
* @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
|
|
* @param options - Optional options to Blob Download operation.
|
|
*
|
|
*
|
|
* Example usage (Node.js):
|
|
*
|
|
* ```ts snippet:ReadmeSampleDownloadBlob_Node
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
* import { buffer } from "node:stream/consumers";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blobClient = containerClient.getBlobClient(blobName);
|
|
*
|
|
* // Get blob content from position 0 to the end
|
|
* // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
|
|
* const downloadBlockBlobResponse = await blobClient.download();
|
|
* if (downloadBlockBlobResponse.readableStreamBody) {
|
|
* // Download the raw bytes of the blob. Use `text` from "node:stream/consumers"
|
|
* // instead if you want to read the content as a string directly.
|
|
* const downloaded = await buffer(downloadBlockBlobResponse.readableStreamBody);
|
|
* console.log(`Downloaded blob content: ${downloaded.toString()}`);
|
|
* }
|
|
* ```
|
|
*
|
|
* Example usage (browser):
|
|
*
|
|
* ```ts snippet:ReadmeSampleDownloadBlob_Browser
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blobClient = containerClient.getBlobClient(blobName);
|
|
*
|
|
* // Get blob content from position 0 to the end
|
|
* // In browsers, get downloaded data by accessing downloadBlockBlobResponse.blobBody
|
|
* const downloadBlockBlobResponse = await blobClient.download();
|
|
* const blobBody = await downloadBlockBlobResponse.blobBody;
|
|
* if (blobBody) {
|
|
* const downloaded = await blobBody.text();
|
|
* console.log(`Downloaded blob content: ${downloaded}`);
|
|
* }
|
|
* ```
|
|
*/
|
|
async download(offset = 0, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlobClient-download", options, async (updatedOptions) => {
|
|
let contentChecksumAlgorithm = options.contentChecksumAlgorithm ?? this.blobClientConfig?.downloadContentChecksumAlgorithm;
|
|
if (contentChecksumAlgorithm === undefined) {
|
|
contentChecksumAlgorithm = "Customized";
|
|
}
|
|
else if (contentChecksumAlgorithm === "Auto") {
|
|
contentChecksumAlgorithm = "StorageCrc64";
|
|
}
|
|
if (contentChecksumAlgorithm === "StorageCrc64") {
|
|
await StorageCRC64Calculator.init();
|
|
}
|
|
const res = utils_common_assertResponse((await this.blobContext.download({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
requestOptions: {
|
|
onDownloadProgress: esm_isNodeLike ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream
|
|
},
|
|
range: offset === 0 && !count ? undefined : rangeToString({ offset, count }),
|
|
rangeGetContentMD5: options.rangeGetContentMD5,
|
|
rangeGetContentCRC64: options.rangeGetContentCrc64,
|
|
snapshot: options.snapshot,
|
|
cpkInfo: options.customerProvidedKey,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
structuredBodyType: contentChecksumAlgorithm === "StorageCrc64" ? "XSM/1.0; properties=crc64" : undefined,
|
|
})));
|
|
const wrappedRes = {
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
|
|
objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules),
|
|
};
|
|
// Return browser response immediately
|
|
if (!esm_isNodeLike) {
|
|
if (contentChecksumAlgorithm === "StorageCrc64") {
|
|
wrappedRes.blobBody = structuredMessageDecodingBrowser(await wrappedRes.blobBody);
|
|
}
|
|
return wrappedRes;
|
|
}
|
|
// We support retrying when download stream unexpected ends in Node.js runtime
|
|
// Following code shouldn't be bundled into browser build, however some
|
|
// bundlers may try to bundle following code and "FileReadResponse.ts".
|
|
// In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts"
|
|
// The config is in package.json "browser" field
|
|
if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) {
|
|
// TODO: Default value or make it a required parameter?
|
|
options.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS;
|
|
}
|
|
if (res.contentLength === undefined) {
|
|
throw new RangeError(`File download response doesn't contain valid content length header`);
|
|
}
|
|
if (contentChecksumAlgorithm === "StorageCrc64" &&
|
|
res.structuredContentLength === undefined) {
|
|
throw new RangeError(`Unexpected structured content length`);
|
|
}
|
|
if (!res.etag) {
|
|
throw new RangeError(`File download response doesn't contain valid etag header`);
|
|
}
|
|
const expectedContentLength = contentChecksumAlgorithm === "StorageCrc64"
|
|
? res.structuredContentLength
|
|
: res.contentLength;
|
|
return new BlobDownloadResponse(wrappedRes, async (start) => {
|
|
const updatedDownloadOptions = {
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
ifMatch: options.conditions.ifMatch || res.etag,
|
|
ifModifiedSince: options.conditions.ifModifiedSince,
|
|
ifNoneMatch: options.conditions.ifNoneMatch,
|
|
ifUnmodifiedSince: options.conditions.ifUnmodifiedSince,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
range: rangeToString({
|
|
count: offset + expectedContentLength - start,
|
|
offset: start,
|
|
}),
|
|
rangeGetContentMD5: options.rangeGetContentMD5,
|
|
rangeGetContentCRC64: options.rangeGetContentCrc64,
|
|
snapshot: options.snapshot,
|
|
cpkInfo: options.customerProvidedKey,
|
|
structuredBodyType: contentChecksumAlgorithm === "StorageCrc64" ? "XSM/1.0; properties=crc64" : undefined,
|
|
};
|
|
// Debug purpose only
|
|
// console.log(
|
|
// `Read from internal stream, range: ${
|
|
// updatedOptions.range
|
|
// }, options: ${JSON.stringify(updatedOptions)}`
|
|
// );
|
|
const resBody = (await this.blobContext.download({
|
|
abortSignal: options.abortSignal,
|
|
...updatedDownloadOptions,
|
|
})).readableStreamBody;
|
|
if (contentChecksumAlgorithm === "StorageCrc64") {
|
|
return structuredMessageDecodingStream(resBody, {});
|
|
}
|
|
else {
|
|
return resBody;
|
|
}
|
|
}, offset, expectedContentLength, {
|
|
maxRetryRequests: options.maxRetryRequests,
|
|
onProgress: options.onProgress,
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* Returns true if the Azure blob resource represented by this client exists; false otherwise.
|
|
*
|
|
* NOTE: use this function with care since an existing blob might be deleted by other clients or
|
|
* applications. Vice versa new blobs might be added by other clients or applications after this
|
|
* function completes.
|
|
*
|
|
* @param options - options to Exists operation.
|
|
*/
|
|
async exists(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-exists", options, async (updatedOptions) => {
|
|
try {
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
await this.getProperties({
|
|
abortSignal: options.abortSignal,
|
|
customerProvidedKey: options.customerProvidedKey,
|
|
conditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
return true;
|
|
}
|
|
catch (e) {
|
|
if (e.statusCode === 404) {
|
|
// Expected exception when checking blob existence
|
|
return false;
|
|
}
|
|
else if (e.statusCode === 409 &&
|
|
(e.details.errorCode === BlobUsesCustomerSpecifiedEncryptionMsg ||
|
|
e.details.errorCode === BlobDoesNotUseCustomerSpecifiedEncryption)) {
|
|
// Expected exception when checking blob existence
|
|
return true;
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Returns all user-defined metadata, standard HTTP properties, and system properties
|
|
* for the blob. It does not return the content of the blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-blob-properties
|
|
*
|
|
* WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
|
|
* they originally contained uppercase characters. This differs from the metadata keys returned by
|
|
* the methods of {@link ContainerClient} that list blobs using the `includeMetadata` option, which
|
|
* will retain their original casing.
|
|
*
|
|
* @param options - Optional options to Get Properties operation.
|
|
*/
|
|
async getProperties(options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlobClient-getProperties", options, async (updatedOptions) => {
|
|
const res = utils_common_assertResponse(await this.blobContext.getProperties({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return {
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
objectReplicationDestinationPolicyId: res.objectReplicationPolicyId,
|
|
objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules),
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Marks the specified blob or snapshot for deletion. The blob is later deleted
|
|
* during garbage collection. Note that in order to delete a blob, you must delete
|
|
* all of its snapshots. You can delete both at the same time with the Delete
|
|
* Blob operation.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
|
|
*
|
|
* @param options - Optional options to Blob Delete operation.
|
|
*/
|
|
async delete(options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("BlobClient-delete", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.delete({
|
|
abortSignal: options.abortSignal,
|
|
deleteSnapshots: options.deleteSnapshots,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
accessTierIfModifiedSince: options.conditions?.accessTierIfModifiedSince,
|
|
accessTierIfUnmodifiedSince: options.conditions?.accessTierIfUnmodifiedSince,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Marks the specified blob or snapshot for deletion if it exists. The blob is later deleted
|
|
* during garbage collection. Note that in order to delete a blob, you must delete
|
|
* all of its snapshots. You can delete both at the same time with the Delete
|
|
* Blob operation.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
|
|
*
|
|
* @param options - Optional options to Blob Delete operation.
|
|
*/
|
|
async deleteIfExists(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-deleteIfExists", options, async (updatedOptions) => {
|
|
try {
|
|
const res = utils_common_assertResponse(await this.delete(updatedOptions));
|
|
return {
|
|
succeeded: true,
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (e.details?.errorCode === "BlobNotFound") {
|
|
return {
|
|
succeeded: false,
|
|
...e.response?.parsedHeaders,
|
|
_response: e.response,
|
|
};
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Restores the contents and metadata of soft deleted blob and any associated
|
|
* soft deleted snapshots. Undelete Blob is supported only on version 2017-07-29
|
|
* or later.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/undelete-blob
|
|
*
|
|
* @param options - Optional options to Blob Undelete operation.
|
|
*/
|
|
async undelete(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-undelete", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.undelete({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets system properties on the blob.
|
|
*
|
|
* If no value provided, or no value provided for the specified blob HTTP headers,
|
|
* these blob HTTP headers without a value will be cleared.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
|
|
*
|
|
* @param blobHTTPHeaders - If no value provided, or no value provided for
|
|
* the specified blob HTTP headers, these blob HTTP
|
|
* headers without a value will be cleared.
|
|
* A common header to set is `blobContentType`
|
|
* enabling the browser to provide functionality
|
|
* based on file type.
|
|
* @param options - Optional options to Blob Set HTTP Headers operation.
|
|
*/
|
|
async setHTTPHeaders(blobHTTPHeaders, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlobClient-setHTTPHeaders", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setHttpHeaders({
|
|
abortSignal: options.abortSignal,
|
|
blobHttpHeaders: blobHTTPHeaders,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
// cpkInfo: options.customerProvidedKey, // CPK is not included in Swagger, should change this back when this issue is fixed in Swagger.
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets user-defined metadata for the specified blob as one or more name-value pairs.
|
|
*
|
|
* If no option provided, or no metadata defined in the parameter, the blob
|
|
* metadata will be removed.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-metadata
|
|
*
|
|
* @param metadata - Replace existing metadata with this value.
|
|
* If no value provided the existing metadata will be removed.
|
|
* @param options - Optional options to Set Metadata operation.
|
|
*/
|
|
async setMetadata(metadata, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlobClient-setMetadata", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setMetadata({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets tags on the underlying blob.
|
|
* A blob can have up to 10 tags. Tag keys must be between 1 and 128 characters. Tag values must be between 0 and 256 characters.
|
|
* Valid tag key and value characters include lower and upper case letters, digits (0-9),
|
|
* space (' '), plus ('+'), minus ('-'), period ('.'), foward slash ('/'), colon (':'), equals ('='), and underscore ('_').
|
|
*
|
|
* @param tags -
|
|
* @param options -
|
|
*/
|
|
async setTags(tags, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-setTags", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setTags({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
blobModifiedAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
tags: toBlobTags(tags),
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Gets the tags associated with the underlying blob.
|
|
*
|
|
* @param options -
|
|
*/
|
|
async getTags(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-getTags", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.blobContext.getTags({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
blobModifiedAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const wrappedResponse = {
|
|
...response,
|
|
_response: response._response, // _response is made non-enumerable
|
|
tags: toTags({ blobTagSet: response.blobTagSet }) || {},
|
|
};
|
|
return wrappedResponse;
|
|
});
|
|
}
|
|
/**
|
|
* Get a {@link BlobLeaseClient} that manages leases on the blob.
|
|
*
|
|
* @param proposeLeaseId - Initial proposed lease Id.
|
|
* @returns A new BlobLeaseClient object for managing leases on the blob.
|
|
*/
|
|
getBlobLeaseClient(proposeLeaseId) {
|
|
return new BlobLeaseClient(this, proposeLeaseId);
|
|
}
|
|
/**
|
|
* Creates a read-only snapshot of a blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/snapshot-blob
|
|
*
|
|
* @param options - Optional options to the Blob Create Snapshot operation.
|
|
*/
|
|
async createSnapshot(options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlobClient-createSnapshot", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.createSnapshot({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Asynchronously copies a blob to a destination within the storage account.
|
|
* This method returns a long running operation poller that allows you to wait
|
|
* indefinitely until the copy is completed.
|
|
* You can also cancel a copy before it is completed by calling `cancelOperation` on the poller.
|
|
* Note that the onProgress callback will not be invoked if the operation completes in the first
|
|
* request, and attempting to cancel a completed copy will result in an error being thrown.
|
|
*
|
|
* In version 2012-02-12 and later, the source for a Copy Blob operation can be
|
|
* a committed blob in any Azure storage account.
|
|
* Beginning with version 2015-02-21, the source for a Copy Blob operation can be
|
|
* an Azure file in any Azure storage account.
|
|
* Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
|
|
* operation to copy from another storage account.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
|
|
*
|
|
* ```ts snippet:ClientsBeginCopyFromURL
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blobClient = containerClient.getBlobClient(blobName);
|
|
*
|
|
* // Example using automatic polling
|
|
* const automaticCopyPoller = await blobClient.beginCopyFromURL("url");
|
|
* const automaticResult = await automaticCopyPoller.pollUntilDone();
|
|
*
|
|
* // Example using manual polling
|
|
* const manualCopyPoller = await blobClient.beginCopyFromURL("url");
|
|
* while (!manualCopyPoller.isDone()) {
|
|
* await manualCopyPoller.poll();
|
|
* }
|
|
* const manualResult = manualCopyPoller.getResult();
|
|
*
|
|
* // Example using progress updates
|
|
* const progressUpdatesCopyPoller = await blobClient.beginCopyFromURL("url", {
|
|
* onProgress(state) {
|
|
* console.log(`Progress: ${state.copyProgress}`);
|
|
* },
|
|
* });
|
|
* const progressUpdatesResult = await progressUpdatesCopyPoller.pollUntilDone();
|
|
*
|
|
* // Example using a changing polling interval (default 15 seconds)
|
|
* const pollingIntervalCopyPoller = await blobClient.beginCopyFromURL("url", {
|
|
* intervalInMs: 1000, // poll blob every 1 second for copy progress
|
|
* });
|
|
* const pollingIntervalResult = await pollingIntervalCopyPoller.pollUntilDone();
|
|
*
|
|
* // Example using copy cancellation:
|
|
* const cancelCopyPoller = await blobClient.beginCopyFromURL("url");
|
|
* // cancel operation after starting it.
|
|
* try {
|
|
* await cancelCopyPoller.cancelOperation();
|
|
* // calls to get the result now throw PollerCancelledError
|
|
* cancelCopyPoller.getResult();
|
|
* } catch (err: any) {
|
|
* if (err.name === "PollerCancelledError") {
|
|
* console.log("The copy was cancelled.");
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param copySource - url to the source Azure Blob/File.
|
|
* @param options - Optional options to the Blob Start Copy From URL operation.
|
|
*/
|
|
async beginCopyFromURL(copySource, options = {}) {
|
|
const client = {
|
|
abortCopyFromURL: (...args) => this.abortCopyFromURL(...args),
|
|
getProperties: (...args) => this.getProperties(...args),
|
|
startCopyFromURL: (...args) => this.startCopyFromURL(...args),
|
|
};
|
|
const poller = new BlobBeginCopyFromUrlPoller({
|
|
blobClient: client,
|
|
copySource,
|
|
intervalInMs: options.intervalInMs,
|
|
onProgress: options.onProgress,
|
|
resumeFrom: options.resumeFrom,
|
|
startCopyFromURLOptions: options,
|
|
});
|
|
// Trigger the startCopyFromURL call by calling poll.
|
|
// Any errors from this method should be surfaced to the user.
|
|
await poller.poll();
|
|
return poller;
|
|
}
|
|
/**
|
|
* Aborts a pending asynchronous Copy Blob operation, and leaves a destination blob with zero
|
|
* length and full metadata. Version 2012-02-12 and newer.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/abort-copy-blob
|
|
*
|
|
* @param copyId - Id of the Copy From URL operation.
|
|
* @param options - Optional options to the Blob Abort Copy From URL operation.
|
|
*/
|
|
async abortCopyFromURL(copyId, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-abortCopyFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.abortCopyFromURL(copyId, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* The synchronous Copy From URL operation copies a blob or an internet resource to a new blob. It will not
|
|
* return a response until the copy is complete.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/copy-blob-from-url
|
|
*
|
|
* @param copySource - The source URL to copy from, Shared Access Signature(SAS) maybe needed for authentication
|
|
* @param options -
|
|
*/
|
|
async syncCopyFromURL(copySource, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
options.sourceConditions = options.sourceConditions || {};
|
|
return tracingClient.withSpan("BlobClient-syncCopyFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.copyFromURL(copySource, {
|
|
abortSignal: options.abortSignal,
|
|
metadata: options.metadata,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
sourceModifiedAccessConditions: {
|
|
sourceIfMatch: options.sourceConditions?.ifMatch,
|
|
sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
|
|
sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
|
|
sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
|
|
},
|
|
sourceContentMD5: options.sourceContentMD5,
|
|
copySourceAuthorization: utils_common_httpAuthorizationToString(options.sourceAuthorization),
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
encryptionScope: options.encryptionScope,
|
|
copySourceTags: options.copySourceTags,
|
|
fileRequestIntent: options.sourceShareTokenIntent,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets the tier on a blob. The operation is allowed on a page blob in a premium
|
|
* storage account and on a block blob in a blob storage account (locally redundant
|
|
* storage only). A premium page blob's tier determines the allowed size, IOPS,
|
|
* and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive
|
|
* storage type. This operation does not update the blob's ETag.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-tier
|
|
*
|
|
* @param tier - The tier to be set on the blob. Valid values are Hot, Cool, or Archive.
|
|
* @param options - Optional options to the Blob Set Tier operation.
|
|
*/
|
|
async setAccessTier(tier, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-setAccessTier", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setTier(toAccessTier(tier), {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
rehydratePriority: options.rehydratePriority,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
async downloadToBuffer(param1, param2, param3, param4 = {}) {
|
|
let buffer;
|
|
let offset = 0;
|
|
let count = 0;
|
|
let options = param4;
|
|
if (param1 instanceof Buffer) {
|
|
buffer = param1;
|
|
offset = param2 || 0;
|
|
count = typeof param3 === "number" ? param3 : 0;
|
|
}
|
|
else {
|
|
offset = typeof param1 === "number" ? param1 : 0;
|
|
count = typeof param2 === "number" ? param2 : 0;
|
|
options = param3 || {};
|
|
}
|
|
let blockSize = options.blockSize ?? 0;
|
|
if (blockSize < 0) {
|
|
throw new RangeError("blockSize option must be >= 0");
|
|
}
|
|
if (blockSize === 0) {
|
|
blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
|
|
}
|
|
if (offset < 0) {
|
|
throw new RangeError("offset option must be >= 0");
|
|
}
|
|
if (count && count <= 0) {
|
|
throw new RangeError("count option must be greater than 0");
|
|
}
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("BlobClient-downloadToBuffer", options, async (updatedOptions) => {
|
|
// Customer doesn't specify length, get it
|
|
if (!count) {
|
|
const response = await this.getProperties({
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
count = response.contentLength - offset;
|
|
if (count < 0) {
|
|
throw new RangeError(`offset ${offset} shouldn't be larger than blob size ${response.contentLength}`);
|
|
}
|
|
}
|
|
// Allocate the buffer of size = count if the buffer is not provided
|
|
if (!buffer) {
|
|
try {
|
|
buffer = Buffer.alloc(count);
|
|
}
|
|
catch (error) {
|
|
throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\t ${error.message}`);
|
|
}
|
|
}
|
|
if (buffer.length < count) {
|
|
throw new RangeError(`The buffer's size should be equal to or larger than the request count of bytes: ${count}`);
|
|
}
|
|
let transferProgress = 0;
|
|
const batch = new Batch(options.concurrency);
|
|
for (let off = offset; off < offset + count; off = off + blockSize) {
|
|
batch.addOperation(async () => {
|
|
// Exclusive chunk end position
|
|
let chunkEnd = offset + count;
|
|
if (off + blockSize < chunkEnd) {
|
|
chunkEnd = off + blockSize;
|
|
}
|
|
const response = await this.download(off, chunkEnd - off, {
|
|
abortSignal: options.abortSignal,
|
|
conditions: options.conditions,
|
|
maxRetryRequests: options.maxRetryRequestsPerBlock,
|
|
customerProvidedKey: options.customerProvidedKey,
|
|
contentChecksumAlgorithm: options.contentChecksumAlgorithm,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
const stream = response.readableStreamBody;
|
|
await streamToBuffer(stream, buffer, off - offset, chunkEnd - offset);
|
|
// Update progress after block is downloaded, in case of block trying
|
|
// Could provide finer grained progress updating inside HTTP requests,
|
|
// only if convenience layer download try is enabled
|
|
transferProgress += chunkEnd - off;
|
|
if (options.onProgress) {
|
|
options.onProgress({ loadedBytes: transferProgress });
|
|
}
|
|
});
|
|
}
|
|
await batch.do();
|
|
return buffer;
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Downloads an Azure Blob to a local file.
|
|
* Fails if the the given file path already exits.
|
|
* Offset and count are optional, pass 0 and undefined respectively to download the entire blob.
|
|
*
|
|
* @param filePath -
|
|
* @param offset - From which position of the block blob to download.
|
|
* @param count - How much data to be downloaded. Will download to the end when passing undefined.
|
|
* @param options - Options to Blob download options.
|
|
* @returns The response data for blob download operation,
|
|
* but with readableStreamBody set to undefined since its
|
|
* content is already read and written into a local file
|
|
* at the specified path.
|
|
*/
|
|
async downloadToFile(filePath, offset = 0, count, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-downloadToFile", options, async (updatedOptions) => {
|
|
const response = await this.download(offset, count, {
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
if (response.readableStreamBody) {
|
|
await readStreamToLocalFile(response.readableStreamBody, filePath);
|
|
}
|
|
// The stream is no longer accessible so setting it to undefined.
|
|
response.blobDownloadStream = undefined;
|
|
return response;
|
|
});
|
|
}
|
|
getBlobAndContainerNamesFromUrl() {
|
|
let containerName;
|
|
let blobName;
|
|
try {
|
|
// URL may look like the following
|
|
// "https://myaccount.blob.core.windows.net/mycontainer/blob?sasString";
|
|
// "https://myaccount.blob.core.windows.net/mycontainer/blob";
|
|
// "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt?sasString";
|
|
// "https://myaccount.blob.core.windows.net/mycontainer/blob/a.txt";
|
|
// IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername/blob`
|
|
// http://localhost:10001/devstoreaccount1/containername/blob
|
|
const parsedUrl = new URL(this.url);
|
|
if (parsedUrl.host.split(".")[1] === "blob") {
|
|
// "https://myaccount.blob.core.windows.net/containername/blob".
|
|
// .getPath() -> /containername/blob
|
|
const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
|
|
containerName = pathComponents[1];
|
|
blobName = pathComponents[3];
|
|
}
|
|
else if (utils_common_isIpEndpointStyle(parsedUrl)) {
|
|
// IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername/blob
|
|
// Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername/blob
|
|
// .getPath() -> /devstoreaccount1/containername/blob
|
|
const pathComponents = parsedUrl.pathname.match("/([^/]*)/([^/]*)(/(.*))?");
|
|
containerName = pathComponents[2];
|
|
blobName = pathComponents[4];
|
|
}
|
|
else {
|
|
// "https://customdomain.com/containername/blob".
|
|
// .getPath() -> /containername/blob
|
|
const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?");
|
|
containerName = pathComponents[1];
|
|
blobName = pathComponents[3];
|
|
}
|
|
// decode the encoded blobName, containerName - to get all the special characters that might be present in them
|
|
containerName = decodeURIComponent(containerName);
|
|
blobName = decodeURIComponent(blobName);
|
|
// Azure Storage Server will replace "\" with "/" in the blob names
|
|
// doing the same in the SDK side so that the user doesn't have to replace "\" instances in the blobName
|
|
blobName = blobName.replace(/\\/g, "/");
|
|
if (!containerName) {
|
|
throw new Error("Provided containerName is invalid.");
|
|
}
|
|
return { blobName, containerName };
|
|
}
|
|
catch (error) {
|
|
throw new Error("Unable to extract blobName and containerName with provided information.");
|
|
}
|
|
}
|
|
/**
|
|
* Asynchronously copies a blob to a destination within the storage account.
|
|
* In version 2012-02-12 and later, the source for a Copy Blob operation can be
|
|
* a committed blob in any Azure storage account.
|
|
* Beginning with version 2015-02-21, the source for a Copy Blob operation can be
|
|
* an Azure file in any Azure storage account.
|
|
* Only storage accounts created on or after June 7th, 2012 allow the Copy Blob
|
|
* operation to copy from another storage account.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/copy-blob
|
|
*
|
|
* @param copySource - url to the source Azure Blob/File.
|
|
* @param options - Optional options to the Blob Start Copy From URL operation.
|
|
*/
|
|
async startCopyFromURL(copySource, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-startCopyFromURL", options, async (updatedOptions) => {
|
|
options.conditions = options.conditions || {};
|
|
options.sourceConditions = options.sourceConditions || {};
|
|
return utils_common_assertResponse(await this.blobContext.startCopyFromURL(copySource, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
sourceModifiedAccessConditions: {
|
|
sourceIfMatch: options.sourceConditions.ifMatch,
|
|
sourceIfModifiedSince: options.sourceConditions.ifModifiedSince,
|
|
sourceIfNoneMatch: options.sourceConditions.ifNoneMatch,
|
|
sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince,
|
|
sourceIfTags: options.sourceConditions.tagConditions,
|
|
},
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
rehydratePriority: options.rehydratePriority,
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
sealBlob: options.sealBlob,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Only available for BlobClient constructed with a shared key credential.
|
|
*
|
|
* Generates a Blob Service Shared Access Signature (SAS) URI based on the client properties
|
|
* and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateSasUrl(options) {
|
|
return new Promise((resolve) => {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
|
|
}
|
|
const sas = generateBlobSASQueryParameters({
|
|
containerName: this._containerName,
|
|
blobName: this._name,
|
|
snapshotTime: this._snapshot,
|
|
versionId: this._versionId,
|
|
...options,
|
|
}, this.credential).toString();
|
|
resolve(utils_common_appendToURLQuery(this.url, sas));
|
|
});
|
|
}
|
|
/**
|
|
* Only available for BlobClient constructed with a shared key credential.
|
|
*
|
|
* Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
|
|
* the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
generateSasStringToSign(options) {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
|
|
}
|
|
return generateBlobSASQueryParametersInternal({
|
|
containerName: this._containerName,
|
|
blobName: this._name,
|
|
snapshotTime: this._snapshot,
|
|
versionId: this._versionId,
|
|
...options,
|
|
}, this.credential).stringToSign;
|
|
}
|
|
/**
|
|
*
|
|
* Generates a Blob Service Shared Access Signature (SAS) URI based on
|
|
* the client properties and parameters passed in. The SAS is signed by the input user delegation key.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @param userDelegationKey - Return value of `blobServiceClient.getUserDelegationKey()`
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateUserDelegationSasUrl(options, userDelegationKey) {
|
|
return new Promise((resolve) => {
|
|
const sas = generateBlobSASQueryParameters({
|
|
containerName: this._containerName,
|
|
blobName: this._name,
|
|
snapshotTime: this._snapshot,
|
|
versionId: this._versionId,
|
|
...options,
|
|
}, userDelegationKey, this.accountName).toString();
|
|
resolve(utils_common_appendToURLQuery(this.url, sas));
|
|
});
|
|
}
|
|
/**
|
|
* Only available for BlobClient constructed with a shared key credential.
|
|
*
|
|
* Generates string to sign for a Blob Service Shared Access Signature (SAS) URI based on
|
|
* the client properties and parameters passed in. The SAS is signed by the input user delegation key.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @param userDelegationKey - Return value of `blobServiceClient.getUserDelegationKey()`
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateUserDelegationSasStringToSign(options, userDelegationKey) {
|
|
return generateBlobSASQueryParametersInternal({
|
|
containerName: this._containerName,
|
|
blobName: this._name,
|
|
snapshotTime: this._snapshot,
|
|
versionId: this._versionId,
|
|
...options,
|
|
}, userDelegationKey, this.accountName).stringToSign;
|
|
}
|
|
/**
|
|
* Delete the immutablility policy on the blob.
|
|
*
|
|
* @param options - Optional options to delete immutability policy on the blob.
|
|
*/
|
|
async deleteImmutabilityPolicy(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-deleteImmutabilityPolicy", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.deleteImmutabilityPolicy({
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Set immutability policy on the blob.
|
|
*
|
|
* @param options - Optional options to set immutability policy on the blob.
|
|
*/
|
|
async setImmutabilityPolicy(immutabilityPolicy, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-setImmutabilityPolicy", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setImmutabilityPolicy({
|
|
immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn,
|
|
immutabilityPolicyMode: immutabilityPolicy.policyMode,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Set legal hold on the blob.
|
|
*
|
|
* @param options - Optional options to set legal hold on the blob.
|
|
*/
|
|
async setLegalHold(legalHoldEnabled, options = {}) {
|
|
return tracingClient.withSpan("BlobClient-setLegalHold", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.setLegalHold(legalHoldEnabled, {
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* The Get Account Information operation returns the sku name and account kind
|
|
* for the specified account.
|
|
* The Get Account Information operation is available on service versions beginning
|
|
* with version 2018-03-28.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
|
|
*
|
|
* @param options - Options to the Service Get Account Info operation.
|
|
* @returns Response data for the Service Get Account Info operation.
|
|
*/
|
|
async getAccountInfo(options = {}) {
|
|
return tracingClient.withSpan("BlobClient-getAccountInfo", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blobContext.getAccountInfo({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* AppendBlobClient defines a set of operations applicable to append blobs.
|
|
*/
|
|
class AppendBlobClient extends BlobClient {
|
|
/**
|
|
* appendBlobsContext provided by protocol layer.
|
|
*/
|
|
appendBlobContext;
|
|
constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
// In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
|
|
// super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
|
|
let pipeline;
|
|
let url;
|
|
options = options || {};
|
|
if (isPipelineLike(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, pipeline: Pipeline)
|
|
url = urlOrConnectionString;
|
|
pipeline = credentialOrPipelineOrContainerName;
|
|
options = blobNameOrOptions;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipelineOrContainerName instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions) url = urlOrConnectionString;
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
pipeline = newPipeline(credentialOrPipelineOrContainerName, options);
|
|
}
|
|
else if (!credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName !== "string") {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
// The second parameter is undefined. Use anonymous credential.
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else if (credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName === "string" &&
|
|
blobNameOrOptions &&
|
|
typeof blobNameOrOptions === "string") {
|
|
// (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
|
|
const containerName = credentialOrPipelineOrContainerName;
|
|
const blobName = blobNameOrOptions;
|
|
const extractedCreds = utils_common_extractConnectionStringParts(urlOrConnectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
url = utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
pipeline = newPipeline(sharedKeyCredential, options);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
url =
|
|
utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
|
|
"?" +
|
|
extractedCreds.accountSas;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
else {
|
|
throw new Error("Expecting non-empty strings for containerName and blobName parameters");
|
|
}
|
|
super(url, pipeline);
|
|
this.appendBlobContext = this.storageClientContext.appendBlob;
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a new AppendBlobClient object identical to the source but with the
|
|
* specified snapshot timestamp.
|
|
* Provide "" will remove the snapshot and return a Client to the base blob.
|
|
*
|
|
* @param snapshot - The snapshot timestamp.
|
|
* @returns A new AppendBlobClient object identical to the source but with the specified snapshot timestamp.
|
|
*/
|
|
withSnapshot(snapshot) {
|
|
return new AppendBlobClient(utils_common_setURLParameter(this.url, utils_constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param options - Options to the Append Block Create operation.
|
|
*
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:ClientsCreateAppendBlob
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
*
|
|
* const appendBlobClient = containerClient.getAppendBlobClient(blobName);
|
|
* await appendBlobClient.create();
|
|
* ```
|
|
*/
|
|
async create(options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("AppendBlobClient-create", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.appendBlobContext.create(0, {
|
|
abortSignal: options.abortSignal,
|
|
blobHttpHeaders: options.blobHTTPHeaders,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Creates a 0-length append blob. Call AppendBlock to append data to an append blob.
|
|
* If the blob with the same name already exists, the content of the existing blob will remain unchanged.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param options -
|
|
*/
|
|
async createIfNotExists(options = {}) {
|
|
const conditions = { ifNoneMatch: ETagAny };
|
|
return tracingClient.withSpan("AppendBlobClient-createIfNotExists", options, async (updatedOptions) => {
|
|
try {
|
|
const res = utils_common_assertResponse(await this.create({
|
|
...updatedOptions,
|
|
conditions,
|
|
}));
|
|
return {
|
|
succeeded: true,
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (e.details?.errorCode === "BlobAlreadyExists") {
|
|
return {
|
|
succeeded: false,
|
|
...e.response?.parsedHeaders,
|
|
_response: e.response,
|
|
};
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Seals the append blob, making it read only.
|
|
*
|
|
* @param options -
|
|
*/
|
|
async seal(options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("AppendBlobClient-seal", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.appendBlobContext.seal({
|
|
abortSignal: options.abortSignal,
|
|
appendPositionAccessConditions: options.conditions,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Commits a new block of data to the end of the existing append blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/append-block
|
|
*
|
|
* @param body - Data to be appended.
|
|
* @param contentLength - Length of the body in bytes.
|
|
* @param options - Options to the Append Block operation.
|
|
*
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:ClientsAppendBlock
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
*
|
|
* const content = "Hello World!";
|
|
*
|
|
* // Create a new append blob and append data to the blob.
|
|
* const newAppendBlobClient = containerClient.getAppendBlobClient(blobName);
|
|
* await newAppendBlobClient.create();
|
|
* await newAppendBlobClient.appendBlock(content, content.length);
|
|
*
|
|
* // Append data to an existing append blob.
|
|
* const existingAppendBlobClient = containerClient.getAppendBlobClient(blobName);
|
|
* await existingAppendBlobClient.appendBlock(content, content.length);
|
|
* ```
|
|
*/
|
|
async appendBlock(body, contentLength, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("AppendBlobClient-appendBlock", options, async (updatedOptions) => {
|
|
const parameters = {
|
|
abortSignal: options.abortSignal,
|
|
appendPositionAccessConditions: options.conditions,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
requestOptions: {
|
|
onUploadProgress: options.onProgress,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
};
|
|
const uploadBodyParameters = await setUploadChecksumParameters(body, contentLength, parameters, options, this.blobClientConfig?.uploadContentChecksumAlgorithm);
|
|
return utils_common_assertResponse(await this.appendBlobContext.appendBlock(uploadBodyParameters.contentLength, uploadBodyParameters.body, parameters));
|
|
});
|
|
}
|
|
/**
|
|
* The Append Block operation commits a new block of data to the end of an existing append blob
|
|
* where the contents are read from a source url.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/append-block-from-url
|
|
*
|
|
* @param sourceURL -
|
|
* The url to the blob that will be the source of the copy. A source blob in the same storage account can
|
|
* be authenticated via Shared Key. However, if the source is a blob in another account, the source blob
|
|
* must either be public or must be authenticated via a shared access signature. If the source blob is
|
|
* public, no authentication is required to perform the operation.
|
|
* @param sourceOffset - Offset in source to be appended
|
|
* @param count - Number of bytes to be appended as a block
|
|
* @param options -
|
|
*/
|
|
async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
options.sourceConditions = options.sourceConditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("AppendBlobClient-appendBlockFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, {
|
|
abortSignal: options.abortSignal,
|
|
sourceRange: rangeToString({ offset: sourceOffset, count }),
|
|
sourceContentMD5: options.sourceContentMD5,
|
|
sourceContentCrc64: options.sourceContentCrc64,
|
|
leaseAccessConditions: options.conditions,
|
|
appendPositionAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
sourceModifiedAccessConditions: {
|
|
sourceIfMatch: options.sourceConditions?.ifMatch,
|
|
sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
|
|
sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
|
|
sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
|
|
},
|
|
copySourceAuthorization: utils_common_httpAuthorizationToString(options.sourceAuthorization),
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
fileRequestIntent: options.sourceShareTokenIntent,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
sourceCpkInfo: {
|
|
sourceEncryptionKey: options.sourceCustomerProvidedKey?.encryptionKey,
|
|
sourceEncryptionAlgorithm: options.sourceCustomerProvidedKey?.encryptionAlgorithm,
|
|
sourceEncryptionKeySha256: options.sourceCustomerProvidedKey?.encryptionKeySha256,
|
|
},
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* BlockBlobClient defines a set of operations applicable to block blobs.
|
|
*/
|
|
class BlockBlobClient extends BlobClient {
|
|
/**
|
|
* blobContext provided by protocol layer.
|
|
*
|
|
* Note. Ideally BlobClient should set BlobClient.blobContext to protected. However, API
|
|
* extractor has issue blocking that. Here we redecelare _blobContext in BlockBlobClient.
|
|
*/
|
|
_blobContext;
|
|
/**
|
|
* blockBlobContext provided by protocol layer.
|
|
*/
|
|
blockBlobContext;
|
|
constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
// In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
|
|
// super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
|
|
let pipeline;
|
|
let url;
|
|
options = options || {};
|
|
if (isPipelineLike(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, pipeline: Pipeline)
|
|
url = urlOrConnectionString;
|
|
pipeline = credentialOrPipelineOrContainerName;
|
|
options = blobNameOrOptions;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipelineOrContainerName instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
pipeline = newPipeline(credentialOrPipelineOrContainerName, options);
|
|
}
|
|
else if (!credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName !== "string") {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
// The second parameter is undefined. Use anonymous credential.
|
|
url = urlOrConnectionString;
|
|
if (blobNameOrOptions && typeof blobNameOrOptions !== "string") {
|
|
options = blobNameOrOptions;
|
|
}
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else if (credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName === "string" &&
|
|
blobNameOrOptions &&
|
|
typeof blobNameOrOptions === "string") {
|
|
// (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
|
|
const containerName = credentialOrPipelineOrContainerName;
|
|
const blobName = blobNameOrOptions;
|
|
const extractedCreds = utils_common_extractConnectionStringParts(urlOrConnectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
url = utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
pipeline = newPipeline(sharedKeyCredential, options);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
url =
|
|
utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
|
|
"?" +
|
|
extractedCreds.accountSas;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
else {
|
|
throw new Error("Expecting non-empty strings for containerName and blobName parameters");
|
|
}
|
|
super(url, pipeline);
|
|
this.blockBlobContext = this.storageClientContext.blockBlob;
|
|
this._blobContext = this.storageClientContext.blob;
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a new BlockBlobClient object identical to the source but with the
|
|
* specified snapshot timestamp.
|
|
* Provide "" will remove the snapshot and return a URL to the base blob.
|
|
*
|
|
* @param snapshot - The snapshot timestamp.
|
|
* @returns A new BlockBlobClient object identical to the source but with the specified snapshot timestamp.
|
|
*/
|
|
withSnapshot(snapshot) {
|
|
return new BlockBlobClient(utils_common_setURLParameter(this.url, utils_constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Quick query for a JSON or CSV formatted blob.
|
|
*
|
|
* Example usage (Node.js):
|
|
*
|
|
* ```ts snippet:ClientsQuery
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
* import { buffer } from "node:stream/consumers";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blockBlobClient = containerClient.getBlockBlobClient(blobName);
|
|
*
|
|
* // Query and convert a blob to a string
|
|
* const queryBlockBlobResponse = await blockBlobClient.query("select from BlobStorage");
|
|
* if (queryBlockBlobResponse.readableStreamBody) {
|
|
* // Read the response bytes. Use `text` from "node:stream/consumers" instead
|
|
* // if you want the response as a string directly.
|
|
* const downloadedBuffer = await buffer(queryBlockBlobResponse.readableStreamBody);
|
|
* console.log(`Query blob content: ${downloadedBuffer.toString()}`);
|
|
* }
|
|
* ```
|
|
*
|
|
* @param query -
|
|
* @param options -
|
|
*/
|
|
async query(query, options = {}) {
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
if (!esm_isNodeLike) {
|
|
throw new Error("This operation currently is only supported in Node.js.");
|
|
}
|
|
return tracingClient.withSpan("BlockBlobClient-query", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse((await this._blobContext.query({
|
|
abortSignal: options.abortSignal,
|
|
queryRequest: {
|
|
queryType: "SQL",
|
|
expression: query,
|
|
inputSerialization: toQuerySerialization(options.inputTextConfiguration),
|
|
outputSerialization: toQuerySerialization(options.outputTextConfiguration),
|
|
},
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
})));
|
|
return new BlobQueryResponse(response, {
|
|
abortSignal: options.abortSignal,
|
|
onProgress: options.onProgress,
|
|
onError: options.onError,
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* Creates a new block blob, or updates the content of an existing block blob.
|
|
* Updating an existing block blob overwrites any existing metadata on the blob.
|
|
* Partial updates are not supported; the content of the existing blob is
|
|
* overwritten with the new content. To perform a partial update of a block blob's,
|
|
* use {@link stageBlock} and {@link commitBlockList}.
|
|
*
|
|
* This is a non-parallel uploading method, please use {@link uploadFile},
|
|
* {@link uploadStream} or {@link uploadBrowserData} for better performance
|
|
* with concurrency uploading.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
|
|
* which returns a new Readable stream whose offset is from data source beginning.
|
|
* @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
|
|
* string including non non-Base64/Hex-encoded characters.
|
|
* @param options - Options to the Block Blob Upload operation.
|
|
* @returns Response data for the Block Blob Upload operation.
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:ClientsUpload
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blockBlobClient = containerClient.getBlockBlobClient(blobName);
|
|
*
|
|
* const content = "Hello world!";
|
|
* const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
|
|
* ```
|
|
*/
|
|
async upload(body, contentLength, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlockBlobClient-upload", options, async (updatedOptions) => {
|
|
const parameters = {
|
|
abortSignal: options.abortSignal,
|
|
blobHttpHeaders: options.blobHTTPHeaders,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
requestOptions: {
|
|
onUploadProgress: options.onProgress,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
};
|
|
const uploadBodyParameters = await setUploadChecksumParameters(body, contentLength, parameters, options, this.blobClientConfig?.uploadContentChecksumAlgorithm);
|
|
return utils_common_assertResponse(await this.blockBlobContext.upload(uploadBodyParameters.contentLength, uploadBodyParameters.body, parameters));
|
|
});
|
|
}
|
|
/**
|
|
* Creates a new Block Blob where the contents of the blob are read from a given URL.
|
|
* This API is supported beginning with the 2020-04-08 version. Partial updates
|
|
* are not supported with Put Blob from URL; the content of an existing blob is overwritten with
|
|
* the content of the new blob. To perform partial updates to a block blob’s contents using a
|
|
* source URL, use {@link stageBlockFromURL} and {@link commitBlockList}.
|
|
*
|
|
* @param sourceURL - Specifies the URL of the blob. The value
|
|
* may be a URL of up to 2 KB in length that specifies a blob.
|
|
* The value should be URL-encoded as it would appear
|
|
* in a request URI. The source blob must either be public
|
|
* or must be authenticated via a shared access signature.
|
|
* If the source blob is public, no authentication is required
|
|
* to perform the operation. Here are some examples of source object URLs:
|
|
* - https://myaccount.blob.core.windows.net/mycontainer/myblob
|
|
* - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>
|
|
* @param options - Optional parameters.
|
|
*/
|
|
async syncUploadFromURL(sourceURL, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlockBlobClient-syncUploadFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blockBlobContext.putBlobFromUrl(0, sourceURL, {
|
|
...options,
|
|
blobHttpHeaders: options.blobHTTPHeaders,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
sourceModifiedAccessConditions: {
|
|
sourceIfMatch: options.sourceConditions?.ifMatch,
|
|
sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
|
|
sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
|
|
sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
|
|
sourceIfTags: options.sourceConditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
copySourceAuthorization: utils_common_httpAuthorizationToString(options.sourceAuthorization),
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
copySourceTags: options.copySourceTags,
|
|
fileRequestIntent: options.sourceShareTokenIntent,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
sourceCpkInfo: {
|
|
sourceEncryptionKey: options.sourceCustomerProvidedKey?.encryptionKey,
|
|
sourceEncryptionAlgorithm: options.sourceCustomerProvidedKey?.encryptionAlgorithm,
|
|
sourceEncryptionKeySha256: options.sourceCustomerProvidedKey?.encryptionKeySha256,
|
|
},
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Uploads the specified block to the block blob's "staging area" to be later
|
|
* committed by a call to commitBlockList.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-block
|
|
*
|
|
* @param blockId - A 64-byte value that is base64-encoded
|
|
* @param body - Data to upload to the staging area.
|
|
* @param contentLength - Number of bytes to upload.
|
|
* @param options - Options to the Block Blob Stage Block operation.
|
|
* @returns Response data for the Block Blob Stage Block operation.
|
|
*/
|
|
async stageBlock(blockId, body, contentLength, options = {}) {
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlockBlobClient-stageBlock", options, async (updatedOptions) => {
|
|
const parameters = {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
requestOptions: {
|
|
onUploadProgress: options.onProgress,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
};
|
|
const uploadBodyParameters = await setUploadChecksumParameters(body, contentLength, parameters, options, this.blobClientConfig?.uploadContentChecksumAlgorithm);
|
|
return utils_common_assertResponse(await this.blockBlobContext.stageBlock(blockId, uploadBodyParameters.contentLength, uploadBodyParameters.body, parameters));
|
|
});
|
|
}
|
|
/**
|
|
* The Stage Block From URL operation creates a new block to be committed as part
|
|
* of a blob where the contents are read from a URL.
|
|
* This API is available starting in version 2018-03-28.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-block-from-url
|
|
*
|
|
* @param blockId - A 64-byte value that is base64-encoded
|
|
* @param sourceURL - Specifies the URL of the blob. The value
|
|
* may be a URL of up to 2 KB in length that specifies a blob.
|
|
* The value should be URL-encoded as it would appear
|
|
* in a request URI. The source blob must either be public
|
|
* or must be authenticated via a shared access signature.
|
|
* If the source blob is public, no authentication is required
|
|
* to perform the operation. Here are some examples of source object URLs:
|
|
* - https://myaccount.blob.core.windows.net/mycontainer/myblob
|
|
* - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>
|
|
* @param offset - From which position of the blob to download, greater than or equal to 0
|
|
* @param count - How much data to be downloaded, greater than 0. Will download to the end when undefined
|
|
* @param options - Options to the Block Blob Stage Block From URL operation.
|
|
* @returns Response data for the Block Blob Stage Block From URL operation.
|
|
*/
|
|
async stageBlockFromURL(blockId, sourceURL, offset = 0, count, options = {}) {
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlockBlobClient-stageBlockFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blockBlobContext.stageBlockFromURL(blockId, 0, sourceURL, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
sourceContentMD5: options.sourceContentMD5,
|
|
sourceContentCrc64: options.sourceContentCrc64,
|
|
sourceRange: offset === 0 && !count ? undefined : rangeToString({ offset, count }),
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
copySourceAuthorization: utils_common_httpAuthorizationToString(options.sourceAuthorization),
|
|
fileRequestIntent: options.sourceShareTokenIntent,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
sourceCpkInfo: {
|
|
sourceEncryptionKey: options.sourceCustomerProvidedKey?.encryptionKey,
|
|
sourceEncryptionAlgorithm: options.sourceCustomerProvidedKey?.encryptionAlgorithm,
|
|
sourceEncryptionKeySha256: options.sourceCustomerProvidedKey?.encryptionKeySha256,
|
|
},
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Writes a blob by specifying the list of block IDs that make up the blob.
|
|
* In order to be written as part of a blob, a block must have been successfully written
|
|
* to the server in a prior {@link stageBlock} operation. You can call {@link commitBlockList} to
|
|
* update a blob by uploading only those blocks that have changed, then committing the new and existing
|
|
* blocks together. Any blocks not specified in the block list and permanently deleted.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-block-list
|
|
*
|
|
* @param blocks - Array of 64-byte value that is base64-encoded
|
|
* @param options - Options to the Block Blob Commit Block List operation.
|
|
* @returns Response data for the Block Blob Commit Block List operation.
|
|
*/
|
|
async commitBlockList(blocks, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("BlockBlobClient-commitBlockList", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.blockBlobContext.commitBlockList({ latest: blocks }, {
|
|
abortSignal: options.abortSignal,
|
|
blobHttpHeaders: options.blobHTTPHeaders,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Returns the list of blocks that have been uploaded as part of a block blob
|
|
* using the specified block list filter.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-block-list
|
|
*
|
|
* @param listType - Specifies whether to return the list of committed blocks,
|
|
* the list of uncommitted blocks, or both lists together.
|
|
* @param options - Options to the Block Blob Get Block List operation.
|
|
* @returns Response data for the Block Blob Get Block List operation.
|
|
*/
|
|
async getBlockList(listType, options = {}) {
|
|
return tracingClient.withSpan("BlockBlobClient-getBlockList", options, async (updatedOptions) => {
|
|
const res = utils_common_assertResponse(await this.blockBlobContext.getBlockList(listType, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
if (!res.committedBlocks) {
|
|
res.committedBlocks = [];
|
|
}
|
|
if (!res.uncommittedBlocks) {
|
|
res.uncommittedBlocks = [];
|
|
}
|
|
return res;
|
|
});
|
|
}
|
|
// High level functions
|
|
/**
|
|
* Uploads a Buffer(Node.js)/Blob(browsers)/ArrayBuffer/ArrayBufferView object to a BlockBlob.
|
|
*
|
|
* When data length is no more than the specifiled {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
|
|
* {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
|
|
* Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
|
|
* to commit the block list.
|
|
*
|
|
* A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
|
|
* `blobContentType`, enabling the browser to provide
|
|
* functionality based on file type.
|
|
*
|
|
* @param data - Buffer(Node.js), Blob, ArrayBuffer or ArrayBufferView
|
|
* @param options -
|
|
*/
|
|
async uploadData(data, options = {}) {
|
|
return tracingClient.withSpan("BlockBlobClient-uploadData", options, async (updatedOptions) => {
|
|
if (esm_isNodeLike) {
|
|
let buffer;
|
|
if (data instanceof Buffer) {
|
|
buffer = data;
|
|
}
|
|
else if (data instanceof ArrayBuffer) {
|
|
buffer = Buffer.from(data);
|
|
}
|
|
else {
|
|
data = data;
|
|
buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
|
|
}
|
|
return this.uploadSeekableInternal((offset, size) => buffer.slice(offset, offset + size), buffer.byteLength, updatedOptions);
|
|
}
|
|
else {
|
|
const browserBlob = new Blob([data]);
|
|
return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN BROWSERS.
|
|
*
|
|
* Uploads a browser Blob/File/ArrayBuffer/ArrayBufferView object to block blob.
|
|
*
|
|
* When buffer length lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
|
|
* Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call
|
|
* {@link commitBlockList} to commit the block list.
|
|
*
|
|
* A common {@link BlockBlobParallelUploadOptions.blobHTTPHeaders} option to set is
|
|
* `blobContentType`, enabling the browser to provide
|
|
* functionality based on file type.
|
|
*
|
|
* @deprecated Use {@link uploadData} instead.
|
|
*
|
|
* @param browserData - Blob, File, ArrayBuffer or ArrayBufferView
|
|
* @param options - Options to upload browser data.
|
|
* @returns Response data for the Blob Upload operation.
|
|
*/
|
|
async uploadBrowserData(browserData, options = {}) {
|
|
return tracingClient.withSpan("BlockBlobClient-uploadBrowserData", options, async (updatedOptions) => {
|
|
const browserBlob = new Blob([browserData]);
|
|
return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions);
|
|
});
|
|
}
|
|
/**
|
|
*
|
|
* Uploads data to block blob. Requires a bodyFactory as the data source,
|
|
* which need to return a {@link HttpRequestBody} object with the offset and size provided.
|
|
*
|
|
* When data length is no more than the specified {@link BlockBlobParallelUploadOptions.maxSingleShotSize} (default is
|
|
* {@link BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}), this method will use 1 {@link upload} call to finish the upload.
|
|
* Otherwise, this method will call {@link stageBlock} to upload blocks, and finally call {@link commitBlockList}
|
|
* to commit the block list.
|
|
*
|
|
* @param bodyFactory -
|
|
* @param size - size of the data to upload.
|
|
* @param options - Options to Upload to Block Blob operation.
|
|
* @returns Response data for the Blob Upload operation.
|
|
*/
|
|
async uploadSeekableInternal(bodyFactory, size, options = {}) {
|
|
let blockSize = options.blockSize ?? 0;
|
|
if (blockSize < 0 || blockSize > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) {
|
|
throw new RangeError(`blockSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`);
|
|
}
|
|
const maxSingleShotSize = options.maxSingleShotSize ?? BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES;
|
|
if (maxSingleShotSize < 0 || maxSingleShotSize > BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) {
|
|
throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`);
|
|
}
|
|
if (blockSize === 0) {
|
|
if (size > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * BLOCK_BLOB_MAX_BLOCKS) {
|
|
throw new RangeError(`${size} is too larger to upload to a block blob.`);
|
|
}
|
|
if (size > maxSingleShotSize) {
|
|
blockSize = Math.ceil(size / BLOCK_BLOB_MAX_BLOCKS);
|
|
if (blockSize < DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) {
|
|
blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES;
|
|
}
|
|
}
|
|
}
|
|
if (!options.blobHTTPHeaders) {
|
|
options.blobHTTPHeaders = {};
|
|
}
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("BlockBlobClient-uploadSeekableInternal", options, async (updatedOptions) => {
|
|
if (size <= maxSingleShotSize) {
|
|
return utils_common_assertResponse(await this.upload(bodyFactory(0, size), size, updatedOptions));
|
|
}
|
|
const numBlocks = Math.floor((size - 1) / blockSize) + 1;
|
|
if (numBlocks > BLOCK_BLOB_MAX_BLOCKS) {
|
|
throw new RangeError(`The buffer's size is too big or the BlockSize is too small;` +
|
|
`the number of blocks must be <= ${BLOCK_BLOB_MAX_BLOCKS}`);
|
|
}
|
|
const blockList = [];
|
|
const blockIDPrefix = esm_randomUUID();
|
|
let transferProgress = 0;
|
|
const batch = new Batch(options.concurrency);
|
|
for (let i = 0; i < numBlocks; i++) {
|
|
batch.addOperation(async () => {
|
|
const blockID = utils_common_generateBlockID(blockIDPrefix, i);
|
|
const start = blockSize * i;
|
|
const end = i === numBlocks - 1 ? size : start + blockSize;
|
|
const contentLength = end - start;
|
|
blockList.push(blockID);
|
|
await this.stageBlock(blockID, bodyFactory(start, contentLength), contentLength, {
|
|
abortSignal: options.abortSignal,
|
|
conditions: options.conditions,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
contentChecksumAlgorithm: options.contentChecksumAlgorithm,
|
|
});
|
|
// Update progress after block is successfully uploaded to server, in case of block trying
|
|
// TODO: Hook with convenience layer progress event in finer level
|
|
transferProgress += contentLength;
|
|
if (options.onProgress) {
|
|
options.onProgress({
|
|
loadedBytes: transferProgress,
|
|
});
|
|
}
|
|
});
|
|
}
|
|
await batch.do();
|
|
return this.commitBlockList(blockList, updatedOptions);
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Uploads a local file in blocks to a block blob.
|
|
*
|
|
* When file size lesser than or equal to 256MB, this method will use 1 upload call to finish the upload.
|
|
* Otherwise, this method will call stageBlock to upload blocks, and finally call commitBlockList
|
|
* to commit the block list.
|
|
*
|
|
* @param filePath - Full path of local file
|
|
* @param options - Options to Upload to Block Blob operation.
|
|
* @returns Response data for the Blob Upload operation.
|
|
*/
|
|
async uploadFile(filePath, options = {}) {
|
|
return tracingClient.withSpan("BlockBlobClient-uploadFile", options, async (updatedOptions) => {
|
|
const size = (await fsStat(filePath)).size;
|
|
return this.uploadSeekableInternal((offset, count) => {
|
|
return () => fsCreateReadStream(filePath, {
|
|
autoClose: true,
|
|
end: count ? offset + count - 1 : Infinity,
|
|
start: offset,
|
|
});
|
|
}, size, {
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Uploads a Node.js Readable stream into block blob.
|
|
*
|
|
* PERFORMANCE IMPROVEMENT TIPS:
|
|
* * Input stream highWaterMark is better to set a same value with bufferSize
|
|
* parameter, which will avoid Buffer.concat() operations.
|
|
*
|
|
* @param stream - Node.js Readable stream
|
|
* @param bufferSize - Size of every buffer allocated, also the block size in the uploaded block blob. Default value is 8MB
|
|
* @param maxConcurrency - Max concurrency indicates the max number of buffers that can be allocated,
|
|
* positive correlation with max uploading concurrency. Default value is 5
|
|
* @param options - Options to Upload Stream to Block Blob operation.
|
|
* @returns Response data for the Blob Upload operation.
|
|
*/
|
|
async uploadStream(stream, bufferSize = DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) {
|
|
if (!options.blobHTTPHeaders) {
|
|
options.blobHTTPHeaders = {};
|
|
}
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("BlockBlobClient-uploadStream", options, async (updatedOptions) => {
|
|
let blockNum = 0;
|
|
const blockIDPrefix = esm_randomUUID();
|
|
let transferProgress = 0;
|
|
const blockList = [];
|
|
const scheduler = new BufferScheduler(stream, bufferSize, maxConcurrency, async (body, length) => {
|
|
const blockID = utils_common_generateBlockID(blockIDPrefix, blockNum);
|
|
blockList.push(blockID);
|
|
blockNum++;
|
|
await this.stageBlock(blockID, body, length, {
|
|
customerProvidedKey: options.customerProvidedKey,
|
|
conditions: options.conditions,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
contentChecksumAlgorithm: options.contentChecksumAlgorithm,
|
|
});
|
|
// Update progress after block is successfully uploaded to server, in case of block trying
|
|
transferProgress += length;
|
|
if (options.onProgress) {
|
|
options.onProgress({ loadedBytes: transferProgress });
|
|
}
|
|
},
|
|
// concurrency should set a smaller value than maxConcurrency, which is helpful to
|
|
// reduce the possibility when a outgoing handler waits for stream data, in
|
|
// this situation, outgoing handlers are blocked.
|
|
// Outgoing queue shouldn't be empty.
|
|
Math.ceil((maxConcurrency / 4) * 3));
|
|
await scheduler.do();
|
|
return utils_common_assertResponse(await this.commitBlockList(blockList, {
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* PageBlobClient defines a set of operations applicable to page blobs.
|
|
*/
|
|
class PageBlobClient extends BlobClient {
|
|
/**
|
|
* pageBlobsContext provided by protocol layer.
|
|
*/
|
|
pageBlobContext;
|
|
constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
// In TypeScript we cannot simply pass all parameters to super() like below so have to duplicate the code instead.
|
|
// super(s, credentialOrPipelineOrContainerNameOrOptions, blobNameOrOptions, options);
|
|
let pipeline;
|
|
let url;
|
|
options = options || {};
|
|
if (isPipelineLike(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, pipeline: Pipeline)
|
|
url = urlOrConnectionString;
|
|
pipeline = credentialOrPipelineOrContainerName;
|
|
options = blobNameOrOptions;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipelineOrContainerName instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
pipeline = newPipeline(credentialOrPipelineOrContainerName, options);
|
|
}
|
|
else if (!credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName !== "string") {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
// The second parameter is undefined. Use anonymous credential.
|
|
url = urlOrConnectionString;
|
|
options = blobNameOrOptions;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else if (credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName === "string" &&
|
|
blobNameOrOptions &&
|
|
typeof blobNameOrOptions === "string") {
|
|
// (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
|
|
const containerName = credentialOrPipelineOrContainerName;
|
|
const blobName = blobNameOrOptions;
|
|
const extractedCreds = utils_common_extractConnectionStringParts(urlOrConnectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
url = utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName));
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
pipeline = newPipeline(sharedKeyCredential, options);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
url =
|
|
utils_common_appendToURLPath(utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) +
|
|
"?" +
|
|
extractedCreds.accountSas;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
else {
|
|
throw new Error("Expecting non-empty strings for containerName and blobName parameters");
|
|
}
|
|
super(url, pipeline);
|
|
this.pageBlobContext = this.storageClientContext.pageBlob;
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a new PageBlobClient object identical to the source but with the
|
|
* specified snapshot timestamp.
|
|
* Provide "" will remove the snapshot and return a Client to the base blob.
|
|
*
|
|
* @param snapshot - The snapshot timestamp.
|
|
* @returns A new PageBlobClient object identical to the source but with the specified snapshot timestamp.
|
|
*/
|
|
withSnapshot(snapshot) {
|
|
return new PageBlobClient(utils_common_setURLParameter(this.url, utils_constants_URLConstants.Parameters.SNAPSHOT, snapshot.length === 0 ? undefined : snapshot), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a page blob of the specified length. Call uploadPages to upload data
|
|
* data to a page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param size - size of the page blob.
|
|
* @param options - Options to the Page Blob Create operation.
|
|
* @returns Response data for the Page Blob Create operation.
|
|
*/
|
|
async create(size, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("PageBlobClient-create", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.create(0, size, {
|
|
abortSignal: options.abortSignal,
|
|
blobHttpHeaders: options.blobHTTPHeaders,
|
|
blobSequenceNumber: options.blobSequenceNumber,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata: options.metadata,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
immutabilityPolicyExpiry: options.immutabilityPolicy?.expiriesOn,
|
|
immutabilityPolicyMode: options.immutabilityPolicy?.policyMode,
|
|
legalHold: options.legalHold,
|
|
tier: toAccessTier(options.tier),
|
|
blobTagsString: toBlobTagsString(options.tags),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Creates a page blob of the specified length. Call uploadPages to upload data
|
|
* data to a page blob. If the blob with the same name already exists, the content
|
|
* of the existing blob will remain unchanged.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param size - size of the page blob.
|
|
* @param options -
|
|
*/
|
|
async createIfNotExists(size, options = {}) {
|
|
return tracingClient.withSpan("PageBlobClient-createIfNotExists", options, async (updatedOptions) => {
|
|
try {
|
|
const conditions = { ifNoneMatch: ETagAny };
|
|
const res = utils_common_assertResponse(await this.create(size, {
|
|
...options,
|
|
conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return {
|
|
succeeded: true,
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (e.details?.errorCode === "BlobAlreadyExists") {
|
|
return {
|
|
succeeded: false,
|
|
...e.response?.parsedHeaders,
|
|
_response: e.response,
|
|
};
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Writes 1 or more pages to the page blob. The start and end offsets must be a multiple of 512.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-page
|
|
*
|
|
* @param body - Data to upload
|
|
* @param offset - Offset of destination page blob
|
|
* @param count - Content length of the body, also number of bytes to be uploaded
|
|
* @param options - Options to the Page Blob Upload Pages operation.
|
|
* @returns Response data for the Page Blob Upload Pages operation.
|
|
*/
|
|
async uploadPages(body, offset, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("PageBlobClient-uploadPages", options, async (updatedOptions) => {
|
|
const parameters = {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
requestOptions: {
|
|
onUploadProgress: options.onProgress,
|
|
},
|
|
range: rangeToString({ offset, count }),
|
|
sequenceNumberAccessConditions: options.conditions,
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
};
|
|
const uploadBodyParameters = await setUploadChecksumParameters(body, count, parameters, options, this.blobClientConfig?.uploadContentChecksumAlgorithm);
|
|
return utils_common_assertResponse(await this.pageBlobContext.uploadPages(uploadBodyParameters.contentLength, uploadBodyParameters.body, parameters));
|
|
});
|
|
}
|
|
/**
|
|
* The Upload Pages operation writes a range of pages to a page blob where the
|
|
* contents are read from a URL.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-page-from-url
|
|
*
|
|
* @param sourceURL - Specify a URL to the copy source, Shared Access Signature(SAS) maybe needed for authentication
|
|
* @param sourceOffset - The source offset to copy from. Pass 0 to copy from the beginning of source page blob
|
|
* @param destOffset - Offset of destination page blob
|
|
* @param count - Number of bytes to be uploaded from source page blob
|
|
* @param options -
|
|
*/
|
|
async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
options.sourceConditions = options.sourceConditions || {};
|
|
ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps);
|
|
return tracingClient.withSpan("PageBlobClient-uploadPagesFromURL", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.uploadPagesFromURL(sourceURL, rangeToString({ offset: sourceOffset, count }), 0, rangeToString({ offset: destOffset, count }), {
|
|
abortSignal: options.abortSignal,
|
|
sourceContentMD5: options.sourceContentMD5,
|
|
sourceContentCrc64: options.sourceContentCrc64,
|
|
leaseAccessConditions: options.conditions,
|
|
sequenceNumberAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
sourceModifiedAccessConditions: {
|
|
sourceIfMatch: options.sourceConditions?.ifMatch,
|
|
sourceIfModifiedSince: options.sourceConditions?.ifModifiedSince,
|
|
sourceIfNoneMatch: options.sourceConditions?.ifNoneMatch,
|
|
sourceIfUnmodifiedSince: options.sourceConditions?.ifUnmodifiedSince,
|
|
},
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
copySourceAuthorization: utils_common_httpAuthorizationToString(options.sourceAuthorization),
|
|
fileRequestIntent: options.sourceShareTokenIntent,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
sourceCpkInfo: {
|
|
sourceEncryptionKey: options.sourceCustomerProvidedKey?.encryptionKey,
|
|
sourceEncryptionAlgorithm: options.sourceCustomerProvidedKey?.encryptionAlgorithm,
|
|
sourceEncryptionKeySha256: options.sourceCustomerProvidedKey?.encryptionKeySha256,
|
|
},
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Frees the specified pages from the page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-page
|
|
*
|
|
* @param offset - Starting byte position of the pages to clear.
|
|
* @param count - Number of bytes to clear.
|
|
* @param options - Options to the Page Blob Clear Pages operation.
|
|
* @returns Response data for the Page Blob Clear Pages operation.
|
|
*/
|
|
async clearPages(offset = 0, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-clearPages", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.clearPages(0, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
range: rangeToString({ offset, count }),
|
|
sequenceNumberAccessConditions: options.conditions,
|
|
cpkInfo: options.customerProvidedKey,
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Returns the list of valid page ranges for a page blob or snapshot of a page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param options - Options to the Page Blob Get Ranges operation.
|
|
* @returns Response data for the Page Blob Get Ranges operation.
|
|
*/
|
|
async getPageRanges(offset = 0, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-getPageRanges", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.pageBlobContext.getPageRanges({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
range: rangeToString({ offset, count }),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return rangeResponseFromModel(response);
|
|
});
|
|
}
|
|
/**
|
|
* getPageRangesSegment returns a single segment of page ranges starting from the
|
|
* specified Marker. Use an empty Marker to start enumeration from the beginning.
|
|
* After getting a segment, process it, and then call getPageRangesSegment again
|
|
* (passing the the previously-returned Marker) to get the next segment.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
|
|
* @param options - Options to PageBlob Get Page Ranges Segment operation.
|
|
*/
|
|
async listPageRangesSegment(offset = 0, count, marker, options = {}) {
|
|
return tracingClient.withSpan("PageBlobClient-getPageRangesSegment", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.getPageRanges({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
range: rangeToString({ offset, count }),
|
|
marker: marker,
|
|
maxPageSize: options.maxPageSize,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesResponseModel}
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the get of page ranges to be returned with the next getting operation. The
|
|
* operation returns the ContinuationToken value within the response body if the
|
|
* getting operation did not return all page ranges remaining within the current page.
|
|
* The ContinuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of get
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to List Page Ranges operation.
|
|
*/
|
|
async *listPageRangeItemSegments(offset = 0, count, marker, options = {}) {
|
|
let getPageRangeItemSegmentsResponse;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
getPageRangeItemSegmentsResponse = await this.listPageRangesSegment(offset, count, marker, options);
|
|
marker = getPageRangeItemSegmentsResponse.continuationToken;
|
|
yield await getPageRangeItemSegmentsResponse;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param options - Options to List Page Ranges operation.
|
|
*/
|
|
async *listPageRangeItems(offset = 0, count, options = {}) {
|
|
let marker;
|
|
for await (const getPageRangesSegment of this.listPageRangeItemSegments(offset, count, marker, options)) {
|
|
yield* ExtractPageRangeInfoItems(getPageRangesSegment);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to list of page ranges for a page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* .byPage() returns an async iterable iterator to list of page ranges for a page blob.
|
|
*
|
|
* ```ts snippet:ClientsListPageBlobs
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const pageBlobClient = containerClient.getPageBlobClient(blobName);
|
|
*
|
|
* // Example using `for await` syntax
|
|
* let i = 1;
|
|
* for await (const pageRange of pageBlobClient.listPageRanges()) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
*
|
|
* // Example using `iter.next()` syntax
|
|
* i = 1;
|
|
* const iter = pageBlobClient.listPageRanges();
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Example using `byPage()` syntax
|
|
* i = 1;
|
|
* for await (const page of pageBlobClient.listPageRanges().byPage({ maxPageSize: 20 })) {
|
|
* for (const pageRange of page.pageRange || []) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using paging with a marker
|
|
* i = 1;
|
|
* let iterator = pageBlobClient.listPageRanges().byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 page ranges
|
|
* if (response.pageRange) {
|
|
* for (const pageRange of response.pageRange) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = pageBlobClient.listPageRanges().byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
* // Prints 10 page ranges
|
|
* if (response.pageRange) {
|
|
* for (const pageRange of response.pageRange) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param options - Options to the Page Blob Get Ranges operation.
|
|
* @returns An asyncIterableIterator that supports paging.
|
|
*/
|
|
listPageRanges(offset = 0, count, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
// AsyncIterableIterator to iterate over blobs
|
|
const iter = this.listPageRangeItems(offset, count, options);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.listPageRangeItemSegments(offset, count, settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...options,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Gets the collection of page ranges that differ between a specified snapshot and this page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* @param offset - Starting byte position of the page blob
|
|
* @param count - Number of bytes to get ranges diff.
|
|
* @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
|
|
* @param options - Options to the Page Blob Get Page Ranges Diff operation.
|
|
* @returns Response data for the Page Blob Get Page Range Diff operation.
|
|
*/
|
|
async getPageRangesDiff(offset, count, prevSnapshot, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-getPageRangesDiff", options, async (updatedOptions) => {
|
|
const result = utils_common_assertResponse(await this.pageBlobContext.getPageRangesDiff({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
prevsnapshot: prevSnapshot,
|
|
range: rangeToString({ offset, count }),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return rangeResponseFromModel(result);
|
|
});
|
|
}
|
|
/**
|
|
* getPageRangesDiffSegment returns a single segment of page ranges starting from the
|
|
* specified Marker for difference between previous snapshot and the target page blob.
|
|
* Use an empty Marker to start enumeration from the beginning.
|
|
* After getting a segment, process it, and then call getPageRangesDiffSegment again
|
|
* (passing the the previously-returned Marker) to get the next segment.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
|
|
* @param marker - A string value that identifies the portion of the get to be returned with the next get operation.
|
|
* @param options - Options to the Page Blob Get Page Ranges Diff operation.
|
|
*/
|
|
async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options = {}) {
|
|
return tracingClient.withSpan("PageBlobClient-getPageRangesDiffSegment", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.getPageRangesDiff({
|
|
abortSignal: options?.abortSignal,
|
|
leaseAccessConditions: options?.conditions,
|
|
modifiedAccessConditions: {
|
|
...options?.conditions,
|
|
ifTags: options?.conditions?.tagConditions,
|
|
},
|
|
prevsnapshot: prevSnapshotOrUrl,
|
|
range: rangeToString({
|
|
offset: offset,
|
|
count: count,
|
|
}),
|
|
marker: marker,
|
|
maxPageSize: options?.maxPageSize,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for {@link PageBlobGetPageRangesDiffResponseModel}
|
|
*
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the get of page ranges to be returned with the next getting operation. The
|
|
* operation returns the ContinuationToken value within the response body if the
|
|
* getting operation did not return all page ranges remaining within the current page.
|
|
* The ContinuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of get
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to the Page Blob Get Page Ranges Diff operation.
|
|
*/
|
|
async *listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options) {
|
|
let getPageRangeItemSegmentsResponse;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
getPageRangeItemSegmentsResponse = await this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker, options);
|
|
marker = getPageRangeItemSegmentsResponse.continuationToken;
|
|
yield await getPageRangeItemSegmentsResponse;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator of {@link PageRangeInfo} objects
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param prevSnapshotOrUrl - Timestamp of snapshot to retrieve the difference or URL of snapshot to retrieve the difference.
|
|
* @param options - Options to the Page Blob Get Page Ranges Diff operation.
|
|
*/
|
|
async *listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) {
|
|
let marker;
|
|
for await (const getPageRangesSegment of this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker, options)) {
|
|
yield* ExtractPageRangeInfoItems(getPageRangesSegment);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* .byPage() returns an async iterable iterator to list of page ranges that differ between a specified snapshot and this page blob.
|
|
*
|
|
* ```ts snippet:ClientsListPageBlobsDiff
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const pageBlobClient = containerClient.getPageBlobClient(blobName);
|
|
*
|
|
* const offset = 0;
|
|
* const count = 1024;
|
|
* const previousSnapshot = "<previous snapshot>";
|
|
* // Example using `for await` syntax
|
|
* let i = 1;
|
|
* for await (const pageRange of pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot)) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
*
|
|
* // Example using `iter.next()` syntax
|
|
* i = 1;
|
|
* const iter = pageBlobClient.listPageRangesDiff(offset, count, previousSnapshot);
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Page range ${i++}: ${value.start} - ${value.end}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Example using `byPage()` syntax
|
|
* i = 1;
|
|
* for await (const page of pageBlobClient
|
|
* .listPageRangesDiff(offset, count, previousSnapshot)
|
|
* .byPage({ maxPageSize: 20 })) {
|
|
* for (const pageRange of page.pageRange || []) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using paging with a marker
|
|
* i = 1;
|
|
* let iterator = pageBlobClient
|
|
* .listPageRangesDiff(offset, count, previousSnapshot)
|
|
* .byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 page ranges
|
|
* if (response.pageRange) {
|
|
* for (const pageRange of response.pageRange) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = pageBlobClient
|
|
* .listPageRangesDiff(offset, count, previousSnapshot)
|
|
* .byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
* // Prints 10 page ranges
|
|
* if (response.pageRange) {
|
|
* for (const pageRange of response.pageRange) {
|
|
* console.log(`Page range ${i++}: ${pageRange.start} - ${pageRange.end}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param offset - Starting byte position of the page ranges.
|
|
* @param count - Number of bytes to get.
|
|
* @param prevSnapshot - Timestamp of snapshot to retrieve the difference.
|
|
* @param options - Options to the Page Blob Get Ranges operation.
|
|
* @returns An asyncIterableIterator that supports paging.
|
|
*/
|
|
listPageRangesDiff(offset, count, prevSnapshot, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
// AsyncIterableIterator to iterate over blobs
|
|
const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, {
|
|
...options,
|
|
});
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...options,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Gets the collection of page ranges that differ between a specified snapshot and this page blob for managed disks.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-page-ranges
|
|
*
|
|
* @param offset - Starting byte position of the page blob
|
|
* @param count - Number of bytes to get ranges diff.
|
|
* @param prevSnapshotUrl - URL of snapshot to retrieve the difference.
|
|
* @param options - Options to the Page Blob Get Page Ranges Diff operation.
|
|
* @returns Response data for the Page Blob Get Page Range Diff operation.
|
|
*/
|
|
async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.pageBlobContext.getPageRangesDiff({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
prevSnapshotUrl,
|
|
range: rangeToString({ offset, count }),
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return rangeResponseFromModel(response);
|
|
});
|
|
}
|
|
/**
|
|
* Resizes the page blob to the specified size (which must be a multiple of 512).
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
|
|
*
|
|
* @param size - Target size
|
|
* @param options - Options to the Page Blob Resize operation.
|
|
* @returns Response data for the Page Blob Resize operation.
|
|
*/
|
|
async resize(size, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-resize", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.resize(size, {
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
encryptionScope: options.encryptionScope,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets a page blob's sequence number.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-properties
|
|
*
|
|
* @param sequenceNumberAction - Indicates how the service should modify the blob's sequence number.
|
|
* @param sequenceNumber - Required if sequenceNumberAction is max or update
|
|
* @param options - Options to the Page Blob Update Sequence Number operation.
|
|
* @returns Response data for the Page Blob Update Sequence Number operation.
|
|
*/
|
|
async updateSequenceNumber(sequenceNumberAction, sequenceNumber, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("PageBlobClient-updateSequenceNumber", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction, {
|
|
abortSignal: options.abortSignal,
|
|
blobSequenceNumber: sequenceNumber,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Begins an operation to start an incremental copy from one page blob's snapshot to this page blob.
|
|
* The snapshot is copied such that only the differential changes between the previously
|
|
* copied snapshot are transferred to the destination.
|
|
* The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/incremental-copy-blob
|
|
* @see https://learn.microsoft.com/azure/virtual-machines/windows/incremental-snapshots
|
|
*
|
|
* @param copySource - Specifies the name of the source page blob snapshot. For example,
|
|
* https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>
|
|
* @param options - Options to the Page Blob Copy Incremental operation.
|
|
* @returns Response data for the Page Blob Copy Incremental operation.
|
|
*/
|
|
async startCopyIncremental(copySource, options = {}) {
|
|
return tracingClient.withSpan("PageBlobClient-startCopyIncremental", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.pageBlobContext.copyIncremental(copySource, {
|
|
abortSignal: options.abortSignal,
|
|
modifiedAccessConditions: {
|
|
...options.conditions,
|
|
ifTags: options.conditions?.tagConditions,
|
|
},
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=Clients.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BatchUtils.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
async function getBodyAsText(batchResponse) {
|
|
let buffer = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES);
|
|
const responseLength = await streamToBuffer2(batchResponse.readableStreamBody, buffer);
|
|
// Slice the buffer to trim the empty ending.
|
|
buffer = buffer.slice(0, responseLength);
|
|
return buffer.toString();
|
|
}
|
|
function utf8ByteLength(str) {
|
|
return Buffer.byteLength(str);
|
|
}
|
|
//# sourceMappingURL=BatchUtils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BatchResponseParser.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
const HTTP_HEADER_DELIMITER = ": ";
|
|
const SPACE_DELIMITER = " ";
|
|
const NOT_FOUND = -1;
|
|
/**
|
|
* Util class for parsing batch response.
|
|
*/
|
|
class BatchResponseParser {
|
|
batchResponse;
|
|
responseBatchBoundary;
|
|
perResponsePrefix;
|
|
batchResponseEnding;
|
|
subRequests;
|
|
constructor(batchResponse, subRequests) {
|
|
if (!batchResponse || !batchResponse.contentType) {
|
|
// In special case(reported), server may return invalid content-type which could not be parsed.
|
|
throw new RangeError("batchResponse is malformed or doesn't contain valid content-type.");
|
|
}
|
|
if (!subRequests || subRequests.size === 0) {
|
|
// This should be prevent during coding.
|
|
throw new RangeError("Invalid state: subRequests is not provided or size is 0.");
|
|
}
|
|
this.batchResponse = batchResponse;
|
|
this.subRequests = subRequests;
|
|
this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];
|
|
this.perResponsePrefix = `--${this.responseBatchBoundary}${HTTP_LINE_ENDING}`;
|
|
this.batchResponseEnding = `--${this.responseBatchBoundary}--`;
|
|
}
|
|
// For example of response, please refer to https://learn.microsoft.com/rest/api/storageservices/blob-batch#response
|
|
async parseBatchResponse() {
|
|
// When logic reach here, suppose batch request has already succeeded with 202, so we can further parse
|
|
// sub request's response.
|
|
if (this.batchResponse._response.status !== HTTPURLConnection.HTTP_ACCEPTED) {
|
|
throw new Error(`Invalid state: batch request failed with status: '${this.batchResponse._response.status}'.`);
|
|
}
|
|
const responseBodyAsText = await getBodyAsText(this.batchResponse);
|
|
const subResponses = responseBodyAsText
|
|
.split(this.batchResponseEnding)[0] // string after ending is useless
|
|
.split(this.perResponsePrefix)
|
|
.slice(1); // string before first response boundary is useless
|
|
const subResponseCount = subResponses.length;
|
|
// Defensive coding in case of potential error parsing.
|
|
// Note: subResponseCount == 1 is special case where sub request is invalid.
|
|
// We try to prevent such cases through early validation, e.g. validate sub request count >= 1.
|
|
// While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.
|
|
if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {
|
|
throw new Error("Invalid state: sub responses' count is not equal to sub requests' count.");
|
|
}
|
|
const deserializedSubResponses = new Array(subResponseCount);
|
|
let subResponsesSucceededCount = 0;
|
|
let subResponsesFailedCount = 0;
|
|
// Parse sub subResponses.
|
|
for (let index = 0; index < subResponseCount; index++) {
|
|
const subResponse = subResponses[index];
|
|
const deserializedSubResponse = {};
|
|
deserializedSubResponse.headers = toHttpHeadersLike(esm_httpHeaders_createHttpHeaders());
|
|
const responseLines = subResponse.split(`${HTTP_LINE_ENDING}`);
|
|
let subRespHeaderStartFound = false;
|
|
let subRespHeaderEndFound = false;
|
|
let subRespFailed = false;
|
|
let contentId = NOT_FOUND;
|
|
for (const responseLine of responseLines) {
|
|
if (!subRespHeaderStartFound) {
|
|
// Convention line to indicate content ID
|
|
if (responseLine.startsWith(utils_constants_HeaderConstants.CONTENT_ID)) {
|
|
contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);
|
|
}
|
|
// Http version line with status code indicates the start of sub request's response.
|
|
// Example: HTTP/1.1 202 Accepted
|
|
if (responseLine.startsWith(HTTP_VERSION_1_1)) {
|
|
subRespHeaderStartFound = true;
|
|
const tokens = responseLine.split(SPACE_DELIMITER);
|
|
deserializedSubResponse.status = parseInt(tokens[1]);
|
|
deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);
|
|
}
|
|
continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *
|
|
}
|
|
if (responseLine.trim() === "") {
|
|
// Sub response's header start line already found, and the first empty line indicates header end line found.
|
|
if (!subRespHeaderEndFound) {
|
|
subRespHeaderEndFound = true;
|
|
}
|
|
continue; // Skip empty line
|
|
}
|
|
// Note: when code reach here, it indicates subRespHeaderStartFound == true
|
|
if (!subRespHeaderEndFound) {
|
|
if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {
|
|
// Defensive coding to prevent from missing valuable lines.
|
|
throw new Error(`Invalid state: find non-empty line '${responseLine}' without HTTP header delimiter '${HTTP_HEADER_DELIMITER}'.`);
|
|
}
|
|
// Parse headers of sub response.
|
|
const tokens = responseLine.split(HTTP_HEADER_DELIMITER);
|
|
deserializedSubResponse.headers.set(tokens[0], tokens[1]);
|
|
if (tokens[0] === utils_constants_HeaderConstants.X_MS_ERROR_CODE) {
|
|
deserializedSubResponse.errorCode = tokens[1];
|
|
subRespFailed = true;
|
|
}
|
|
}
|
|
else {
|
|
// Assemble body of sub response.
|
|
if (!deserializedSubResponse.bodyAsText) {
|
|
deserializedSubResponse.bodyAsText = "";
|
|
}
|
|
deserializedSubResponse.bodyAsText += responseLine;
|
|
}
|
|
} // Inner for end
|
|
// The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.
|
|
// The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it
|
|
// to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don't return that
|
|
// unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.
|
|
if (contentId !== NOT_FOUND &&
|
|
Number.isInteger(contentId) &&
|
|
contentId >= 0 &&
|
|
contentId < this.subRequests.size &&
|
|
deserializedSubResponses[contentId] === undefined) {
|
|
deserializedSubResponse._request = this.subRequests.get(contentId);
|
|
deserializedSubResponses[contentId] = deserializedSubResponse;
|
|
}
|
|
else {
|
|
storage_blob_dist_esm_log_logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);
|
|
}
|
|
if (subRespFailed) {
|
|
subResponsesFailedCount++;
|
|
}
|
|
else {
|
|
subResponsesSucceededCount++;
|
|
}
|
|
}
|
|
return {
|
|
subResponses: deserializedSubResponses,
|
|
subResponsesSucceededCount: subResponsesSucceededCount,
|
|
subResponsesFailedCount: subResponsesFailedCount,
|
|
};
|
|
}
|
|
}
|
|
//# sourceMappingURL=BatchResponseParser.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/Mutex.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
var MutexLockStatus;
|
|
(function (MutexLockStatus) {
|
|
MutexLockStatus[MutexLockStatus["LOCKED"] = 0] = "LOCKED";
|
|
MutexLockStatus[MutexLockStatus["UNLOCKED"] = 1] = "UNLOCKED";
|
|
})(MutexLockStatus || (MutexLockStatus = {}));
|
|
/**
|
|
* An async mutex lock.
|
|
*/
|
|
class Mutex {
|
|
/**
|
|
* Lock for a specific key. If the lock has been acquired by another customer, then
|
|
* will wait until getting the lock.
|
|
*
|
|
* @param key - lock key
|
|
*/
|
|
static async lock(key) {
|
|
return new Promise((resolve) => {
|
|
if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) {
|
|
this.keys[key] = MutexLockStatus.LOCKED;
|
|
resolve();
|
|
}
|
|
else {
|
|
this.onUnlockEvent(key, () => {
|
|
this.keys[key] = MutexLockStatus.LOCKED;
|
|
resolve();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Unlock a key.
|
|
*
|
|
* @param key -
|
|
*/
|
|
static async unlock(key) {
|
|
return new Promise((resolve) => {
|
|
if (this.keys[key] === MutexLockStatus.LOCKED) {
|
|
this.emitUnlockEvent(key);
|
|
}
|
|
delete this.keys[key];
|
|
resolve();
|
|
});
|
|
}
|
|
static keys = {};
|
|
static listeners = {};
|
|
static onUnlockEvent(key, handler) {
|
|
if (this.listeners[key] === undefined) {
|
|
this.listeners[key] = [handler];
|
|
}
|
|
else {
|
|
this.listeners[key].push(handler);
|
|
}
|
|
}
|
|
static emitUnlockEvent(key) {
|
|
if (this.listeners[key] !== undefined && this.listeners[key].length > 0) {
|
|
const handler = this.listeners[key].shift();
|
|
setImmediate(() => {
|
|
handler.call(this);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=Mutex.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobBatch.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A BlobBatch represents an aggregated set of operations on blobs.
|
|
* Currently, only `delete` and `setAccessTier` are supported.
|
|
*/
|
|
class BlobBatch {
|
|
batchRequest;
|
|
batch = "batch";
|
|
batchType;
|
|
constructor() {
|
|
this.batchRequest = new InnerBatchRequest();
|
|
}
|
|
/**
|
|
* Get the value of Content-Type for a batch request.
|
|
* The value must be multipart/mixed with a batch boundary.
|
|
* Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252
|
|
*/
|
|
getMultiPartContentType() {
|
|
return this.batchRequest.getMultipartContentType();
|
|
}
|
|
/**
|
|
* Get assembled HTTP request body for sub requests.
|
|
*/
|
|
getHttpRequestBody() {
|
|
return this.batchRequest.getHttpRequestBody();
|
|
}
|
|
/**
|
|
* Get sub requests that are added into the batch request.
|
|
*/
|
|
getSubRequests() {
|
|
return this.batchRequest.getSubRequests();
|
|
}
|
|
async addSubRequestInternal(subRequest, assembleSubRequestFunc) {
|
|
await Mutex.lock(this.batch);
|
|
try {
|
|
this.batchRequest.preAddSubRequest(subRequest);
|
|
await assembleSubRequestFunc();
|
|
this.batchRequest.postAddSubRequest(subRequest);
|
|
}
|
|
finally {
|
|
await Mutex.unlock(this.batch);
|
|
}
|
|
}
|
|
setBatchType(batchType) {
|
|
if (!this.batchType) {
|
|
this.batchType = batchType;
|
|
}
|
|
if (this.batchType !== batchType) {
|
|
throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);
|
|
}
|
|
}
|
|
async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {
|
|
let url;
|
|
let credential;
|
|
if (typeof urlOrBlobClient === "string" &&
|
|
((esm_isNodeLike && credentialOrOptions instanceof StorageSharedKeyCredential) ||
|
|
credentialOrOptions instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrOptions))) {
|
|
// First overload
|
|
url = urlOrBlobClient;
|
|
credential = credentialOrOptions;
|
|
}
|
|
else if (urlOrBlobClient instanceof BlobClient) {
|
|
// Second overload
|
|
url = urlOrBlobClient.url;
|
|
credential = urlOrBlobClient.credential;
|
|
options = credentialOrOptions;
|
|
}
|
|
else {
|
|
throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
|
|
}
|
|
if (!options) {
|
|
options = {};
|
|
}
|
|
return tracingClient.withSpan("BatchDeleteRequest-addSubRequest", options, async (updatedOptions) => {
|
|
this.setBatchType("delete");
|
|
await this.addSubRequestInternal({
|
|
url: url,
|
|
credential: credential,
|
|
}, async () => {
|
|
await new BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);
|
|
});
|
|
});
|
|
}
|
|
async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {
|
|
let url;
|
|
let credential;
|
|
let tier;
|
|
if (typeof urlOrBlobClient === "string" &&
|
|
((esm_isNodeLike && credentialOrTier instanceof StorageSharedKeyCredential) ||
|
|
credentialOrTier instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrTier))) {
|
|
// First overload
|
|
url = urlOrBlobClient;
|
|
credential = credentialOrTier;
|
|
tier = tierOrOptions;
|
|
}
|
|
else if (urlOrBlobClient instanceof BlobClient) {
|
|
// Second overload
|
|
url = urlOrBlobClient.url;
|
|
credential = urlOrBlobClient.credential;
|
|
tier = credentialOrTier;
|
|
options = tierOrOptions;
|
|
}
|
|
else {
|
|
throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
|
|
}
|
|
if (!options) {
|
|
options = {};
|
|
}
|
|
return tracingClient.withSpan("BatchSetTierRequest-addSubRequest", options, async (updatedOptions) => {
|
|
this.setBatchType("setAccessTier");
|
|
await this.addSubRequestInternal({
|
|
url: url,
|
|
credential: credential,
|
|
}, async () => {
|
|
await new BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* Inner batch request class which is responsible for assembling and serializing sub requests.
|
|
* See https://learn.microsoft.com/rest/api/storageservices/blob-batch#request-body for how requests are assembled.
|
|
*/
|
|
class InnerBatchRequest {
|
|
operationCount;
|
|
body;
|
|
subRequests;
|
|
boundary;
|
|
subRequestPrefix;
|
|
multipartContentType;
|
|
batchRequestEnding;
|
|
constructor() {
|
|
this.operationCount = 0;
|
|
this.body = "";
|
|
const tempGuid = esm_randomUUID();
|
|
// batch_{batchid}
|
|
this.boundary = `batch_${tempGuid}`;
|
|
// --batch_{batchid}
|
|
// Content-Type: application/http
|
|
// Content-Transfer-Encoding: binary
|
|
this.subRequestPrefix = `--${this.boundary}${HTTP_LINE_ENDING}${utils_constants_HeaderConstants.CONTENT_TYPE}: application/http${HTTP_LINE_ENDING}${utils_constants_HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;
|
|
// multipart/mixed; boundary=batch_{batchid}
|
|
this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;
|
|
// --batch_{batchid}--
|
|
this.batchRequestEnding = `--${this.boundary}--`;
|
|
this.subRequests = new Map();
|
|
}
|
|
/**
|
|
* Create pipeline to assemble sub requests. The idea here is to use existing
|
|
* credential and serialization/deserialization components, with additional policies to
|
|
* filter unnecessary headers, assemble sub requests into request's body
|
|
* and intercept request from going to wire.
|
|
* @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.
|
|
*/
|
|
createPipeline(credential) {
|
|
const corePipeline = esm_pipeline_createEmptyPipeline();
|
|
corePipeline.addPolicy(serializationPolicy({
|
|
stringifyXML: stringifyXML,
|
|
serializerOptions: {
|
|
xml: {
|
|
xmlCharKey: "#",
|
|
},
|
|
},
|
|
}), { phase: "Serialize" });
|
|
// Use batch header filter policy to exclude unnecessary headers
|
|
corePipeline.addPolicy(batchHeaderFilterPolicy());
|
|
// Use batch assemble policy to assemble request and intercept request from going to wire
|
|
corePipeline.addPolicy(batchRequestAssemblePolicy(this), { afterPhase: "Sign" });
|
|
if (isTokenCredential(credential)) {
|
|
corePipeline.addPolicy(bearerTokenAuthenticationPolicy({
|
|
credential,
|
|
scopes: StorageOAuthScopes,
|
|
challengeCallbacks: { authorizeRequestOnChallenge: authorizeRequestOnTenantChallenge },
|
|
}), { phase: "Sign" });
|
|
}
|
|
else if (credential instanceof StorageSharedKeyCredential) {
|
|
corePipeline.addPolicy(storageSharedKeyCredentialPolicy({
|
|
accountName: credential.accountName,
|
|
accountKey: credential.accountKey,
|
|
}), { phase: "Sign" });
|
|
}
|
|
const pipeline = new Pipeline([]);
|
|
// attach the v2 pipeline to this one
|
|
pipeline._credential = credential;
|
|
pipeline._corePipeline = corePipeline;
|
|
return pipeline;
|
|
}
|
|
appendSubRequestToBody(request) {
|
|
// Start to assemble sub request
|
|
this.body += [
|
|
this.subRequestPrefix, // sub request constant prefix
|
|
`${utils_constants_HeaderConstants.CONTENT_ID}: ${this.operationCount}`, // sub request's content ID
|
|
"", // empty line after sub request's content ID
|
|
`${request.method.toString()} ${utils_common_getURLPathAndQuery(request.url)} ${HTTP_VERSION_1_1}${HTTP_LINE_ENDING}`, // sub request start line with method
|
|
].join(HTTP_LINE_ENDING);
|
|
for (const [name, value] of request.headers) {
|
|
this.body += `${name}: ${value}${HTTP_LINE_ENDING}`;
|
|
}
|
|
this.body += HTTP_LINE_ENDING; // sub request's headers need be ending with an empty line
|
|
// No body to assemble for current batch request support
|
|
// End to assemble sub request
|
|
}
|
|
preAddSubRequest(subRequest) {
|
|
if (this.operationCount >= BATCH_MAX_REQUEST) {
|
|
throw new RangeError(`Cannot exceed ${BATCH_MAX_REQUEST} sub requests in a single batch`);
|
|
}
|
|
// Fast fail if url for sub request is invalid
|
|
const path = utils_common_getURLPath(subRequest.url);
|
|
if (!path || path === "") {
|
|
throw new RangeError(`Invalid url for sub request: '${subRequest.url}'`);
|
|
}
|
|
}
|
|
postAddSubRequest(subRequest) {
|
|
this.subRequests.set(this.operationCount, subRequest);
|
|
this.operationCount++;
|
|
}
|
|
// Return the http request body with assembling the ending line to the sub request body.
|
|
getHttpRequestBody() {
|
|
return `${this.body}${this.batchRequestEnding}${HTTP_LINE_ENDING}`;
|
|
}
|
|
getMultipartContentType() {
|
|
return this.multipartContentType;
|
|
}
|
|
getSubRequests() {
|
|
return this.subRequests;
|
|
}
|
|
}
|
|
function batchRequestAssemblePolicy(batchRequest) {
|
|
return {
|
|
name: "batchRequestAssemblePolicy",
|
|
async sendRequest(request) {
|
|
batchRequest.appendSubRequestToBody(request);
|
|
return {
|
|
request,
|
|
status: 200,
|
|
headers: esm_httpHeaders_createHttpHeaders(),
|
|
};
|
|
},
|
|
};
|
|
}
|
|
function batchHeaderFilterPolicy() {
|
|
return {
|
|
name: "batchHeaderFilterPolicy",
|
|
async sendRequest(request, next) {
|
|
let xMsHeaderName = "";
|
|
for (const [name] of request.headers) {
|
|
if (utils_common_iEqual(name, utils_constants_HeaderConstants.X_MS_VERSION)) {
|
|
xMsHeaderName = name;
|
|
}
|
|
}
|
|
if (xMsHeaderName !== "") {
|
|
request.headers.delete(xMsHeaderName); // The subrequests should not have the x-ms-version header.
|
|
}
|
|
return next(request);
|
|
},
|
|
};
|
|
}
|
|
//# sourceMappingURL=BlobBatch.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobBatchClient.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
|
|
*/
|
|
class BlobBatchClient {
|
|
serviceOrContainerContext;
|
|
constructor(url, credentialOrPipeline,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
let pipeline;
|
|
if (isPipelineLike(credentialOrPipeline)) {
|
|
pipeline = credentialOrPipeline;
|
|
}
|
|
else if (!credentialOrPipeline) {
|
|
// no credential provided
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
pipeline = newPipeline(credentialOrPipeline, options);
|
|
}
|
|
const storageClientContext = new StorageContextClient(url, getCoreClientOptions(pipeline));
|
|
const path = utils_common_getURLPath(url);
|
|
if (path && path !== "/") {
|
|
// Container scoped.
|
|
this.serviceOrContainerContext = storageClientContext.container;
|
|
}
|
|
else {
|
|
this.serviceOrContainerContext = storageClientContext.service;
|
|
}
|
|
}
|
|
/**
|
|
* Creates a {@link BlobBatch}.
|
|
* A BlobBatch represents an aggregated set of operations on blobs.
|
|
*/
|
|
createBatch() {
|
|
return new BlobBatch();
|
|
}
|
|
async deleteBlobs(urlsOrBlobClients, credentialOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
const batch = new BlobBatch();
|
|
for (const urlOrBlobClient of urlsOrBlobClients) {
|
|
if (typeof urlOrBlobClient === "string") {
|
|
await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);
|
|
}
|
|
else {
|
|
await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);
|
|
}
|
|
}
|
|
return this.submitBatch(batch);
|
|
}
|
|
async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
const batch = new BlobBatch();
|
|
for (const urlOrBlobClient of urlsOrBlobClients) {
|
|
if (typeof urlOrBlobClient === "string") {
|
|
await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);
|
|
}
|
|
else {
|
|
await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);
|
|
}
|
|
}
|
|
return this.submitBatch(batch);
|
|
}
|
|
/**
|
|
* Submit batch request which consists of multiple subrequests.
|
|
*
|
|
* Get `blobBatchClient` and other details before running the snippets.
|
|
* `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:BlobBatchClientSubmitBatch
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
* import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
|
|
*
|
|
* const account = "<account>";
|
|
* const credential = new DefaultAzureCredential();
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* credential,
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blobBatchClient = containerClient.getBlobBatchClient();
|
|
*
|
|
* const batchRequest = new BlobBatch();
|
|
* await batchRequest.deleteBlob("<blob-url-1>", credential);
|
|
* await batchRequest.deleteBlob("<blob-url-2>", credential, {
|
|
* deleteSnapshots: "include",
|
|
* });
|
|
* const batchResp = await blobBatchClient.submitBatch(batchRequest);
|
|
* console.log(batchResp.subResponsesSucceededCount);
|
|
* ```
|
|
*
|
|
* Example using a lease:
|
|
*
|
|
* ```ts snippet:BlobBatchClientSubmitBatchWithLease
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
* import { BlobServiceClient, BlobBatch } from "@azure/storage-blob";
|
|
*
|
|
* const account = "<account>";
|
|
* const credential = new DefaultAzureCredential();
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* credential,
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blobBatchClient = containerClient.getBlobBatchClient();
|
|
* const blobClient = containerClient.getBlobClient("<blob name>");
|
|
*
|
|
* const batchRequest = new BlobBatch();
|
|
* await batchRequest.setBlobAccessTier(blobClient, "Cool");
|
|
* await batchRequest.setBlobAccessTier(blobClient, "Cool", {
|
|
* conditions: { leaseId: "<lease-id>" },
|
|
* });
|
|
* const batchResp = await blobBatchClient.submitBatch(batchRequest);
|
|
* console.log(batchResp.subResponsesSucceededCount);
|
|
* ```
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
|
|
*
|
|
* @param batchRequest - A set of Delete or SetTier operations.
|
|
* @param options -
|
|
*/
|
|
async submitBatch(batchRequest, options = {}) {
|
|
if (!batchRequest || batchRequest.getSubRequests().size === 0) {
|
|
throw new RangeError("Batch request should contain one or more sub requests.");
|
|
}
|
|
return tracingClient.withSpan("BlobBatchClient-submitBatch", options, async (updatedOptions) => {
|
|
const batchRequestBody = batchRequest.getHttpRequestBody();
|
|
// ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.
|
|
const rawBatchResponse = utils_common_assertResponse((await this.serviceOrContainerContext.submitBatch(utf8ByteLength(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, {
|
|
...updatedOptions,
|
|
})));
|
|
// Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).
|
|
const batchResponseParser = new BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());
|
|
const responseSummary = await batchResponseParser.parseBatchResponse();
|
|
const res = {
|
|
_response: rawBatchResponse._response,
|
|
contentType: rawBatchResponse.contentType,
|
|
errorCode: rawBatchResponse.errorCode,
|
|
requestId: rawBatchResponse.requestId,
|
|
clientRequestId: rawBatchResponse.clientRequestId,
|
|
version: rawBatchResponse.version,
|
|
subResponses: responseSummary.subResponses,
|
|
subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,
|
|
subResponsesFailedCount: responseSummary.subResponsesFailedCount,
|
|
};
|
|
return res;
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobBatchClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/ContainerClient.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* A ContainerClient represents a URL to the Azure Storage container allowing you to manipulate its blobs.
|
|
*/
|
|
class ContainerClient extends StorageClient_StorageClient {
|
|
/**
|
|
* containerContext provided by protocol layer.
|
|
*/
|
|
containerContext;
|
|
_containerName;
|
|
blobClientConfig;
|
|
/**
|
|
* The name of the container.
|
|
*/
|
|
get containerName() {
|
|
return this._containerName;
|
|
}
|
|
constructor(urlOrConnectionString, credentialOrPipelineOrContainerName,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
let pipeline;
|
|
let url;
|
|
options = options || {};
|
|
if (isPipelineLike(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, pipeline: Pipeline, options?: BlobClientConfig)
|
|
url = urlOrConnectionString;
|
|
pipeline = credentialOrPipelineOrContainerName;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipelineOrContainerName instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipelineOrContainerName)) {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
url = urlOrConnectionString;
|
|
pipeline = newPipeline(credentialOrPipelineOrContainerName, options);
|
|
}
|
|
else if (!credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName !== "string") {
|
|
// (url: string, credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, options?: StoragePipelineOptions)
|
|
// The second parameter is undefined. Use anonymous credential.
|
|
url = urlOrConnectionString;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else if (credentialOrPipelineOrContainerName &&
|
|
typeof credentialOrPipelineOrContainerName === "string") {
|
|
// (connectionString: string, containerName: string, blobName: string, options?: StoragePipelineOptions)
|
|
const containerName = credentialOrPipelineOrContainerName;
|
|
const extractedCreds = utils_common_extractConnectionStringParts(urlOrConnectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
url = utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName));
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
pipeline = newPipeline(sharedKeyCredential, options);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
url =
|
|
utils_common_appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)) +
|
|
"?" +
|
|
extractedCreds.accountSas;
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
else {
|
|
throw new Error("Expecting non-empty strings for containerName parameter");
|
|
}
|
|
super(url, pipeline);
|
|
this._containerName = this.getContainerNameFromUrl();
|
|
this.containerContext = this.storageClientContext.container;
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a new container under the specified account. If the container with
|
|
* the same name already exists, the operation fails.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-container
|
|
* Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
|
|
*
|
|
* @param options - Options to Container Create operation.
|
|
*
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:ContainerClientCreate
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const createContainerResponse = await containerClient.create();
|
|
* console.log("Container was created successfully", createContainerResponse.requestId);
|
|
* ```
|
|
*/
|
|
async create(options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-create", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.containerContext.create(updatedOptions));
|
|
});
|
|
}
|
|
/**
|
|
* Creates a new container under the specified account. If the container with
|
|
* the same name already exists, it is not changed.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-container
|
|
* Naming rules: @see https://learn.microsoft.com/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata
|
|
*
|
|
* @param options -
|
|
*/
|
|
async createIfNotExists(options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-createIfNotExists", options, async (updatedOptions) => {
|
|
try {
|
|
const res = await this.create(updatedOptions);
|
|
return {
|
|
succeeded: true,
|
|
...res,
|
|
_response: res._response, // _response is made non-enumerable
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (e.details?.errorCode === "ContainerAlreadyExists") {
|
|
return {
|
|
succeeded: false,
|
|
...e.response?.parsedHeaders,
|
|
_response: e.response,
|
|
};
|
|
}
|
|
else {
|
|
throw e;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Returns true if the Azure container resource represented by this client exists; false otherwise.
|
|
*
|
|
* NOTE: use this function with care since an existing container might be deleted by other clients or
|
|
* applications. Vice versa new containers with the same name might be added by other clients or
|
|
* applications after this function completes.
|
|
*
|
|
* @param options -
|
|
*/
|
|
async exists(options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-exists", options, async (updatedOptions) => {
|
|
try {
|
|
await this.getProperties({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
});
|
|
return true;
|
|
}
|
|
catch (e) {
|
|
if (e.statusCode === 404) {
|
|
return false;
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Creates a {@link BlobClient}
|
|
*
|
|
* @param blobName - A blob name
|
|
* @returns A new BlobClient object for the given blob name.
|
|
*/
|
|
getBlobClient(blobName) {
|
|
return new BlobClient(utils_common_appendToURLPath(this.url, utils_common_EscapePath(blobName)), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates an {@link AppendBlobClient}
|
|
*
|
|
* @param blobName - An append blob name
|
|
*/
|
|
getAppendBlobClient(blobName) {
|
|
return new AppendBlobClient(utils_common_appendToURLPath(this.url, utils_common_EscapePath(blobName)), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a {@link BlockBlobClient}
|
|
*
|
|
* @param blobName - A block blob name
|
|
*
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:ClientsUpload
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const blobName = "<blob name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
* const blockBlobClient = containerClient.getBlockBlobClient(blobName);
|
|
*
|
|
* const content = "Hello world!";
|
|
* const uploadBlobResponse = await blockBlobClient.upload(content, content.length);
|
|
* ```
|
|
*/
|
|
getBlockBlobClient(blobName) {
|
|
return new BlockBlobClient(utils_common_appendToURLPath(this.url, utils_common_EscapePath(blobName)), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Creates a {@link PageBlobClient}
|
|
*
|
|
* @param blobName - A page blob name
|
|
*/
|
|
getPageBlobClient(blobName) {
|
|
return new PageBlobClient(utils_common_appendToURLPath(this.url, utils_common_EscapePath(blobName)), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Returns all user-defined metadata and system properties for the specified
|
|
* container. The data returned does not include the container's list of blobs.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-container-properties
|
|
*
|
|
* WARNING: The `metadata` object returned in the response will have its keys in lowercase, even if
|
|
* they originally contained uppercase characters. This differs from the metadata keys returned by
|
|
* the `listContainers` method of {@link BlobServiceClient} using the `includeMetadata` option, which
|
|
* will retain their original casing.
|
|
*
|
|
* @param options - Options to Container Get Properties operation.
|
|
*/
|
|
async getProperties(options = {}) {
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("ContainerClient-getProperties", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.containerContext.getProperties({
|
|
abortSignal: options.abortSignal,
|
|
...options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Marks the specified container for deletion. The container and any blobs
|
|
* contained within it are later deleted during garbage collection.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/delete-container
|
|
*
|
|
* @param options - Options to Container Delete operation.
|
|
*/
|
|
async delete(options = {}) {
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("ContainerClient-delete", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.containerContext.delete({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Marks the specified container for deletion if it exists. The container and any blobs
|
|
* contained within it are later deleted during garbage collection.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/delete-container
|
|
*
|
|
* @param options - Options to Container Delete operation.
|
|
*/
|
|
async deleteIfExists(options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-deleteIfExists", options, async (updatedOptions) => {
|
|
try {
|
|
const res = await this.delete(updatedOptions);
|
|
return {
|
|
succeeded: true,
|
|
...res,
|
|
_response: res._response,
|
|
};
|
|
}
|
|
catch (e) {
|
|
if (e.details?.errorCode === "ContainerNotFound") {
|
|
return {
|
|
succeeded: false,
|
|
...e.response?.parsedHeaders,
|
|
_response: e.response,
|
|
};
|
|
}
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Sets one or more user-defined name-value pairs for the specified container.
|
|
*
|
|
* If no option provided, or no metadata defined in the parameter, the container
|
|
* metadata will be removed.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-container-metadata
|
|
*
|
|
* @param metadata - Replace existing metadata with this value.
|
|
* If no value provided the existing metadata will be removed.
|
|
* @param options - Options to Container Set Metadata operation.
|
|
*/
|
|
async setMetadata(metadata, options = {}) {
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
if (options.conditions.ifUnmodifiedSince) {
|
|
throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service");
|
|
}
|
|
return tracingClient.withSpan("ContainerClient-setMetadata", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.containerContext.setMetadata({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
metadata,
|
|
modifiedAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Gets the permissions for the specified container. The permissions indicate
|
|
* whether container data may be accessed publicly.
|
|
*
|
|
* WARNING: JavaScript Date will potentially lose precision when parsing startsOn and expiresOn strings.
|
|
* For example, new Date("2018-12-31T03:44:23.8827891Z").toISOString() will get "2018-12-31T03:44:23.882Z".
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-container-acl
|
|
*
|
|
* @param options - Options to Container Get Access Policy operation.
|
|
*/
|
|
async getAccessPolicy(options = {}) {
|
|
if (!options.conditions) {
|
|
options.conditions = {};
|
|
}
|
|
return tracingClient.withSpan("ContainerClient-getAccessPolicy", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.containerContext.getAccessPolicy({
|
|
abortSignal: options.abortSignal,
|
|
leaseAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const res = {
|
|
_response: response._response,
|
|
blobPublicAccess: response.blobPublicAccess,
|
|
date: response.date,
|
|
etag: response.etag,
|
|
errorCode: response.errorCode,
|
|
lastModified: response.lastModified,
|
|
requestId: response.requestId,
|
|
clientRequestId: response.clientRequestId,
|
|
signedIdentifiers: [],
|
|
version: response.version,
|
|
};
|
|
for (const identifier of response) {
|
|
let accessPolicy = undefined;
|
|
if (identifier.accessPolicy) {
|
|
accessPolicy = {
|
|
permissions: identifier.accessPolicy.permissions,
|
|
};
|
|
if (identifier.accessPolicy.expiresOn) {
|
|
accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn);
|
|
}
|
|
if (identifier.accessPolicy.startsOn) {
|
|
accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn);
|
|
}
|
|
}
|
|
res.signedIdentifiers.push({
|
|
accessPolicy,
|
|
id: identifier.id,
|
|
});
|
|
}
|
|
return res;
|
|
});
|
|
}
|
|
/**
|
|
* Sets the permissions for the specified container. The permissions indicate
|
|
* whether blobs in a container may be accessed publicly.
|
|
*
|
|
* When you set permissions for a container, the existing permissions are replaced.
|
|
* If no access or containerAcl provided, the existing container ACL will be
|
|
* removed.
|
|
*
|
|
* When you establish a stored access policy on a container, it may take up to 30 seconds to take effect.
|
|
* During this interval, a shared access signature that is associated with the stored access policy will
|
|
* fail with status code 403 (Forbidden), until the access policy becomes active.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-container-acl
|
|
*
|
|
* @param access - The level of public access to data in the container.
|
|
* @param containerAcl - Array of elements each having a unique Id and details of the access policy.
|
|
* @param options - Options to Container Set Access Policy operation.
|
|
*/
|
|
async setAccessPolicy(access, containerAcl, options = {}) {
|
|
options.conditions = options.conditions || {};
|
|
return tracingClient.withSpan("ContainerClient-setAccessPolicy", options, async (updatedOptions) => {
|
|
const acl = [];
|
|
for (const identifier of containerAcl || []) {
|
|
acl.push({
|
|
accessPolicy: {
|
|
expiresOn: identifier.accessPolicy.expiresOn
|
|
? utils_common_truncatedISO8061Date(identifier.accessPolicy.expiresOn)
|
|
: "",
|
|
permissions: identifier.accessPolicy.permissions,
|
|
startsOn: identifier.accessPolicy.startsOn
|
|
? utils_common_truncatedISO8061Date(identifier.accessPolicy.startsOn)
|
|
: "",
|
|
},
|
|
id: identifier.id,
|
|
});
|
|
}
|
|
return utils_common_assertResponse(await this.containerContext.setAccessPolicy({
|
|
abortSignal: options.abortSignal,
|
|
access,
|
|
containerAcl: acl,
|
|
leaseAccessConditions: options.conditions,
|
|
modifiedAccessConditions: options.conditions,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Get a {@link BlobLeaseClient} that manages leases on the container.
|
|
*
|
|
* @param proposeLeaseId - Initial proposed lease Id.
|
|
* @returns A new BlobLeaseClient object for managing leases on the container.
|
|
*/
|
|
getBlobLeaseClient(proposeLeaseId) {
|
|
return new BlobLeaseClient(this, proposeLeaseId);
|
|
}
|
|
/**
|
|
* Creates a new block blob, or updates the content of an existing block blob.
|
|
*
|
|
* Updating an existing block blob overwrites any existing metadata on the blob.
|
|
* Partial updates are not supported; the content of the existing blob is
|
|
* overwritten with the new content. To perform a partial update of a block blob's,
|
|
* use {@link BlockBlobClient.stageBlock} and {@link BlockBlobClient.commitBlockList}.
|
|
*
|
|
* This is a non-parallel uploading method, please use {@link BlockBlobClient.uploadFile},
|
|
* {@link BlockBlobClient.uploadStream} or {@link BlockBlobClient.uploadBrowserData} for better
|
|
* performance with concurrency uploading.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/put-blob
|
|
*
|
|
* @param blobName - Name of the block blob to create or update.
|
|
* @param body - Blob, string, ArrayBuffer, ArrayBufferView or a function
|
|
* which returns a new Readable stream whose offset is from data source beginning.
|
|
* @param contentLength - Length of body in bytes. Use Buffer.byteLength() to calculate body length for a
|
|
* string including non non-Base64/Hex-encoded characters.
|
|
* @param options - Options to configure the Block Blob Upload operation.
|
|
* @returns Block Blob upload response data and the corresponding BlockBlobClient instance.
|
|
*/
|
|
async uploadBlockBlob(blobName, body, contentLength, options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-uploadBlockBlob", options, async (updatedOptions) => {
|
|
const blockBlobClient = this.getBlockBlobClient(blobName);
|
|
const response = await blockBlobClient.upload(body, contentLength, updatedOptions);
|
|
return {
|
|
blockBlobClient,
|
|
response,
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Marks the specified blob or snapshot for deletion. The blob is later deleted
|
|
* during garbage collection. Note that in order to delete a blob, you must delete
|
|
* all of its snapshots. You can delete both at the same time with the Delete
|
|
* Blob operation.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/delete-blob
|
|
*
|
|
* @param blobName -
|
|
* @param options - Options to Blob Delete operation.
|
|
* @returns Block blob deletion response data.
|
|
*/
|
|
async deleteBlob(blobName, options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-deleteBlob", options, async (updatedOptions) => {
|
|
let blobClient = this.getBlobClient(blobName);
|
|
if (options.versionId) {
|
|
blobClient = blobClient.withVersion(options.versionId);
|
|
}
|
|
return blobClient.delete(updatedOptions);
|
|
});
|
|
}
|
|
/**
|
|
* listBlobFlatSegment returns a single segment of blobs starting from the
|
|
* specified Marker. Use an empty Marker to start enumeration from the beginning.
|
|
* After getting a segment, process it, and then call listBlobsFlatSegment again
|
|
* (passing the the previously-returned Marker) to get the next segment.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
|
|
*
|
|
* @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
|
|
* @param options - Options to Container List Blob Flat Segment operation.
|
|
*/
|
|
async listBlobFlatSegment(marker, options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-listBlobFlatSegment", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.containerContext.listBlobFlatSegment({
|
|
marker,
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const wrappedResponse = {
|
|
...response,
|
|
_response: {
|
|
...response._response,
|
|
parsedBody: ConvertInternalResponseOfListBlobFlat(response._response.parsedBody),
|
|
}, // _response is made non-enumerable
|
|
segment: {
|
|
...response.segment,
|
|
blobItems: response.segment.blobItems.map((blobItemInternal) => {
|
|
const blobItem = {
|
|
...blobItemInternal,
|
|
name: BlobNameToString(blobItemInternal.name),
|
|
tags: toTags(blobItemInternal.blobTags),
|
|
objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInternal.objectReplicationMetadata),
|
|
};
|
|
return blobItem;
|
|
}),
|
|
},
|
|
};
|
|
return wrappedResponse;
|
|
});
|
|
}
|
|
/**
|
|
* listBlobHierarchySegment returns a single segment of blobs starting from
|
|
* the specified Marker. Use an empty Marker to start enumeration from the
|
|
* beginning. After getting a segment, process it, and then call listBlobsHierarchicalSegment
|
|
* again (passing the the previously-returned Marker) to get the next segment.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/list-blobs
|
|
*
|
|
* @param delimiter - The character or string used to define the virtual hierarchy
|
|
* @param marker - A string value that identifies the portion of the list to be returned with the next list operation.
|
|
* @param options - Options to Container List Blob Hierarchy Segment operation.
|
|
*/
|
|
async listBlobHierarchySegment(delimiter, marker, options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-listBlobHierarchySegment", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.containerContext.listBlobHierarchySegment(delimiter, {
|
|
marker,
|
|
...options,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const wrappedResponse = {
|
|
...response,
|
|
_response: {
|
|
...response._response,
|
|
parsedBody: ConvertInternalResponseOfListBlobHierarchy(response._response.parsedBody),
|
|
}, // _response is made non-enumerable
|
|
segment: {
|
|
...response.segment,
|
|
blobItems: response.segment.blobItems.map((blobItemInternal) => {
|
|
const blobItem = {
|
|
...blobItemInternal,
|
|
name: BlobNameToString(blobItemInternal.name),
|
|
tags: toTags(blobItemInternal.blobTags),
|
|
objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInternal.objectReplicationMetadata),
|
|
};
|
|
return blobItem;
|
|
}),
|
|
blobPrefixes: response.segment.blobPrefixes?.map((blobPrefixInternal) => {
|
|
const blobPrefix = {
|
|
...blobPrefixInternal,
|
|
name: BlobNameToString(blobPrefixInternal.name),
|
|
};
|
|
return blobPrefix;
|
|
}),
|
|
},
|
|
};
|
|
return wrappedResponse;
|
|
});
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for ContainerListBlobFlatSegmentResponse
|
|
*
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the ContinuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The ContinuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to list blobs operation.
|
|
*/
|
|
async *listSegments(marker, options = {}) {
|
|
let listBlobsFlatSegmentResponse;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
listBlobsFlatSegmentResponse = await this.listBlobFlatSegment(marker, options);
|
|
marker = listBlobsFlatSegmentResponse.continuationToken;
|
|
yield await listBlobsFlatSegmentResponse;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator of {@link BlobItem} objects
|
|
*
|
|
* @param options - Options to list blobs operation.
|
|
*/
|
|
async *listItems(options = {}) {
|
|
let marker;
|
|
for await (const listBlobsFlatSegmentResponse of this.listSegments(marker, options)) {
|
|
yield* listBlobsFlatSegmentResponse.segment.blobItems;
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to list all the blobs
|
|
* under the specified account.
|
|
*
|
|
* .byPage() returns an async iterable iterator to list the blobs in pages.
|
|
*
|
|
* ```ts snippet:ReadmeSampleListBlobs_Multiple
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
*
|
|
* // Example using `for await` syntax
|
|
* let i = 1;
|
|
* const blobs = containerClient.listBlobsFlat();
|
|
* for await (const blob of blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
*
|
|
* // Example using `iter.next()` syntax
|
|
* i = 1;
|
|
* const iter = containerClient.listBlobsFlat();
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Blob ${i++}: ${value.name}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Example using `byPage()` syntax
|
|
* i = 1;
|
|
* for await (const page of containerClient.listBlobsFlat().byPage({ maxPageSize: 20 })) {
|
|
* for (const blob of page.segment.blobItems) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using paging with a marker
|
|
* i = 1;
|
|
* let iterator = containerClient.listBlobsFlat().byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 blob names
|
|
* if (response.segment.blobItems) {
|
|
* for (const blob of response.segment.blobItems) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = containerClient.listBlobsFlat().byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
* // Prints 10 blob names
|
|
* if (response.segment.blobItems) {
|
|
* for (const blob of response.segment.blobItems) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param options - Options to list blobs.
|
|
* @returns An asyncIterableIterator that supports paging.
|
|
*/
|
|
listBlobsFlat(options = {}) {
|
|
const include = [];
|
|
if (options.includeCopy) {
|
|
include.push("copy");
|
|
}
|
|
if (options.includeDeleted) {
|
|
include.push("deleted");
|
|
}
|
|
if (options.includeMetadata) {
|
|
include.push("metadata");
|
|
}
|
|
if (options.includeSnapshots) {
|
|
include.push("snapshots");
|
|
}
|
|
if (options.includeVersions) {
|
|
include.push("versions");
|
|
}
|
|
if (options.includeUncommitedBlobs) {
|
|
include.push("uncommittedblobs");
|
|
}
|
|
if (options.includeTags) {
|
|
include.push("tags");
|
|
}
|
|
if (options.includeDeletedWithVersions) {
|
|
include.push("deletedwithversions");
|
|
}
|
|
if (options.includeImmutabilityPolicy) {
|
|
include.push("immutabilitypolicy");
|
|
}
|
|
if (options.includeLegalHold) {
|
|
include.push("legalhold");
|
|
}
|
|
if (options.prefix === "") {
|
|
options.prefix = undefined;
|
|
}
|
|
const updatedOptions = {
|
|
...options,
|
|
...(include.length > 0 ? { include: include } : {}),
|
|
};
|
|
// AsyncIterableIterator to iterate over blobs
|
|
const iter = this.listItems(updatedOptions);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.listSegments(settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...updatedOptions,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for ContainerListBlobHierarchySegmentResponse
|
|
*
|
|
* @param delimiter - The character or string used to define the virtual hierarchy
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the ContinuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The ContinuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to list blobs operation.
|
|
*/
|
|
async *listHierarchySegments(delimiter, marker, options = {}) {
|
|
let listBlobsHierarchySegmentResponse;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
listBlobsHierarchySegmentResponse = await this.listBlobHierarchySegment(delimiter, marker, options);
|
|
marker = listBlobsHierarchySegmentResponse.continuationToken;
|
|
yield await listBlobsHierarchySegmentResponse;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for {@link BlobPrefix} and {@link BlobItem} objects.
|
|
*
|
|
* @param delimiter - The character or string used to define the virtual hierarchy
|
|
* @param options - Options to list blobs operation.
|
|
*/
|
|
async *listItemsByHierarchy(delimiter, options = {}) {
|
|
let marker;
|
|
for await (const listBlobsHierarchySegmentResponse of this.listHierarchySegments(delimiter, marker, options)) {
|
|
const segment = listBlobsHierarchySegmentResponse.segment;
|
|
if (segment.blobPrefixes) {
|
|
for (const prefix of segment.blobPrefixes) {
|
|
yield {
|
|
kind: "prefix",
|
|
...prefix,
|
|
};
|
|
}
|
|
}
|
|
for (const blob of segment.blobItems) {
|
|
yield { kind: "blob", ...blob };
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to list all the blobs by hierarchy.
|
|
* under the specified account.
|
|
*
|
|
* .byPage() returns an async iterable iterator to list the blobs by hierarchy in pages.
|
|
*
|
|
* ```ts snippet:ReadmeSampleListBlobsByHierarchy
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
*
|
|
* // Example using `for await` syntax
|
|
* let i = 1;
|
|
* const blobs = containerClient.listBlobsByHierarchy("/");
|
|
* for await (const blob of blobs) {
|
|
* if (blob.kind === "prefix") {
|
|
* console.log(`\tBlobPrefix: ${blob.name}`);
|
|
* } else {
|
|
* console.log(`\tBlobItem: name - ${blob.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using `iter.next()` syntax
|
|
* i = 1;
|
|
* const iter = containerClient.listBlobsByHierarchy("/");
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* if (value.kind === "prefix") {
|
|
* console.log(`\tBlobPrefix: ${value.name}`);
|
|
* } else {
|
|
* console.log(`\tBlobItem: name - ${value.name}`);
|
|
* }
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Example using `byPage()` syntax
|
|
* i = 1;
|
|
* for await (const page of containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 20 })) {
|
|
* const segment = page.segment;
|
|
* if (segment.blobPrefixes) {
|
|
* for (const prefix of segment.blobPrefixes) {
|
|
* console.log(`\tBlobPrefix: ${prefix.name}`);
|
|
* }
|
|
* }
|
|
* for (const blob of page.segment.blobItems) {
|
|
* console.log(`\tBlobItem: name - ${blob.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using paging with a marker
|
|
* i = 1;
|
|
* let iterator = containerClient.listBlobsByHierarchy("/").byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 blob names
|
|
* if (response.blobPrefixes) {
|
|
* for (const prefix of response.blobPrefixes) {
|
|
* console.log(`\tBlobPrefix: ${prefix.name}`);
|
|
* }
|
|
* }
|
|
* if (response.segment.blobItems) {
|
|
* for (const blob of response.segment.blobItems) {
|
|
* console.log(`\tBlobItem: name - ${blob.name}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = containerClient
|
|
* .listBlobsByHierarchy("/")
|
|
* .byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
* // Prints 10 blob names
|
|
* if (response.blobPrefixes) {
|
|
* for (const prefix of response.blobPrefixes) {
|
|
* console.log(`\tBlobPrefix: ${prefix.name}`);
|
|
* }
|
|
* }
|
|
* if (response.segment.blobItems) {
|
|
* for (const blob of response.segment.blobItems) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param delimiter - The character or string used to define the virtual hierarchy
|
|
* @param options - Options to list blobs operation.
|
|
*/
|
|
listBlobsByHierarchy(delimiter, options = {}) {
|
|
if (delimiter === "") {
|
|
throw new RangeError("delimiter should contain one or more characters");
|
|
}
|
|
const include = [];
|
|
if (options.includeCopy) {
|
|
include.push("copy");
|
|
}
|
|
if (options.includeDeleted) {
|
|
include.push("deleted");
|
|
}
|
|
if (options.includeMetadata) {
|
|
include.push("metadata");
|
|
}
|
|
if (options.includeSnapshots) {
|
|
include.push("snapshots");
|
|
}
|
|
if (options.includeVersions) {
|
|
include.push("versions");
|
|
}
|
|
if (options.includeUncommitedBlobs) {
|
|
include.push("uncommittedblobs");
|
|
}
|
|
if (options.includeTags) {
|
|
include.push("tags");
|
|
}
|
|
if (options.includeDeletedWithVersions) {
|
|
include.push("deletedwithversions");
|
|
}
|
|
if (options.includeImmutabilityPolicy) {
|
|
include.push("immutabilitypolicy");
|
|
}
|
|
if (options.includeLegalHold) {
|
|
include.push("legalhold");
|
|
}
|
|
if (options.prefix === "") {
|
|
options.prefix = undefined;
|
|
}
|
|
const updatedOptions = {
|
|
...options,
|
|
...(include.length > 0 ? { include: include } : {}),
|
|
};
|
|
// AsyncIterableIterator to iterate over blob prefixes and blobs
|
|
const iter = this.listItemsByHierarchy(delimiter, updatedOptions);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
async next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.listHierarchySegments(delimiter, settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...updatedOptions,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* The Filter Blobs operation enables callers to list blobs in the container whose tags
|
|
* match a given search expression.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.containerContext.filterBlobs({
|
|
abortSignal: options.abortSignal,
|
|
where: tagFilterSqlExpression,
|
|
marker,
|
|
maxPageSize: options.maxPageSize,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const wrappedResponse = {
|
|
...response,
|
|
_response: response._response, // _response is made non-enumerable
|
|
blobs: response.blobs.map((blob) => {
|
|
let tagValue = "";
|
|
if (blob.tags?.blobTagSet.length === 1) {
|
|
tagValue = blob.tags.blobTagSet[0].value;
|
|
}
|
|
return { ...blob, tags: toTags(blob.tags), tagValue };
|
|
}),
|
|
};
|
|
return wrappedResponse;
|
|
});
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for ContainerFindBlobsByTagsSegmentResponse.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
|
|
let response;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
|
|
response.blobs = response.blobs || [];
|
|
marker = response.continuationToken;
|
|
yield response;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for blobs.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param options - Options to findBlobsByTagsItems.
|
|
*/
|
|
async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
|
|
let marker;
|
|
for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
|
|
yield* segment.blobs;
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to find all blobs with specified tag
|
|
* under the specified container.
|
|
*
|
|
* .byPage() returns an async iterable iterator to list the blobs in pages.
|
|
*
|
|
* Example using `for await` syntax:
|
|
*
|
|
* ```ts snippet:ReadmeSampleFindBlobsByTags
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerName = "<container name>";
|
|
* const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
*
|
|
* // Example using `for await` syntax
|
|
* let i = 1;
|
|
* for await (const blob of containerClient.findBlobsByTags("tagkey='tagvalue'")) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
*
|
|
* // Example using `iter.next()` syntax
|
|
* i = 1;
|
|
* const iter = containerClient.findBlobsByTags("tagkey='tagvalue'");
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Blob ${i++}: ${value.name}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Example using `byPage()` syntax
|
|
* i = 1;
|
|
* for await (const page of containerClient
|
|
* .findBlobsByTags("tagkey='tagvalue'")
|
|
* .byPage({ maxPageSize: 20 })) {
|
|
* for (const blob of page.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Example using paging with a marker
|
|
* i = 1;
|
|
* let iterator = containerClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 blob names
|
|
* if (response.blobs) {
|
|
* for (const blob of response.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = containerClient
|
|
* .findBlobsByTags("tagkey='tagvalue'")
|
|
* .byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
* // Prints 10 blob names
|
|
* if (response.blobs) {
|
|
* for (const blob of response.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
findBlobsByTags(tagFilterSqlExpression, options = {}) {
|
|
// AsyncIterableIterator to iterate over blobs
|
|
const listSegmentOptions = {
|
|
...options,
|
|
};
|
|
const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...listSegmentOptions,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* The Get Account Information operation returns the sku name and account kind
|
|
* for the specified account.
|
|
* The Get Account Information operation is available on service versions beginning
|
|
* with version 2018-03-28.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
|
|
*
|
|
* @param options - Options to the Service Get Account Info operation.
|
|
* @returns Response data for the Service Get Account Info operation.
|
|
*/
|
|
async getAccountInfo(options = {}) {
|
|
return tracingClient.withSpan("ContainerClient-getAccountInfo", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.containerContext.getAccountInfo({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
getContainerNameFromUrl() {
|
|
let containerName;
|
|
try {
|
|
// URL may look like the following
|
|
// "https://myaccount.blob.core.windows.net/mycontainer?sasString";
|
|
// "https://myaccount.blob.core.windows.net/mycontainer";
|
|
// IPv4/IPv6 address hosts, Endpoints - `http://127.0.0.1:10000/devstoreaccount1/containername`
|
|
// http://localhost:10001/devstoreaccount1/containername
|
|
const parsedUrl = new URL(this.url);
|
|
if (parsedUrl.hostname.split(".")[1] === "blob") {
|
|
// "https://myaccount.blob.core.windows.net/containername".
|
|
// "https://customdomain.com/containername".
|
|
// .getPath() -> /containername
|
|
containerName = parsedUrl.pathname.split("/")[1];
|
|
}
|
|
else if (utils_common_isIpEndpointStyle(parsedUrl)) {
|
|
// IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/containername
|
|
// Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/containername
|
|
// .getPath() -> /devstoreaccount1/containername
|
|
containerName = parsedUrl.pathname.split("/")[2];
|
|
}
|
|
else {
|
|
// "https://customdomain.com/containername".
|
|
// .getPath() -> /containername
|
|
containerName = parsedUrl.pathname.split("/")[1];
|
|
}
|
|
// decode the encoded containerName - to get all the special characters that might be present in it
|
|
containerName = decodeURIComponent(containerName);
|
|
if (!containerName) {
|
|
throw new Error("Provided containerName is invalid.");
|
|
}
|
|
return containerName;
|
|
}
|
|
catch (error) {
|
|
throw new Error("Unable to extract containerName with provided information.");
|
|
}
|
|
}
|
|
/**
|
|
* Only available for ContainerClient constructed with a shared key credential.
|
|
*
|
|
* Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
|
|
* and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateSasUrl(options) {
|
|
return new Promise((resolve) => {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
|
|
}
|
|
const sas = generateBlobSASQueryParameters({
|
|
containerName: this._containerName,
|
|
...options,
|
|
}, this.credential).toString();
|
|
resolve(utils_common_appendToURLQuery(this.url, sas));
|
|
});
|
|
}
|
|
/**
|
|
* Only available for ContainerClient constructed with a shared key credential.
|
|
*
|
|
* Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
|
|
* based on the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
generateSasStringToSign(options) {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential");
|
|
}
|
|
return generateBlobSASQueryParametersInternal({
|
|
containerName: this._containerName,
|
|
...options,
|
|
}, this.credential).stringToSign;
|
|
}
|
|
/**
|
|
* Generates a Blob Container Service Shared Access Signature (SAS) URI based on the client properties
|
|
* and parameters passed in. The SAS is signed by the input user delegation key.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @param userDelegationKey - Return value of `blobServiceClient.getUserDelegationKey()`
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateUserDelegationSasUrl(options, userDelegationKey) {
|
|
return new Promise((resolve) => {
|
|
const sas = generateBlobSASQueryParameters({
|
|
containerName: this._containerName,
|
|
...options,
|
|
}, userDelegationKey, this.accountName).toString();
|
|
resolve(utils_common_appendToURLQuery(this.url, sas));
|
|
});
|
|
}
|
|
/**
|
|
* Generates string to sign for a Blob Container Service Shared Access Signature (SAS) URI
|
|
* based on the client properties and parameters passed in. The SAS is signed by the input user delegation key.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas
|
|
*
|
|
* @param options - Optional parameters.
|
|
* @param userDelegationKey - Return value of `blobServiceClient.getUserDelegationKey()`
|
|
* @returns The SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateUserDelegationSasStringToSign(options, userDelegationKey) {
|
|
return generateBlobSASQueryParametersInternal({
|
|
containerName: this._containerName,
|
|
...options,
|
|
}, userDelegationKey, this.accountName).stringToSign;
|
|
}
|
|
/**
|
|
* Creates a BlobBatchClient object to conduct batch operations.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
|
|
*
|
|
* @returns A new BlobBatchClient object for this container.
|
|
*/
|
|
getBlobBatchClient() {
|
|
return new BlobBatchClient(this.url, this.pipeline);
|
|
}
|
|
}
|
|
//# sourceMappingURL=ContainerClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/AccountSASPermissions.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* This is a helper class to construct a string representing the permissions granted by an AccountSAS. Setting a value
|
|
* to true means that any SAS which uses these permissions will grant permissions for that operation. Once all the
|
|
* values are set, this should be serialized with toString and set as the permissions field on an
|
|
* {@link AccountSASSignatureValues} object. It is possible to construct the permissions string without this class, but
|
|
* the order of the permissions is particular and this class guarantees correctness.
|
|
*/
|
|
class AccountSASPermissions {
|
|
/**
|
|
* Parse initializes the AccountSASPermissions fields from a string.
|
|
*
|
|
* @param permissions -
|
|
*/
|
|
static parse(permissions) {
|
|
const accountSASPermissions = new AccountSASPermissions();
|
|
for (const c of permissions) {
|
|
switch (c) {
|
|
case "r":
|
|
accountSASPermissions.read = true;
|
|
break;
|
|
case "w":
|
|
accountSASPermissions.write = true;
|
|
break;
|
|
case "d":
|
|
accountSASPermissions.delete = true;
|
|
break;
|
|
case "x":
|
|
accountSASPermissions.deleteVersion = true;
|
|
break;
|
|
case "l":
|
|
accountSASPermissions.list = true;
|
|
break;
|
|
case "a":
|
|
accountSASPermissions.add = true;
|
|
break;
|
|
case "c":
|
|
accountSASPermissions.create = true;
|
|
break;
|
|
case "u":
|
|
accountSASPermissions.update = true;
|
|
break;
|
|
case "p":
|
|
accountSASPermissions.process = true;
|
|
break;
|
|
case "t":
|
|
accountSASPermissions.tag = true;
|
|
break;
|
|
case "f":
|
|
accountSASPermissions.filter = true;
|
|
break;
|
|
case "i":
|
|
accountSASPermissions.setImmutabilityPolicy = true;
|
|
break;
|
|
case "y":
|
|
accountSASPermissions.permanentDelete = true;
|
|
break;
|
|
default:
|
|
throw new RangeError(`Invalid permission character: ${c}`);
|
|
}
|
|
}
|
|
return accountSASPermissions;
|
|
}
|
|
/**
|
|
* Creates a {@link AccountSASPermissions} from a raw object which contains same keys as it
|
|
* and boolean values for them.
|
|
*
|
|
* @param permissionLike -
|
|
*/
|
|
static from(permissionLike) {
|
|
const accountSASPermissions = new AccountSASPermissions();
|
|
if (permissionLike.read) {
|
|
accountSASPermissions.read = true;
|
|
}
|
|
if (permissionLike.write) {
|
|
accountSASPermissions.write = true;
|
|
}
|
|
if (permissionLike.delete) {
|
|
accountSASPermissions.delete = true;
|
|
}
|
|
if (permissionLike.deleteVersion) {
|
|
accountSASPermissions.deleteVersion = true;
|
|
}
|
|
if (permissionLike.filter) {
|
|
accountSASPermissions.filter = true;
|
|
}
|
|
if (permissionLike.tag) {
|
|
accountSASPermissions.tag = true;
|
|
}
|
|
if (permissionLike.list) {
|
|
accountSASPermissions.list = true;
|
|
}
|
|
if (permissionLike.add) {
|
|
accountSASPermissions.add = true;
|
|
}
|
|
if (permissionLike.create) {
|
|
accountSASPermissions.create = true;
|
|
}
|
|
if (permissionLike.update) {
|
|
accountSASPermissions.update = true;
|
|
}
|
|
if (permissionLike.process) {
|
|
accountSASPermissions.process = true;
|
|
}
|
|
if (permissionLike.setImmutabilityPolicy) {
|
|
accountSASPermissions.setImmutabilityPolicy = true;
|
|
}
|
|
if (permissionLike.permanentDelete) {
|
|
accountSASPermissions.permanentDelete = true;
|
|
}
|
|
return accountSASPermissions;
|
|
}
|
|
/**
|
|
* Permission to read resources and list queues and tables granted.
|
|
*/
|
|
read = false;
|
|
/**
|
|
* Permission to write resources granted.
|
|
*/
|
|
write = false;
|
|
/**
|
|
* Permission to delete blobs and files granted.
|
|
*/
|
|
delete = false;
|
|
/**
|
|
* Permission to delete versions granted.
|
|
*/
|
|
deleteVersion = false;
|
|
/**
|
|
* Permission to list blob containers, blobs, shares, directories, and files granted.
|
|
*/
|
|
list = false;
|
|
/**
|
|
* Permission to add messages, table entities, and append to blobs granted.
|
|
*/
|
|
add = false;
|
|
/**
|
|
* Permission to create blobs and files granted.
|
|
*/
|
|
create = false;
|
|
/**
|
|
* Permissions to update messages and table entities granted.
|
|
*/
|
|
update = false;
|
|
/**
|
|
* Permission to get and delete messages granted.
|
|
*/
|
|
process = false;
|
|
/**
|
|
* Specfies Tag access granted.
|
|
*/
|
|
tag = false;
|
|
/**
|
|
* Permission to filter blobs.
|
|
*/
|
|
filter = false;
|
|
/**
|
|
* Permission to set immutability policy.
|
|
*/
|
|
setImmutabilityPolicy = false;
|
|
/**
|
|
* Specifies that Permanent Delete is permitted.
|
|
*/
|
|
permanentDelete = false;
|
|
/**
|
|
* Produces the SAS permissions string for an Azure Storage account.
|
|
* Call this method to set AccountSASSignatureValues Permissions field.
|
|
*
|
|
* Using this method will guarantee the resource types are in
|
|
* an order accepted by the service.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
|
|
*
|
|
*/
|
|
toString() {
|
|
// The order of the characters should be as specified here to ensure correctness:
|
|
// https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
|
|
// Use a string array instead of string concatenating += operator for performance
|
|
const permissions = [];
|
|
if (this.read) {
|
|
permissions.push("r");
|
|
}
|
|
if (this.write) {
|
|
permissions.push("w");
|
|
}
|
|
if (this.delete) {
|
|
permissions.push("d");
|
|
}
|
|
if (this.deleteVersion) {
|
|
permissions.push("x");
|
|
}
|
|
if (this.filter) {
|
|
permissions.push("f");
|
|
}
|
|
if (this.tag) {
|
|
permissions.push("t");
|
|
}
|
|
if (this.list) {
|
|
permissions.push("l");
|
|
}
|
|
if (this.add) {
|
|
permissions.push("a");
|
|
}
|
|
if (this.create) {
|
|
permissions.push("c");
|
|
}
|
|
if (this.update) {
|
|
permissions.push("u");
|
|
}
|
|
if (this.process) {
|
|
permissions.push("p");
|
|
}
|
|
if (this.setImmutabilityPolicy) {
|
|
permissions.push("i");
|
|
}
|
|
if (this.permanentDelete) {
|
|
permissions.push("y");
|
|
}
|
|
return permissions.join("");
|
|
}
|
|
}
|
|
//# sourceMappingURL=AccountSASPermissions.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/AccountSASResourceTypes.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* This is a helper class to construct a string representing the resources accessible by an AccountSAS. Setting a value
|
|
* to true means that any SAS which uses these permissions will grant access to that resource type. Once all the
|
|
* values are set, this should be serialized with toString and set as the resources field on an
|
|
* {@link AccountSASSignatureValues} object. It is possible to construct the resources string without this class, but
|
|
* the order of the resources is particular and this class guarantees correctness.
|
|
*/
|
|
class AccountSASResourceTypes {
|
|
/**
|
|
* Creates an {@link AccountSASResourceTypes} from the specified resource types string. This method will throw an
|
|
* Error if it encounters a character that does not correspond to a valid resource type.
|
|
*
|
|
* @param resourceTypes -
|
|
*/
|
|
static parse(resourceTypes) {
|
|
const accountSASResourceTypes = new AccountSASResourceTypes();
|
|
for (const c of resourceTypes) {
|
|
switch (c) {
|
|
case "s":
|
|
accountSASResourceTypes.service = true;
|
|
break;
|
|
case "c":
|
|
accountSASResourceTypes.container = true;
|
|
break;
|
|
case "o":
|
|
accountSASResourceTypes.object = true;
|
|
break;
|
|
default:
|
|
throw new RangeError(`Invalid resource type: ${c}`);
|
|
}
|
|
}
|
|
return accountSASResourceTypes;
|
|
}
|
|
/**
|
|
* Permission to access service level APIs granted.
|
|
*/
|
|
service = false;
|
|
/**
|
|
* Permission to access container level APIs (Blob Containers, Tables, Queues, File Shares) granted.
|
|
*/
|
|
container = false;
|
|
/**
|
|
* Permission to access object level APIs (Blobs, Table Entities, Queue Messages, Files) granted.
|
|
*/
|
|
object = false;
|
|
/**
|
|
* Converts the given resource types to a string.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
|
|
*
|
|
*/
|
|
toString() {
|
|
const resourceTypes = [];
|
|
if (this.service) {
|
|
resourceTypes.push("s");
|
|
}
|
|
if (this.container) {
|
|
resourceTypes.push("c");
|
|
}
|
|
if (this.object) {
|
|
resourceTypes.push("o");
|
|
}
|
|
return resourceTypes.join("");
|
|
}
|
|
}
|
|
//# sourceMappingURL=AccountSASResourceTypes.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/AccountSASServices.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* This is a helper class to construct a string representing the services accessible by an AccountSAS. Setting a value
|
|
* to true means that any SAS which uses these permissions will grant access to that service. Once all the
|
|
* values are set, this should be serialized with toString and set as the services field on an
|
|
* {@link AccountSASSignatureValues} object. It is possible to construct the services string without this class, but
|
|
* the order of the services is particular and this class guarantees correctness.
|
|
*/
|
|
class AccountSASServices {
|
|
/**
|
|
* Creates an {@link AccountSASServices} from the specified services string. This method will throw an
|
|
* Error if it encounters a character that does not correspond to a valid service.
|
|
*
|
|
* @param services -
|
|
*/
|
|
static parse(services) {
|
|
const accountSASServices = new AccountSASServices();
|
|
for (const c of services) {
|
|
switch (c) {
|
|
case "b":
|
|
accountSASServices.blob = true;
|
|
break;
|
|
case "f":
|
|
accountSASServices.file = true;
|
|
break;
|
|
case "q":
|
|
accountSASServices.queue = true;
|
|
break;
|
|
case "t":
|
|
accountSASServices.table = true;
|
|
break;
|
|
default:
|
|
throw new RangeError(`Invalid service character: ${c}`);
|
|
}
|
|
}
|
|
return accountSASServices;
|
|
}
|
|
/**
|
|
* Permission to access blob resources granted.
|
|
*/
|
|
blob = false;
|
|
/**
|
|
* Permission to access file resources granted.
|
|
*/
|
|
file = false;
|
|
/**
|
|
* Permission to access queue resources granted.
|
|
*/
|
|
queue = false;
|
|
/**
|
|
* Permission to access table resources granted.
|
|
*/
|
|
table = false;
|
|
/**
|
|
* Converts the given services to a string.
|
|
*
|
|
*/
|
|
toString() {
|
|
const services = [];
|
|
if (this.blob) {
|
|
services.push("b");
|
|
}
|
|
if (this.table) {
|
|
services.push("t");
|
|
}
|
|
if (this.queue) {
|
|
services.push("q");
|
|
}
|
|
if (this.file) {
|
|
services.push("f");
|
|
}
|
|
return services.join("");
|
|
}
|
|
}
|
|
//# sourceMappingURL=AccountSASServices.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/sas/AccountSASSignatureValues.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* ONLY AVAILABLE IN NODE.JS RUNTIME.
|
|
*
|
|
* Generates a {@link SASQueryParameters} object which contains all SAS query parameters needed to make an actual
|
|
* REST request.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/constructing-an-account-sas
|
|
*
|
|
* @param accountSASSignatureValues -
|
|
* @param sharedKeyCredential -
|
|
*/
|
|
function generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) {
|
|
return generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential)
|
|
.sasQueryParameters;
|
|
}
|
|
function generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential) {
|
|
const version = accountSASSignatureValues.version
|
|
? accountSASSignatureValues.version
|
|
: SERVICE_VERSION;
|
|
if (accountSASSignatureValues.permissions &&
|
|
accountSASSignatureValues.permissions.setImmutabilityPolicy &&
|
|
version < "2020-08-04") {
|
|
throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission.");
|
|
}
|
|
if (accountSASSignatureValues.permissions &&
|
|
accountSASSignatureValues.permissions.deleteVersion &&
|
|
version < "2019-10-10") {
|
|
throw RangeError("'version' must be >= '2019-10-10' when provided 'x' permission.");
|
|
}
|
|
if (accountSASSignatureValues.permissions &&
|
|
accountSASSignatureValues.permissions.permanentDelete &&
|
|
version < "2019-10-10") {
|
|
throw RangeError("'version' must be >= '2019-10-10' when provided 'y' permission.");
|
|
}
|
|
if (accountSASSignatureValues.permissions &&
|
|
accountSASSignatureValues.permissions.tag &&
|
|
version < "2019-12-12") {
|
|
throw RangeError("'version' must be >= '2019-12-12' when provided 't' permission.");
|
|
}
|
|
if (accountSASSignatureValues.permissions &&
|
|
accountSASSignatureValues.permissions.filter &&
|
|
version < "2019-12-12") {
|
|
throw RangeError("'version' must be >= '2019-12-12' when provided 'f' permission.");
|
|
}
|
|
if (accountSASSignatureValues.encryptionScope && version < "2020-12-06") {
|
|
throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS.");
|
|
}
|
|
const parsedPermissions = AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString());
|
|
const parsedServices = AccountSASServices.parse(accountSASSignatureValues.services).toString();
|
|
const parsedResourceTypes = AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString();
|
|
let stringToSign;
|
|
if (version >= "2020-12-06") {
|
|
stringToSign = [
|
|
sharedKeyCredential.accountName,
|
|
parsedPermissions,
|
|
parsedServices,
|
|
parsedResourceTypes,
|
|
accountSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(accountSASSignatureValues.startsOn, false)
|
|
: "",
|
|
utils_common_truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),
|
|
accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",
|
|
accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
|
|
version,
|
|
accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "",
|
|
"", // Account SAS requires an additional newline character
|
|
].join("\n");
|
|
}
|
|
else {
|
|
stringToSign = [
|
|
sharedKeyCredential.accountName,
|
|
parsedPermissions,
|
|
parsedServices,
|
|
parsedResourceTypes,
|
|
accountSASSignatureValues.startsOn
|
|
? utils_common_truncatedISO8061Date(accountSASSignatureValues.startsOn, false)
|
|
: "",
|
|
utils_common_truncatedISO8061Date(accountSASSignatureValues.expiresOn, false),
|
|
accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "",
|
|
accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "",
|
|
version,
|
|
"", // Account SAS requires an additional newline character
|
|
].join("\n");
|
|
}
|
|
const signature = sharedKeyCredential.computeHMACSHA256(stringToSign);
|
|
return {
|
|
sasQueryParameters: new SASQueryParameters(version, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope),
|
|
stringToSign: stringToSign,
|
|
};
|
|
}
|
|
//# sourceMappingURL=AccountSASSignatureValues.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobServiceClient.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function isBlobGetUserDelegationKeyParameters(parameter) {
|
|
if (!parameter || typeof parameter !== "object") {
|
|
return false;
|
|
}
|
|
const castParameter = parameter;
|
|
return castParameter.expiresOn instanceof Date;
|
|
}
|
|
/**
|
|
* A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you
|
|
* to manipulate blob containers.
|
|
*/
|
|
class BlobServiceClient extends StorageClient_StorageClient {
|
|
/**
|
|
* serviceContext provided by protocol layer.
|
|
*/
|
|
serviceContext;
|
|
blobClientConfig;
|
|
/**
|
|
*
|
|
* Creates an instance of BlobServiceClient from connection string.
|
|
*
|
|
* @param connectionString - Account connection string or a SAS connection string of an Azure storage account.
|
|
* [ Note - Account connection string can only be used in NODE.JS runtime. ]
|
|
* Account connection string example -
|
|
* `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`
|
|
* SAS connection string example -
|
|
* `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`
|
|
* @param options - Optional. Options to configure the HTTP pipeline.
|
|
*/
|
|
static fromConnectionString(connectionString,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
options = options || {};
|
|
const extractedCreds = utils_common_extractConnectionStringParts(connectionString);
|
|
if (extractedCreds.kind === "AccountConnString") {
|
|
if (esm_isNodeLike) {
|
|
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
|
|
if (!options.proxyOptions) {
|
|
options.proxyOptions = proxyPolicy_getDefaultProxySettings(extractedCreds.proxyUri);
|
|
}
|
|
const pipeline = newPipeline(sharedKeyCredential, options);
|
|
return new BlobServiceClient(extractedCreds.url, pipeline);
|
|
}
|
|
else {
|
|
throw new Error("Account connection string is only supported in Node.js environment");
|
|
}
|
|
}
|
|
else if (extractedCreds.kind === "SASConnString") {
|
|
const pipeline = newPipeline(new AnonymousCredential(), options);
|
|
return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline, options);
|
|
}
|
|
else {
|
|
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
|
|
}
|
|
}
|
|
constructor(url, credentialOrPipeline,
|
|
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
|
|
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
|
|
options) {
|
|
options = options ?? {};
|
|
let pipeline;
|
|
if (isPipelineLike(credentialOrPipeline)) {
|
|
pipeline = credentialOrPipeline;
|
|
}
|
|
else if ((esm_isNodeLike && credentialOrPipeline instanceof StorageSharedKeyCredential) ||
|
|
credentialOrPipeline instanceof AnonymousCredential ||
|
|
isTokenCredential(credentialOrPipeline)) {
|
|
pipeline = newPipeline(credentialOrPipeline, options);
|
|
}
|
|
else {
|
|
// The second parameter is undefined. Use anonymous credential
|
|
pipeline = newPipeline(new AnonymousCredential(), options);
|
|
}
|
|
super(url, pipeline);
|
|
this.serviceContext = this.storageClientContext.service;
|
|
this.blobClientConfig = options;
|
|
}
|
|
/**
|
|
* Creates a {@link ContainerClient} object
|
|
*
|
|
* @param containerName - A container name
|
|
* @returns A new ContainerClient object for the given container name.
|
|
*
|
|
* Example usage:
|
|
*
|
|
* ```ts snippet:BlobServiceClientGetContainerClient
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* const containerClient = blobServiceClient.getContainerClient("<container name>");
|
|
* ```
|
|
*/
|
|
getContainerClient(containerName) {
|
|
return new ContainerClient(utils_common_appendToURLPath(this.url, encodeURIComponent(containerName)), this.pipeline, this.blobClientConfig);
|
|
}
|
|
/**
|
|
* Create a Blob container. @see https://learn.microsoft.com/rest/api/storageservices/create-container
|
|
*
|
|
* @param containerName - Name of the container to create.
|
|
* @param options - Options to configure Container Create operation.
|
|
* @returns Container creation response and the corresponding container client.
|
|
*/
|
|
async createContainer(containerName, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-createContainer", options, async (updatedOptions) => {
|
|
const containerClient = this.getContainerClient(containerName);
|
|
const containerCreateResponse = await containerClient.create(updatedOptions);
|
|
return {
|
|
containerClient,
|
|
containerCreateResponse,
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Deletes a Blob container.
|
|
*
|
|
* @param containerName - Name of the container to delete.
|
|
* @param options - Options to configure Container Delete operation.
|
|
* @returns Container deletion response.
|
|
*/
|
|
async deleteContainer(containerName, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-deleteContainer", options, async (updatedOptions) => {
|
|
const containerClient = this.getContainerClient(containerName);
|
|
return containerClient.delete(updatedOptions);
|
|
});
|
|
}
|
|
/**
|
|
* Restore a previously deleted Blob container.
|
|
* This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.
|
|
*
|
|
* @param deletedContainerName - Name of the previously deleted container.
|
|
* @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.
|
|
* @param options - Options to configure Container Restore operation.
|
|
* @returns Container deletion response.
|
|
*/
|
|
async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-undeleteContainer", options, async (updatedOptions) => {
|
|
const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);
|
|
// Hack to access a protected member.
|
|
const containerContext = containerClient["storageClientContext"].container;
|
|
const containerUndeleteResponse = utils_common_assertResponse(await containerContext.restore({
|
|
deletedContainerName,
|
|
deletedContainerVersion,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
return { containerClient, containerUndeleteResponse };
|
|
});
|
|
}
|
|
/**
|
|
* Gets the properties of a storage account’s Blob service, including properties
|
|
* for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
|
|
*
|
|
* @param options - Options to the Service Get Properties operation.
|
|
* @returns Response data for the Service Get Properties operation.
|
|
*/
|
|
async getProperties(options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-getProperties", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.serviceContext.getProperties({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Sets properties for a storage account’s Blob service endpoint, including properties
|
|
* for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/set-blob-service-properties
|
|
*
|
|
* @param properties -
|
|
* @param options - Options to the Service Set Properties operation.
|
|
* @returns Response data for the Service Set Properties operation.
|
|
*/
|
|
async setProperties(properties, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-setProperties", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.serviceContext.setProperties(properties, {
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Retrieves statistics related to replication for the Blob service. It is only
|
|
* available on the secondary location endpoint when read-access geo-redundant
|
|
* replication is enabled for the storage account.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-stats
|
|
*
|
|
* @param options - Options to the Service Get Statistics operation.
|
|
* @returns Response data for the Service Get Statistics operation.
|
|
*/
|
|
async getStatistics(options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-getStatistics", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.serviceContext.getStatistics({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* The Get Account Information operation returns the sku name and account kind
|
|
* for the specified account.
|
|
* The Get Account Information operation is available on service versions beginning
|
|
* with version 2018-03-28.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-account-information
|
|
*
|
|
* @param options - Options to the Service Get Account Info operation.
|
|
* @returns Response data for the Service Get Account Info operation.
|
|
*/
|
|
async getAccountInfo(options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-getAccountInfo", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.serviceContext.getAccountInfo({
|
|
abortSignal: options.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* Returns a list of the containers under the specified account.
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/list-containers2
|
|
*
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of containers to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all containers remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to the Service List Container Segment operation.
|
|
* @returns Response data for the Service List Container Segment operation.
|
|
*/
|
|
async listContainersSegment(marker, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-listContainersSegment", options, async (updatedOptions) => {
|
|
return utils_common_assertResponse(await this.serviceContext.listContainersSegment({
|
|
abortSignal: options.abortSignal,
|
|
marker,
|
|
...options,
|
|
include: typeof options.include === "string" ? [options.include] : options.include,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
});
|
|
}
|
|
/**
|
|
* The Filter Blobs operation enables callers to list blobs across all containers whose tags
|
|
* match a given search expression. Filter blobs searches across all containers within a
|
|
* storage account but can be scoped within the expression to a single container.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
|
|
return tracingClient.withSpan("BlobServiceClient-findBlobsByTagsSegment", options, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.serviceContext.filterBlobs({
|
|
abortSignal: options.abortSignal,
|
|
where: tagFilterSqlExpression,
|
|
marker,
|
|
maxPageSize: options.maxPageSize,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const wrappedResponse = {
|
|
...response,
|
|
_response: response._response, // _response is made non-enumerable
|
|
blobs: response.blobs.map((blob) => {
|
|
let tagValue = "";
|
|
if (blob.tags?.blobTagSet.length === 1) {
|
|
tagValue = blob.tags.blobTagSet[0].value;
|
|
}
|
|
return { ...blob, tags: toTags(blob.tags), tagValue };
|
|
}),
|
|
};
|
|
return wrappedResponse;
|
|
});
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of blobs to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all blobs remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
async *findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
|
|
let response;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
response = await this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options);
|
|
response.blobs = response.blobs || [];
|
|
marker = response.continuationToken;
|
|
yield response;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for blobs.
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param options - Options to findBlobsByTagsItems.
|
|
*/
|
|
async *findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
|
|
let marker;
|
|
for await (const segment of this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)) {
|
|
yield* segment.blobs;
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to find all blobs with specified tag
|
|
* under the specified account.
|
|
*
|
|
* .byPage() returns an async iterable iterator to list the blobs in pages.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/get-blob-service-properties
|
|
*
|
|
* ```ts snippet:BlobServiceClientFindBlobsByTags
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* // Use for await to iterate the blobs
|
|
* let i = 1;
|
|
* for await (const blob of blobServiceClient.findBlobsByTags("tagkey='tagvalue'")) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
*
|
|
* // Use iter.next() to iterate the blobs
|
|
* i = 1;
|
|
* const iter = blobServiceClient.findBlobsByTags("tagkey='tagvalue'");
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Blob ${i++}: ${value.name}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Use byPage() to iterate the blobs
|
|
* i = 1;
|
|
* for await (const page of blobServiceClient
|
|
* .findBlobsByTags("tagkey='tagvalue'")
|
|
* .byPage({ maxPageSize: 20 })) {
|
|
* for (const blob of page.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Use paging with a marker
|
|
* i = 1;
|
|
* let iterator = blobServiceClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
* // Prints 2 blob names
|
|
* if (response.blobs) {
|
|
* for (const blob of response.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = blobServiceClient
|
|
* .findBlobsByTags("tagkey='tagvalue'")
|
|
* .byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
*
|
|
* // Prints blob names
|
|
* if (response.blobs) {
|
|
* for (const blob of response.blobs) {
|
|
* console.log(`Blob ${i++}: ${blob.name}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
|
|
* The given expression must evaluate to true for a blob to be returned in the results.
|
|
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
|
|
* however, only a subset of the OData filter syntax is supported in the Blob service.
|
|
* @param options - Options to find blobs by tags.
|
|
*/
|
|
findBlobsByTags(tagFilterSqlExpression, options = {}) {
|
|
// AsyncIterableIterator to iterate over blobs
|
|
const listSegmentOptions = {
|
|
...options,
|
|
};
|
|
const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...listSegmentOptions,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses
|
|
*
|
|
* @param marker - A string value that identifies the portion of
|
|
* the list of containers to be returned with the next listing operation. The
|
|
* operation returns the continuationToken value within the response body if the
|
|
* listing operation did not return all containers remaining to be listed
|
|
* with the current page. The continuationToken value can be used as the value for
|
|
* the marker parameter in a subsequent call to request the next page of list
|
|
* items. The marker value is opaque to the client.
|
|
* @param options - Options to list containers operation.
|
|
*/
|
|
async *listSegments(marker, options = {}) {
|
|
let listContainersSegmentResponse;
|
|
if (!!marker || marker === undefined) {
|
|
do {
|
|
listContainersSegmentResponse = await this.listContainersSegment(marker, options);
|
|
listContainersSegmentResponse.containerItems =
|
|
listContainersSegmentResponse.containerItems || [];
|
|
marker = listContainersSegmentResponse.continuationToken;
|
|
yield await listContainersSegmentResponse;
|
|
} while (marker);
|
|
}
|
|
}
|
|
/**
|
|
* Returns an AsyncIterableIterator for Container Items
|
|
*
|
|
* @param options - Options to list containers operation.
|
|
*/
|
|
async *listItems(options = {}) {
|
|
let marker;
|
|
for await (const segment of this.listSegments(marker, options)) {
|
|
yield* segment.containerItems;
|
|
}
|
|
}
|
|
/**
|
|
* Returns an async iterable iterator to list all the containers
|
|
* under the specified account.
|
|
*
|
|
* .byPage() returns an async iterable iterator to list the containers in pages.
|
|
*
|
|
* ```ts snippet:BlobServiceClientListContainers
|
|
* import { BlobServiceClient } from "@azure/storage-blob";
|
|
* import { DefaultAzureCredential } from "@azure/identity";
|
|
*
|
|
* const account = "<account>";
|
|
* const blobServiceClient = new BlobServiceClient(
|
|
* `https://${account}.blob.core.windows.net`,
|
|
* new DefaultAzureCredential(),
|
|
* );
|
|
*
|
|
* // Use for await to iterate the containers
|
|
* let i = 1;
|
|
* for await (const container of blobServiceClient.listContainers()) {
|
|
* console.log(`Container ${i++}: ${container.name}`);
|
|
* }
|
|
*
|
|
* // Use iter.next() to iterate the containers
|
|
* i = 1;
|
|
* const iter = blobServiceClient.listContainers();
|
|
* let { value, done } = await iter.next();
|
|
* while (!done) {
|
|
* console.log(`Container ${i++}: ${value.name}`);
|
|
* ({ value, done } = await iter.next());
|
|
* }
|
|
*
|
|
* // Use byPage() to iterate the containers
|
|
* i = 1;
|
|
* for await (const page of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {
|
|
* for (const container of page.containerItems) {
|
|
* console.log(`Container ${i++}: ${container.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Use paging with a marker
|
|
* i = 1;
|
|
* let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });
|
|
* let response = (await iterator.next()).value;
|
|
*
|
|
* // Prints 2 container names
|
|
* if (response.containerItems) {
|
|
* for (const container of response.containerItems) {
|
|
* console.log(`Container ${i++}: ${container.name}`);
|
|
* }
|
|
* }
|
|
*
|
|
* // Gets next marker
|
|
* let marker = response.continuationToken;
|
|
* // Passing next marker as continuationToken
|
|
* iterator = blobServiceClient
|
|
* .listContainers()
|
|
* .byPage({ continuationToken: marker, maxPageSize: 10 });
|
|
* response = (await iterator.next()).value;
|
|
*
|
|
* // Prints 10 container names
|
|
* if (response.containerItems) {
|
|
* for (const container of response.containerItems) {
|
|
* console.log(`Container ${i++}: ${container.name}`);
|
|
* }
|
|
* }
|
|
* ```
|
|
*
|
|
* @param options - Options to list containers.
|
|
* @returns An asyncIterableIterator that supports paging.
|
|
*/
|
|
listContainers(options = {}) {
|
|
if (options.prefix === "") {
|
|
options.prefix = undefined;
|
|
}
|
|
const include = [];
|
|
if (options.includeDeleted) {
|
|
include.push("deleted");
|
|
}
|
|
if (options.includeMetadata) {
|
|
include.push("metadata");
|
|
}
|
|
if (options.includeSystem) {
|
|
include.push("system");
|
|
}
|
|
// AsyncIterableIterator to iterate over containers
|
|
const listSegmentOptions = {
|
|
...options,
|
|
...(include.length > 0 ? { include } : {}),
|
|
};
|
|
const iter = this.listItems(listSegmentOptions);
|
|
return {
|
|
/**
|
|
* The next method, part of the iteration protocol
|
|
*/
|
|
next() {
|
|
return iter.next();
|
|
},
|
|
/**
|
|
* The connection to the async iterator, part of the iteration protocol
|
|
*/
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
},
|
|
/**
|
|
* Return an AsyncIterableIterator that works a page at a time
|
|
*/
|
|
byPage: (settings = {}) => {
|
|
return this.listSegments(settings.continuationToken, {
|
|
maxPageSize: settings.maxPageSize,
|
|
...listSegmentOptions,
|
|
});
|
|
},
|
|
};
|
|
}
|
|
async getUserDelegationKey(startsOnOrParam, expiresOnOrOption, options = {}) {
|
|
let startsOn = startsOnOrParam;
|
|
let expiresOn = expiresOnOrOption;
|
|
let userDelegationTid = undefined;
|
|
let getUserDelegationKeyOptions = options;
|
|
if (isBlobGetUserDelegationKeyParameters(startsOnOrParam)) {
|
|
startsOn = startsOnOrParam.startsOn;
|
|
expiresOn = startsOnOrParam.expiresOn;
|
|
userDelegationTid = startsOnOrParam.delegatedUserTenantId;
|
|
getUserDelegationKeyOptions = expiresOnOrOption;
|
|
getUserDelegationKeyOptions = getUserDelegationKeyOptions ?? {};
|
|
}
|
|
return tracingClient.withSpan("BlobServiceClient-getUserDelegationKey", getUserDelegationKeyOptions, async (updatedOptions) => {
|
|
const response = utils_common_assertResponse(await this.serviceContext.getUserDelegationKey({
|
|
startsOn: utils_common_truncatedISO8061Date(startsOn, false),
|
|
expiresOn: utils_common_truncatedISO8061Date(expiresOn, false),
|
|
delegatedUserTid: userDelegationTid,
|
|
}, {
|
|
abortSignal: getUserDelegationKeyOptions.abortSignal,
|
|
tracingOptions: updatedOptions.tracingOptions,
|
|
}));
|
|
const userDelegationKey = {
|
|
signedObjectId: response.signedObjectId,
|
|
signedTenantId: response.signedTenantId,
|
|
signedStartsOn: new Date(response.signedStartsOn),
|
|
signedExpiresOn: new Date(response.signedExpiresOn),
|
|
signedService: response.signedService,
|
|
signedVersion: response.signedVersion,
|
|
signedDelegatedUserTenantId: response.signedDelegatedUserTenantId,
|
|
value: response.value,
|
|
};
|
|
const res = {
|
|
_response: response._response,
|
|
requestId: response.requestId,
|
|
clientRequestId: response.clientRequestId,
|
|
version: response.version,
|
|
date: response.date,
|
|
errorCode: response.errorCode,
|
|
...userDelegationKey,
|
|
};
|
|
return res;
|
|
});
|
|
}
|
|
/**
|
|
* Creates a BlobBatchClient object to conduct batch operations.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/blob-batch
|
|
*
|
|
* @returns A new BlobBatchClient object for this service.
|
|
*/
|
|
getBlobBatchClient() {
|
|
return new BlobBatchClient(this.url, this.pipeline);
|
|
}
|
|
/**
|
|
* Only available for BlobServiceClient constructed with a shared key credential.
|
|
*
|
|
* Generates a Blob account Shared Access Signature (SAS) URI based on the client properties
|
|
* and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
|
|
*
|
|
* @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
|
|
* @param permissions - Specifies the list of permissions to be associated with the SAS.
|
|
* @param resourceTypes - Specifies the resource types associated with the shared access signature.
|
|
* @param options - Optional parameters.
|
|
* @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
|
|
}
|
|
if (expiresOn === undefined) {
|
|
const now = new Date();
|
|
expiresOn = new Date(now.getTime() + 3600 * 1000);
|
|
}
|
|
const sas = generateAccountSASQueryParameters({
|
|
permissions,
|
|
expiresOn,
|
|
resourceTypes,
|
|
services: AccountSASServices.parse("b").toString(),
|
|
...options,
|
|
}, this.credential).toString();
|
|
return utils_common_appendToURLQuery(this.url, sas);
|
|
}
|
|
/**
|
|
* Only available for BlobServiceClient constructed with a shared key credential.
|
|
*
|
|
* Generates string to sign for a Blob account Shared Access Signature (SAS) URI based on
|
|
* the client properties and parameters passed in. The SAS is signed by the shared key credential of the client.
|
|
*
|
|
* @see https://learn.microsoft.com/rest/api/storageservices/create-account-sas
|
|
*
|
|
* @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
|
|
* @param permissions - Specifies the list of permissions to be associated with the SAS.
|
|
* @param resourceTypes - Specifies the resource types associated with the shared access signature.
|
|
* @param options - Optional parameters.
|
|
* @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
|
|
*/
|
|
generateSasStringToSign(expiresOn, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
|
|
if (!(this.credential instanceof StorageSharedKeyCredential)) {
|
|
throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
|
|
}
|
|
if (expiresOn === undefined) {
|
|
const now = new Date();
|
|
expiresOn = new Date(now.getTime() + 3600 * 1000);
|
|
}
|
|
return generateAccountSASQueryParametersInternal({
|
|
permissions,
|
|
expiresOn,
|
|
resourceTypes,
|
|
services: AccountSASServices.parse("b").toString(),
|
|
...options,
|
|
}, this.credential).stringToSign;
|
|
}
|
|
}
|
|
//# sourceMappingURL=BlobServiceClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/generatedModels.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
/** Known values of {@link EncryptionAlgorithmType} that the service accepts. */
|
|
var generatedModels_KnownEncryptionAlgorithmType;
|
|
(function (KnownEncryptionAlgorithmType) {
|
|
KnownEncryptionAlgorithmType["AES256"] = "AES256";
|
|
})(generatedModels_KnownEncryptionAlgorithmType || (generatedModels_KnownEncryptionAlgorithmType = {}));
|
|
//# sourceMappingURL=generatedModels.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/index.js
|
|
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//# sourceMappingURL=index.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/shared/errors.js
|
|
class FilesNotFoundError extends Error {
|
|
constructor(files = []) {
|
|
let message = 'No files were found to upload';
|
|
if (files.length > 0) {
|
|
message += `: ${files.join(', ')}`;
|
|
}
|
|
super(message);
|
|
this.files = files;
|
|
this.name = 'FilesNotFoundError';
|
|
}
|
|
}
|
|
class InvalidResponseError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'InvalidResponseError';
|
|
}
|
|
}
|
|
class CacheNotFoundError extends Error {
|
|
constructor(message = 'Cache not found') {
|
|
super(message);
|
|
this.name = 'CacheNotFoundError';
|
|
}
|
|
}
|
|
class GHESNotSupportedError extends Error {
|
|
constructor(message = '@actions/cache v4.1.4+, actions/cache/save@v4+ and actions/cache/restore@v4+ are not currently supported on GHES.') {
|
|
super(message);
|
|
this.name = 'GHESNotSupportedError';
|
|
}
|
|
}
|
|
class NetworkError extends Error {
|
|
constructor(code) {
|
|
const message = `Unable to make request: ${code}\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`;
|
|
super(message);
|
|
this.code = code;
|
|
this.name = 'NetworkError';
|
|
}
|
|
}
|
|
NetworkError.isNetworkErrorCode = (code) => {
|
|
if (!code)
|
|
return false;
|
|
return [
|
|
'ECONNRESET',
|
|
'ENOTFOUND',
|
|
'ETIMEDOUT',
|
|
'ECONNREFUSED',
|
|
'EHOSTUNREACH'
|
|
].includes(code);
|
|
};
|
|
class UsageError extends Error {
|
|
constructor() {
|
|
const message = `Cache storage quota has been hit. Unable to upload any new cache entries.\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`;
|
|
super(message);
|
|
this.name = 'UsageError';
|
|
}
|
|
}
|
|
UsageError.isUsageErrorMessage = (msg) => {
|
|
if (!msg)
|
|
return false;
|
|
return msg.includes('insufficient usage');
|
|
};
|
|
class RateLimitError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'RateLimitError';
|
|
}
|
|
}
|
|
//# sourceMappingURL=errors.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/uploadUtils.js
|
|
var uploadUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* Class for tracking the upload state and displaying stats.
|
|
*/
|
|
class UploadProgress {
|
|
constructor(contentLength) {
|
|
this.contentLength = contentLength;
|
|
this.sentBytes = 0;
|
|
this.displayedComplete = false;
|
|
this.startTime = Date.now();
|
|
}
|
|
/**
|
|
* Sets the number of bytes sent
|
|
*
|
|
* @param sentBytes the number of bytes sent
|
|
*/
|
|
setSentBytes(sentBytes) {
|
|
this.sentBytes = sentBytes;
|
|
}
|
|
/**
|
|
* Returns the total number of bytes transferred.
|
|
*/
|
|
getTransferredBytes() {
|
|
return this.sentBytes;
|
|
}
|
|
/**
|
|
* Returns true if the upload is complete.
|
|
*/
|
|
isDone() {
|
|
return this.getTransferredBytes() === this.contentLength;
|
|
}
|
|
/**
|
|
* Prints the current upload stats. Once the upload completes, this will print one
|
|
* last line and then stop.
|
|
*/
|
|
display() {
|
|
if (this.displayedComplete) {
|
|
return;
|
|
}
|
|
const transferredBytes = this.sentBytes;
|
|
const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
|
|
const elapsedTime = Date.now() - this.startTime;
|
|
const uploadSpeed = (transferredBytes /
|
|
(1024 * 1024) /
|
|
(elapsedTime / 1000)).toFixed(1);
|
|
lib_core/* info */.pq(`Sent ${transferredBytes} of ${this.contentLength} (${percentage}%), ${uploadSpeed} MBs/sec`);
|
|
if (this.isDone()) {
|
|
this.displayedComplete = true;
|
|
}
|
|
}
|
|
/**
|
|
* Returns a function used to handle TransferProgressEvents.
|
|
*/
|
|
onProgress() {
|
|
return (progress) => {
|
|
this.setSentBytes(progress.loadedBytes);
|
|
};
|
|
}
|
|
/**
|
|
* Starts the timer that displays the stats.
|
|
*
|
|
* @param delayInMs the delay between each write
|
|
*/
|
|
startDisplayTimer(delayInMs = 1000) {
|
|
const displayCallback = () => {
|
|
this.display();
|
|
if (!this.isDone()) {
|
|
this.timeoutHandle = setTimeout(displayCallback, delayInMs);
|
|
}
|
|
};
|
|
this.timeoutHandle = setTimeout(displayCallback, delayInMs);
|
|
}
|
|
/**
|
|
* Stops the timer that displays the stats. As this typically indicates the upload
|
|
* is complete, this will display one last line, unless the last line has already
|
|
* been written.
|
|
*/
|
|
stopDisplayTimer() {
|
|
if (this.timeoutHandle) {
|
|
clearTimeout(this.timeoutHandle);
|
|
this.timeoutHandle = undefined;
|
|
}
|
|
this.display();
|
|
}
|
|
}
|
|
/**
|
|
* Uploads a cache archive directly to Azure Blob Storage using the Azure SDK.
|
|
* This function will display progress information to the console. Concurrency of the
|
|
* upload is determined by the calling functions.
|
|
*
|
|
* @param signedUploadURL
|
|
* @param archivePath
|
|
* @param options
|
|
* @returns
|
|
*/
|
|
function uploadCacheArchiveSDK(signedUploadURL, archivePath, options) {
|
|
return uploadUtils_awaiter(this, void 0, void 0, function* () {
|
|
var _a;
|
|
const blobClient = new BlobClient(signedUploadURL);
|
|
const blockBlobClient = blobClient.getBlockBlobClient();
|
|
const uploadProgress = new UploadProgress((_a = options === null || options === void 0 ? void 0 : options.archiveSizeBytes) !== null && _a !== void 0 ? _a : 0);
|
|
// Specify data transfer options
|
|
const uploadOptions = {
|
|
blockSize: options === null || options === void 0 ? void 0 : options.uploadChunkSize,
|
|
concurrency: options === null || options === void 0 ? void 0 : options.uploadConcurrency, // maximum number of parallel transfer workers
|
|
maxSingleShotSize: 128 * 1024 * 1024, // 128 MiB initial transfer size
|
|
onProgress: uploadProgress.onProgress()
|
|
};
|
|
try {
|
|
uploadProgress.startDisplayTimer();
|
|
lib_core/* debug */.Yz(`BlobClient: ${blobClient.name}:${blobClient.accountName}:${blobClient.containerName}`);
|
|
const response = yield blockBlobClient.uploadFile(archivePath, uploadOptions);
|
|
// TODO: better management of non-retryable errors
|
|
if (response._response.status >= 400) {
|
|
throw new InvalidResponseError(`uploadCacheArchiveSDK: upload failed with status code ${response._response.status}`);
|
|
}
|
|
return response;
|
|
}
|
|
catch (error) {
|
|
lib_core/* warning */.$e(`uploadCacheArchiveSDK: internal error uploading cache archive: ${error.message}`);
|
|
throw error;
|
|
}
|
|
finally {
|
|
uploadProgress.stopDisplayTimer();
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=uploadUtils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/requestUtils.js
|
|
var requestUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
function isSuccessStatusCode(statusCode) {
|
|
if (!statusCode) {
|
|
return false;
|
|
}
|
|
return statusCode >= 200 && statusCode < 300;
|
|
}
|
|
function isServerErrorStatusCode(statusCode) {
|
|
if (!statusCode) {
|
|
return true;
|
|
}
|
|
return statusCode >= 500;
|
|
}
|
|
function isRetryableStatusCode(statusCode) {
|
|
if (!statusCode) {
|
|
return false;
|
|
}
|
|
const retryableStatusCodes = [
|
|
lib/* HttpCodes */.Hv.BadGateway,
|
|
lib/* HttpCodes */.Hv.ServiceUnavailable,
|
|
lib/* HttpCodes */.Hv.GatewayTimeout
|
|
];
|
|
return retryableStatusCodes.includes(statusCode);
|
|
}
|
|
function sleep(milliseconds) {
|
|
return requestUtils_awaiter(this, void 0, void 0, function* () {
|
|
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|
});
|
|
}
|
|
function retry(name_1, method_1, getStatusCode_1) {
|
|
return requestUtils_awaiter(this, arguments, void 0, function* (name, method, getStatusCode, maxAttempts = DefaultRetryAttempts, delay = DefaultRetryDelay, onError = undefined) {
|
|
let errorMessage = '';
|
|
let attempt = 1;
|
|
while (attempt <= maxAttempts) {
|
|
let response = undefined;
|
|
let statusCode = undefined;
|
|
let isRetryable = false;
|
|
try {
|
|
response = yield method();
|
|
}
|
|
catch (error) {
|
|
if (onError) {
|
|
response = onError(error);
|
|
}
|
|
isRetryable = true;
|
|
errorMessage = error.message;
|
|
}
|
|
if (response) {
|
|
statusCode = getStatusCode(response);
|
|
if (!isServerErrorStatusCode(statusCode)) {
|
|
return response;
|
|
}
|
|
}
|
|
if (statusCode) {
|
|
isRetryable = isRetryableStatusCode(statusCode);
|
|
errorMessage = `Cache service responded with ${statusCode}`;
|
|
}
|
|
lib_core/* debug */.Yz(`${name} - Attempt ${attempt} of ${maxAttempts} failed with error: ${errorMessage}`);
|
|
if (!isRetryable) {
|
|
lib_core/* debug */.Yz(`${name} - Error is not retryable`);
|
|
break;
|
|
}
|
|
yield sleep(delay);
|
|
attempt++;
|
|
}
|
|
throw Error(`${name} failed: ${errorMessage}`);
|
|
});
|
|
}
|
|
function retryTypedResponse(name_1, method_1) {
|
|
return requestUtils_awaiter(this, arguments, void 0, function* (name, method, maxAttempts = DefaultRetryAttempts, delay = DefaultRetryDelay) {
|
|
return yield retry(name, method, (response) => response.statusCode, maxAttempts, delay,
|
|
// If the error object contains the statusCode property, extract it and return
|
|
// an TypedResponse<T> so it can be processed by the retry logic.
|
|
(error) => {
|
|
if (error instanceof lib/* HttpClientError */.Kg) {
|
|
return {
|
|
statusCode: error.statusCode,
|
|
result: null,
|
|
headers: {},
|
|
error
|
|
};
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
function retryHttpClientResponse(name_1, method_1) {
|
|
return requestUtils_awaiter(this, arguments, void 0, function* (name, method, maxAttempts = DefaultRetryAttempts, delay = DefaultRetryDelay) {
|
|
return yield retry(name, method, (response) => response.message.statusCode, maxAttempts, delay);
|
|
});
|
|
}
|
|
//# sourceMappingURL=requestUtils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/downloadUtils.js
|
|
var downloadUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Pipes the body of a HTTP response to a stream
|
|
*
|
|
* @param response the HTTP response
|
|
* @param output the writable stream
|
|
*/
|
|
function pipeResponseToStream(response, output) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
const pipeline = external_util_.promisify(external_stream_.pipeline);
|
|
yield pipeline(response.message, output);
|
|
});
|
|
}
|
|
/**
|
|
* Class for tracking the download state and displaying stats.
|
|
*/
|
|
class DownloadProgress {
|
|
constructor(contentLength) {
|
|
this.contentLength = contentLength;
|
|
this.segmentIndex = 0;
|
|
this.segmentSize = 0;
|
|
this.segmentOffset = 0;
|
|
this.receivedBytes = 0;
|
|
this.displayedComplete = false;
|
|
this.startTime = Date.now();
|
|
}
|
|
/**
|
|
* Progress to the next segment. Only call this method when the previous segment
|
|
* is complete.
|
|
*
|
|
* @param segmentSize the length of the next segment
|
|
*/
|
|
nextSegment(segmentSize) {
|
|
this.segmentOffset = this.segmentOffset + this.segmentSize;
|
|
this.segmentIndex = this.segmentIndex + 1;
|
|
this.segmentSize = segmentSize;
|
|
this.receivedBytes = 0;
|
|
lib_core/* debug */.Yz(`Downloading segment at offset ${this.segmentOffset} with length ${this.segmentSize}...`);
|
|
}
|
|
/**
|
|
* Sets the number of bytes received for the current segment.
|
|
*
|
|
* @param receivedBytes the number of bytes received
|
|
*/
|
|
setReceivedBytes(receivedBytes) {
|
|
this.receivedBytes = receivedBytes;
|
|
}
|
|
/**
|
|
* Returns the total number of bytes transferred.
|
|
*/
|
|
getTransferredBytes() {
|
|
return this.segmentOffset + this.receivedBytes;
|
|
}
|
|
/**
|
|
* Returns true if the download is complete.
|
|
*/
|
|
isDone() {
|
|
return this.getTransferredBytes() === this.contentLength;
|
|
}
|
|
/**
|
|
* Prints the current download stats. Once the download completes, this will print one
|
|
* last line and then stop.
|
|
*/
|
|
display() {
|
|
if (this.displayedComplete) {
|
|
return;
|
|
}
|
|
const transferredBytes = this.segmentOffset + this.receivedBytes;
|
|
const percentage = (100 * (transferredBytes / this.contentLength)).toFixed(1);
|
|
const elapsedTime = Date.now() - this.startTime;
|
|
const downloadSpeed = (transferredBytes /
|
|
(1024 * 1024) /
|
|
(elapsedTime / 1000)).toFixed(1);
|
|
lib_core/* info */.pq(`Received ${transferredBytes} of ${this.contentLength} (${percentage}%), ${downloadSpeed} MBs/sec`);
|
|
if (this.isDone()) {
|
|
this.displayedComplete = true;
|
|
}
|
|
}
|
|
/**
|
|
* Returns a function used to handle TransferProgressEvents.
|
|
*/
|
|
onProgress() {
|
|
return (progress) => {
|
|
this.setReceivedBytes(progress.loadedBytes);
|
|
};
|
|
}
|
|
/**
|
|
* Starts the timer that displays the stats.
|
|
*
|
|
* @param delayInMs the delay between each write
|
|
*/
|
|
startDisplayTimer(delayInMs = 1000) {
|
|
const displayCallback = () => {
|
|
this.display();
|
|
if (!this.isDone()) {
|
|
this.timeoutHandle = setTimeout(displayCallback, delayInMs);
|
|
}
|
|
};
|
|
this.timeoutHandle = setTimeout(displayCallback, delayInMs);
|
|
}
|
|
/**
|
|
* Stops the timer that displays the stats. As this typically indicates the download
|
|
* is complete, this will display one last line, unless the last line has already
|
|
* been written.
|
|
*/
|
|
stopDisplayTimer() {
|
|
if (this.timeoutHandle) {
|
|
clearTimeout(this.timeoutHandle);
|
|
this.timeoutHandle = undefined;
|
|
}
|
|
this.display();
|
|
}
|
|
}
|
|
/**
|
|
* Download the cache using the Actions toolkit http-client
|
|
*
|
|
* @param archiveLocation the URL for the cache
|
|
* @param archivePath the local path where the cache is saved
|
|
*/
|
|
function downloadCacheHttpClient(archiveLocation, archivePath) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
const writeStream = external_fs_.createWriteStream(archivePath);
|
|
const httpClient = new lib/* HttpClient */.Qq('actions/cache');
|
|
const downloadResponse = yield retryHttpClientResponse('downloadCache', () => downloadUtils_awaiter(this, void 0, void 0, function* () { return httpClient.get(archiveLocation); }));
|
|
// Abort download if no traffic received over the socket.
|
|
downloadResponse.message.socket.setTimeout(SocketTimeout, () => {
|
|
downloadResponse.message.destroy();
|
|
lib_core/* debug */.Yz(`Aborting download, socket timed out after ${SocketTimeout} ms`);
|
|
});
|
|
yield pipeResponseToStream(downloadResponse, writeStream);
|
|
// Validate download size.
|
|
const contentLengthHeader = downloadResponse.message.headers['content-length'];
|
|
if (contentLengthHeader) {
|
|
const expectedLength = parseInt(contentLengthHeader);
|
|
const actualLength = getArchiveFileSizeInBytes(archivePath);
|
|
if (actualLength !== expectedLength) {
|
|
throw new Error(`Incomplete download. Expected file size: ${expectedLength}, actual file size: ${actualLength}`);
|
|
}
|
|
}
|
|
else {
|
|
lib_core/* debug */.Yz('Unable to validate download, no Content-Length header');
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Download the cache using the Actions toolkit http-client concurrently
|
|
*
|
|
* @param archiveLocation the URL for the cache
|
|
* @param archivePath the local path where the cache is saved
|
|
*/
|
|
function downloadCacheHttpClientConcurrent(archiveLocation, archivePath, options) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
var _a;
|
|
const archiveDescriptor = yield external_fs_.promises.open(archivePath, 'w');
|
|
const httpClient = new lib/* HttpClient */.Qq('actions/cache', undefined, {
|
|
socketTimeout: options.timeoutInMs,
|
|
keepAlive: true
|
|
});
|
|
try {
|
|
const res = yield retryHttpClientResponse('downloadCacheMetadata', () => downloadUtils_awaiter(this, void 0, void 0, function* () { return yield httpClient.request('HEAD', archiveLocation, null, {}); }));
|
|
const lengthHeader = res.message.headers['content-length'];
|
|
if (lengthHeader === undefined || lengthHeader === null) {
|
|
throw new Error('Content-Length not found on blob response');
|
|
}
|
|
const length = parseInt(lengthHeader);
|
|
if (Number.isNaN(length)) {
|
|
throw new Error(`Could not interpret Content-Length: ${length}`);
|
|
}
|
|
const downloads = [];
|
|
const blockSize = 4 * 1024 * 1024;
|
|
for (let offset = 0; offset < length; offset += blockSize) {
|
|
const count = Math.min(blockSize, length - offset);
|
|
downloads.push({
|
|
offset,
|
|
promiseGetter: () => downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
return yield downloadSegmentRetry(httpClient, archiveLocation, offset, count);
|
|
})
|
|
});
|
|
}
|
|
// reverse to use .pop instead of .shift
|
|
downloads.reverse();
|
|
let actives = 0;
|
|
let bytesDownloaded = 0;
|
|
const progress = new DownloadProgress(length);
|
|
progress.startDisplayTimer();
|
|
const progressFn = progress.onProgress();
|
|
const activeDownloads = [];
|
|
let nextDownload;
|
|
const waitAndWrite = () => downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
const segment = yield Promise.race(Object.values(activeDownloads));
|
|
yield archiveDescriptor.write(segment.buffer, 0, segment.count, segment.offset);
|
|
actives--;
|
|
delete activeDownloads[segment.offset];
|
|
bytesDownloaded += segment.count;
|
|
progressFn({ loadedBytes: bytesDownloaded });
|
|
});
|
|
while ((nextDownload = downloads.pop())) {
|
|
activeDownloads[nextDownload.offset] = nextDownload.promiseGetter();
|
|
actives++;
|
|
if (actives >= ((_a = options.downloadConcurrency) !== null && _a !== void 0 ? _a : 10)) {
|
|
yield waitAndWrite();
|
|
}
|
|
}
|
|
while (actives > 0) {
|
|
yield waitAndWrite();
|
|
}
|
|
}
|
|
finally {
|
|
httpClient.dispose();
|
|
yield archiveDescriptor.close();
|
|
}
|
|
});
|
|
}
|
|
function downloadSegmentRetry(httpClient, archiveLocation, offset, count) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
const retries = 5;
|
|
let failures = 0;
|
|
while (true) {
|
|
try {
|
|
const timeout = 30000;
|
|
const result = yield promiseWithTimeout(timeout, downloadSegment(httpClient, archiveLocation, offset, count));
|
|
if (typeof result === 'string') {
|
|
throw new Error('downloadSegmentRetry failed due to timeout');
|
|
}
|
|
return result;
|
|
}
|
|
catch (err) {
|
|
if (failures >= retries) {
|
|
throw err;
|
|
}
|
|
failures++;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function downloadSegment(httpClient, archiveLocation, offset, count) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
const partRes = yield retryHttpClientResponse('downloadCachePart', () => downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
return yield httpClient.get(archiveLocation, {
|
|
Range: `bytes=${offset}-${offset + count - 1}`
|
|
});
|
|
}));
|
|
if (!partRes.readBodyBuffer) {
|
|
throw new Error('Expected HttpClientResponse to implement readBodyBuffer');
|
|
}
|
|
return {
|
|
offset,
|
|
count,
|
|
buffer: yield partRes.readBodyBuffer()
|
|
};
|
|
});
|
|
}
|
|
/**
|
|
* Download the cache using the Azure Storage SDK. Only call this method if the
|
|
* URL points to an Azure Storage endpoint.
|
|
*
|
|
* @param archiveLocation the URL for the cache
|
|
* @param archivePath the local path where the cache is saved
|
|
* @param options the download options with the defaults set
|
|
*/
|
|
function downloadCacheStorageSDK(archiveLocation, archivePath, options) {
|
|
return downloadUtils_awaiter(this, void 0, void 0, function* () {
|
|
var _a;
|
|
const client = new BlockBlobClient(archiveLocation, undefined, {
|
|
retryOptions: {
|
|
// Override the timeout used when downloading each 4 MB chunk
|
|
// The default is 2 min / MB, which is way too slow
|
|
tryTimeoutInMs: options.timeoutInMs
|
|
}
|
|
});
|
|
const properties = yield client.getProperties();
|
|
const contentLength = (_a = properties.contentLength) !== null && _a !== void 0 ? _a : -1;
|
|
if (contentLength < 0) {
|
|
// We should never hit this condition, but just in case fall back to downloading the
|
|
// file as one large stream
|
|
lib_core/* debug */.Yz('Unable to determine content length, downloading file with http-client...');
|
|
yield downloadCacheHttpClient(archiveLocation, archivePath);
|
|
}
|
|
else {
|
|
// Use downloadToBuffer for faster downloads, since internally it splits the
|
|
// file into 4 MB chunks which can then be parallelized and retried independently
|
|
//
|
|
// If the file exceeds the buffer maximum length (~1 GB on 32-bit systems and ~2 GB
|
|
// on 64-bit systems), split the download into multiple segments
|
|
// ~2 GB = 2147483647, beyond this, we start getting out of range error. So, capping it accordingly.
|
|
// Updated segment size to 128MB = 134217728 bytes, to complete a segment faster and fail fast
|
|
const maxSegmentSize = Math.min(134217728, external_buffer_.constants.MAX_LENGTH);
|
|
const downloadProgress = new DownloadProgress(contentLength);
|
|
const fd = external_fs_.openSync(archivePath, 'w');
|
|
try {
|
|
downloadProgress.startDisplayTimer();
|
|
const controller = new AbortController();
|
|
const abortSignal = controller.signal;
|
|
while (!downloadProgress.isDone()) {
|
|
const segmentStart = downloadProgress.segmentOffset + downloadProgress.segmentSize;
|
|
const segmentSize = Math.min(maxSegmentSize, contentLength - segmentStart);
|
|
downloadProgress.nextSegment(segmentSize);
|
|
const result = yield promiseWithTimeout(options.segmentTimeoutInMs || 3600000, client.downloadToBuffer(segmentStart, segmentSize, {
|
|
abortSignal,
|
|
concurrency: options.downloadConcurrency,
|
|
onProgress: downloadProgress.onProgress()
|
|
}));
|
|
if (result === 'timeout') {
|
|
controller.abort();
|
|
throw new Error('Aborting cache download as the download time exceeded the timeout.');
|
|
}
|
|
else if (Buffer.isBuffer(result)) {
|
|
external_fs_.writeFileSync(fd, result);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
downloadProgress.stopDisplayTimer();
|
|
external_fs_.closeSync(fd);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
const promiseWithTimeout = (timeoutMs, promise) => downloadUtils_awaiter(void 0, void 0, void 0, function* () {
|
|
let timeoutHandle;
|
|
const timeoutPromise = new Promise(resolve => {
|
|
timeoutHandle = setTimeout(() => resolve('timeout'), timeoutMs);
|
|
});
|
|
return Promise.race([promise, timeoutPromise]).then(result => {
|
|
clearTimeout(timeoutHandle);
|
|
return result;
|
|
});
|
|
});
|
|
//# sourceMappingURL=downloadUtils.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/options.js
|
|
|
|
/**
|
|
* Returns a copy of the upload options with defaults filled in.
|
|
*
|
|
* @param copy the original upload options
|
|
*/
|
|
function getUploadOptions(copy) {
|
|
// Defaults if not overriden
|
|
const result = {
|
|
useAzureSdk: false,
|
|
uploadConcurrency: 4,
|
|
uploadChunkSize: 32 * 1024 * 1024
|
|
};
|
|
if (copy) {
|
|
if (typeof copy.useAzureSdk === 'boolean') {
|
|
result.useAzureSdk = copy.useAzureSdk;
|
|
}
|
|
if (typeof copy.uploadConcurrency === 'number') {
|
|
result.uploadConcurrency = copy.uploadConcurrency;
|
|
}
|
|
if (typeof copy.uploadChunkSize === 'number') {
|
|
result.uploadChunkSize = copy.uploadChunkSize;
|
|
}
|
|
}
|
|
/**
|
|
* Add env var overrides
|
|
*/
|
|
// Cap the uploadConcurrency at 32
|
|
result.uploadConcurrency = !isNaN(Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
|
|
? Math.min(32, Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
|
|
: result.uploadConcurrency;
|
|
// Cap the uploadChunkSize at 128MiB
|
|
result.uploadChunkSize = !isNaN(Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']))
|
|
? Math.min(128 * 1024 * 1024, Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']) * 1024 * 1024)
|
|
: result.uploadChunkSize;
|
|
lib_core/* debug */.Yz(`Use Azure SDK: ${result.useAzureSdk}`);
|
|
lib_core/* debug */.Yz(`Upload concurrency: ${result.uploadConcurrency}`);
|
|
lib_core/* debug */.Yz(`Upload chunk size: ${result.uploadChunkSize}`);
|
|
return result;
|
|
}
|
|
/**
|
|
* Returns a copy of the download options with defaults filled in.
|
|
*
|
|
* @param copy the original download options
|
|
*/
|
|
function getDownloadOptions(copy) {
|
|
const result = {
|
|
useAzureSdk: false,
|
|
concurrentBlobDownloads: true,
|
|
downloadConcurrency: 8,
|
|
timeoutInMs: 30000,
|
|
segmentTimeoutInMs: 600000,
|
|
lookupOnly: false
|
|
};
|
|
if (copy) {
|
|
if (typeof copy.useAzureSdk === 'boolean') {
|
|
result.useAzureSdk = copy.useAzureSdk;
|
|
}
|
|
if (typeof copy.concurrentBlobDownloads === 'boolean') {
|
|
result.concurrentBlobDownloads = copy.concurrentBlobDownloads;
|
|
}
|
|
if (typeof copy.downloadConcurrency === 'number') {
|
|
result.downloadConcurrency = copy.downloadConcurrency;
|
|
}
|
|
if (typeof copy.timeoutInMs === 'number') {
|
|
result.timeoutInMs = copy.timeoutInMs;
|
|
}
|
|
if (typeof copy.segmentTimeoutInMs === 'number') {
|
|
result.segmentTimeoutInMs = copy.segmentTimeoutInMs;
|
|
}
|
|
if (typeof copy.lookupOnly === 'boolean') {
|
|
result.lookupOnly = copy.lookupOnly;
|
|
}
|
|
}
|
|
const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS'];
|
|
if (segmentDownloadTimeoutMins &&
|
|
!isNaN(Number(segmentDownloadTimeoutMins)) &&
|
|
isFinite(Number(segmentDownloadTimeoutMins))) {
|
|
result.segmentTimeoutInMs = Number(segmentDownloadTimeoutMins) * 60 * 1000;
|
|
}
|
|
lib_core/* debug */.Yz(`Use Azure SDK: ${result.useAzureSdk}`);
|
|
lib_core/* debug */.Yz(`Download concurrency: ${result.downloadConcurrency}`);
|
|
lib_core/* debug */.Yz(`Request timeout (ms): ${result.timeoutInMs}`);
|
|
lib_core/* debug */.Yz(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`);
|
|
lib_core/* debug */.Yz(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`);
|
|
lib_core/* debug */.Yz(`Lookup only: ${result.lookupOnly}`);
|
|
return result;
|
|
}
|
|
//# sourceMappingURL=options.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/config.js
|
|
function isGhes() {
|
|
const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
|
|
const hostname = ghUrl.hostname.trimEnd().toUpperCase();
|
|
const isGitHubHost = hostname === 'GITHUB.COM';
|
|
const isGheHost = hostname.endsWith('.GHE.COM');
|
|
const isLocalHost = hostname.endsWith('.LOCALHOST');
|
|
return !isGitHubHost && !isGheHost && !isLocalHost;
|
|
}
|
|
function getCacheServiceVersion() {
|
|
// Cache service v2 is not supported on GHES. We will default to
|
|
// cache service v1 even if the feature flag was enabled by user.
|
|
if (isGhes())
|
|
return 'v1';
|
|
return process.env['ACTIONS_CACHE_SERVICE_V2'] ? 'v2' : 'v1';
|
|
}
|
|
// The cache-mode lattice: readable = {read, write}, writable = {write,
|
|
// write-only}, none = neither.
|
|
const KNOWN_CACHE_MODES = ['none', 'read', 'write', 'write-only'];
|
|
// The effective cache-mode exported by the runner, or '' when not set.
|
|
function getCacheMode() {
|
|
return (process.env['ACTIONS_CACHE_MODE'] || '').trim().toLowerCase();
|
|
}
|
|
// Unset or unrecognized modes are permissive so behavior matches today.
|
|
function isCacheReadable(mode) {
|
|
if (!KNOWN_CACHE_MODES.includes(mode))
|
|
return true;
|
|
return mode === 'read' || mode === 'write';
|
|
}
|
|
function isCacheWritable(mode) {
|
|
if (!KNOWN_CACHE_MODES.includes(mode))
|
|
return true;
|
|
return mode === 'write' || mode === 'write-only';
|
|
}
|
|
function getCacheServiceURL() {
|
|
const version = getCacheServiceVersion();
|
|
// Based on the version of the cache service, we will determine which
|
|
// URL to use.
|
|
switch (version) {
|
|
case 'v1':
|
|
return (process.env['ACTIONS_CACHE_URL'] ||
|
|
process.env['ACTIONS_RESULTS_URL'] ||
|
|
'');
|
|
case 'v2':
|
|
return process.env['ACTIONS_RESULTS_URL'] || '';
|
|
default:
|
|
throw new Error(`Unsupported cache service version: ${version}`);
|
|
}
|
|
}
|
|
//# sourceMappingURL=config.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@actions/cache/lib/internal/shared/package-version.cjs
|
|
var package_version = __webpack_require__(8658);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/shared/user-agent.js
|
|
|
|
/**
|
|
* Ensure that this User Agent String is used in all HTTP calls so that we can monitor telemetry between different versions of this package
|
|
*/
|
|
function user_agent_getUserAgentString() {
|
|
return `@actions/cache-${package_version.version}`;
|
|
}
|
|
//# sourceMappingURL=user-agent.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/cacheHttpClient.js
|
|
var cacheHttpClient_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getCacheApiUrl(resource) {
|
|
const baseUrl = getCacheServiceURL();
|
|
if (!baseUrl) {
|
|
throw new Error('Cache Service Url not found, unable to restore cache.');
|
|
}
|
|
const url = `${baseUrl}_apis/artifactcache/${resource}`;
|
|
lib_core/* debug */.Yz(`Resource Url: ${url}`);
|
|
return url;
|
|
}
|
|
function createAcceptHeader(type, apiVersion) {
|
|
return `${type};api-version=${apiVersion}`;
|
|
}
|
|
function getRequestOptions() {
|
|
const requestOptions = {
|
|
headers: {
|
|
Accept: createAcceptHeader('application/json', '6.0-preview.1')
|
|
}
|
|
};
|
|
return requestOptions;
|
|
}
|
|
function createHttpClient() {
|
|
const token = process.env['ACTIONS_RUNTIME_TOKEN'] || '';
|
|
const bearerCredentialHandler = new auth/* BearerCredentialHandler */.tZ(token);
|
|
return new lib/* HttpClient */.Qq(user_agent_getUserAgentString(), [bearerCredentialHandler], getRequestOptions());
|
|
}
|
|
function getCacheEntry(keys, paths, options) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
var _a;
|
|
const httpClient = createHttpClient();
|
|
const version = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
|
|
const resource = `cache?keys=${encodeURIComponent(keys.join(','))}&version=${version}`;
|
|
const response = yield retryTypedResponse('getCacheEntry', () => cacheHttpClient_awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
|
|
// Cache not found
|
|
if (response.statusCode === 204) {
|
|
// List cache for primary key only if cache miss occurs
|
|
if (lib_core/* isDebug */._o()) {
|
|
yield printCachesListForDiagnostics(keys[0], httpClient, version);
|
|
}
|
|
return null;
|
|
}
|
|
if (!isSuccessStatusCode(response.statusCode)) {
|
|
// Only surface the receiver's body for a `cache read denied:` policy denial
|
|
// so callers can dispatch on it; keep the generic message otherwise.
|
|
const errorMessage = (_a = response.error) === null || _a === void 0 ? void 0 : _a.message;
|
|
if (errorMessage === null || errorMessage === void 0 ? void 0 : errorMessage.includes(CacheReadDeniedMessagePrefix)) {
|
|
throw new Error(errorMessage);
|
|
}
|
|
throw new Error(`Cache service responded with ${response.statusCode}`);
|
|
}
|
|
const cacheResult = response.result;
|
|
const cacheDownloadUrl = cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.archiveLocation;
|
|
if (!cacheDownloadUrl) {
|
|
// Cache achiveLocation not found. This should never happen, and hence bail out.
|
|
throw new Error('Cache not found.');
|
|
}
|
|
lib_core/* setSecret */.Pq(cacheDownloadUrl);
|
|
lib_core/* debug */.Yz(`Cache Result:`);
|
|
lib_core/* debug */.Yz(JSON.stringify(cacheResult));
|
|
return cacheResult;
|
|
});
|
|
}
|
|
function printCachesListForDiagnostics(key, httpClient, version) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
const resource = `caches?key=${encodeURIComponent(key)}`;
|
|
const response = yield retryTypedResponse('listCache', () => cacheHttpClient_awaiter(this, void 0, void 0, function* () { return httpClient.getJson(getCacheApiUrl(resource)); }));
|
|
if (response.statusCode === 200) {
|
|
const cacheListResult = response.result;
|
|
const totalCount = cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.totalCount;
|
|
if (totalCount && totalCount > 0) {
|
|
lib_core/* debug */.Yz(`No matching cache found for cache key '${key}', version '${version} and scope ${process.env['GITHUB_REF']}. There exist one or more cache(s) with similar key but they have different version or scope. See more info on cache matching here: https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key \nOther caches with similar key:`);
|
|
for (const cacheEntry of (cacheListResult === null || cacheListResult === void 0 ? void 0 : cacheListResult.artifactCaches) || []) {
|
|
lib_core/* debug */.Yz(`Cache Key: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheKey}, Cache Version: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.cacheVersion}, Cache Scope: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.scope}, Cache Created: ${cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.creationTime}`);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function downloadCache(archiveLocation, archivePath, options) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
const archiveUrl = new external_url_.URL(archiveLocation);
|
|
const downloadOptions = getDownloadOptions(options);
|
|
if (archiveUrl.hostname.endsWith('.blob.core.windows.net')) {
|
|
if (downloadOptions.useAzureSdk) {
|
|
// Use Azure storage SDK to download caches hosted on Azure to improve speed and reliability.
|
|
yield downloadCacheStorageSDK(archiveLocation, archivePath, downloadOptions);
|
|
}
|
|
else if (downloadOptions.concurrentBlobDownloads) {
|
|
// Use concurrent implementation with HttpClient to work around blob SDK issue
|
|
yield downloadCacheHttpClientConcurrent(archiveLocation, archivePath, downloadOptions);
|
|
}
|
|
else {
|
|
// Otherwise, download using the Actions http-client.
|
|
yield downloadCacheHttpClient(archiveLocation, archivePath);
|
|
}
|
|
}
|
|
else {
|
|
yield downloadCacheHttpClient(archiveLocation, archivePath);
|
|
}
|
|
});
|
|
}
|
|
// Reserve Cache
|
|
function reserveCache(key, paths, options) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
const httpClient = createHttpClient();
|
|
const version = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive);
|
|
const reserveCacheRequest = {
|
|
key,
|
|
version,
|
|
cacheSize: options === null || options === void 0 ? void 0 : options.cacheSize
|
|
};
|
|
const response = yield retryTypedResponse('reserveCache', () => cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
return httpClient.postJson(getCacheApiUrl('caches'), reserveCacheRequest);
|
|
}));
|
|
return response;
|
|
});
|
|
}
|
|
function getContentRange(start, end) {
|
|
// Format: `bytes start-end/filesize
|
|
// start and end are inclusive
|
|
// filesize can be *
|
|
// For a 200 byte chunk starting at byte 0:
|
|
// Content-Range: bytes 0-199/*
|
|
return `bytes ${start}-${end}/*`;
|
|
}
|
|
function uploadChunk(httpClient, resourceUrl, openStream, start, end) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
lib_core/* debug */.Yz(`Uploading chunk of size ${end - start + 1} bytes at offset ${start} with content range: ${getContentRange(start, end)}`);
|
|
const additionalHeaders = {
|
|
'Content-Type': 'application/octet-stream',
|
|
'Content-Range': getContentRange(start, end)
|
|
};
|
|
const uploadChunkResponse = yield retryHttpClientResponse(`uploadChunk (start: ${start}, end: ${end})`, () => cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
return httpClient.sendStream('PATCH', resourceUrl, openStream(), additionalHeaders);
|
|
}));
|
|
if (!isSuccessStatusCode(uploadChunkResponse.message.statusCode)) {
|
|
throw new Error(`Cache service responded with ${uploadChunkResponse.message.statusCode} during upload chunk.`);
|
|
}
|
|
});
|
|
}
|
|
function uploadFile(httpClient, cacheId, archivePath, options) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
// Upload Chunks
|
|
const fileSize = getArchiveFileSizeInBytes(archivePath);
|
|
const resourceUrl = getCacheApiUrl(`caches/${cacheId.toString()}`);
|
|
const fd = external_fs_.openSync(archivePath, 'r');
|
|
const uploadOptions = getUploadOptions(options);
|
|
const concurrency = assertDefined('uploadConcurrency', uploadOptions.uploadConcurrency);
|
|
const maxChunkSize = assertDefined('uploadChunkSize', uploadOptions.uploadChunkSize);
|
|
const parallelUploads = [...new Array(concurrency).keys()];
|
|
lib_core/* debug */.Yz('Awaiting all uploads');
|
|
let offset = 0;
|
|
try {
|
|
yield Promise.all(parallelUploads.map(() => cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
while (offset < fileSize) {
|
|
const chunkSize = Math.min(fileSize - offset, maxChunkSize);
|
|
const start = offset;
|
|
const end = offset + chunkSize - 1;
|
|
offset += maxChunkSize;
|
|
yield uploadChunk(httpClient, resourceUrl, () => external_fs_.createReadStream(archivePath, {
|
|
fd,
|
|
start,
|
|
end,
|
|
autoClose: false
|
|
})
|
|
.on('error', error => {
|
|
throw new Error(`Cache upload failed because file read failed with ${error.message}`);
|
|
}), start, end);
|
|
}
|
|
})));
|
|
}
|
|
finally {
|
|
external_fs_.closeSync(fd);
|
|
}
|
|
return;
|
|
});
|
|
}
|
|
function commitCache(httpClient, cacheId, filesize) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
const commitCacheRequest = { size: filesize };
|
|
return yield retryTypedResponse('commitCache', () => cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
return httpClient.postJson(getCacheApiUrl(`caches/${cacheId.toString()}`), commitCacheRequest);
|
|
}));
|
|
});
|
|
}
|
|
function saveCache(cacheId, archivePath, signedUploadURL, options) {
|
|
return cacheHttpClient_awaiter(this, void 0, void 0, function* () {
|
|
const uploadOptions = getUploadOptions(options);
|
|
if (uploadOptions.useAzureSdk) {
|
|
// Use Azure storage SDK to upload caches directly to Azure
|
|
if (!signedUploadURL) {
|
|
throw new Error('Azure Storage SDK can only be used when a signed URL is provided.');
|
|
}
|
|
yield uploadCacheArchiveSDK(signedUploadURL, archivePath, options);
|
|
}
|
|
else {
|
|
const httpClient = createHttpClient();
|
|
lib_core/* debug */.Yz('Upload cache');
|
|
yield uploadFile(httpClient, cacheId, archivePath, options);
|
|
// Commit Cache
|
|
lib_core/* debug */.Yz('Commiting cache');
|
|
const cacheSize = getArchiveFileSizeInBytes(archivePath);
|
|
lib_core/* info */.pq(`Cache Size: ~${Math.round(cacheSize / (1024 * 1024))} MB (${cacheSize} B)`);
|
|
const commitCacheResponse = yield commitCache(httpClient, cacheId, cacheSize);
|
|
if (!isSuccessStatusCode(commitCacheResponse.statusCode)) {
|
|
throw new Error(`Cache service responded with ${commitCacheResponse.statusCode} during commit cache.`);
|
|
}
|
|
lib_core/* info */.pq('Cache saved successfully');
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=cacheHttpClient.js.map
|
|
// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime-rpc/build/commonjs/index.js
|
|
var commonjs = __webpack_require__(4420);
|
|
// EXTERNAL MODULE: ./node_modules/@protobuf-ts/runtime/build/commonjs/index.js
|
|
var build_commonjs = __webpack_require__(8886);
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/generated/results/entities/v1/cachescope.js
|
|
|
|
|
|
|
|
|
|
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class CacheScope$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.entities.v1.CacheScope", [
|
|
{ no: 1, name: "scope", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 2, name: "permission", kind: "scalar", T: 3 /*ScalarType.INT64*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { scope: "", permission: "0" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* string scope */ 1:
|
|
message.scope = reader.string();
|
|
break;
|
|
case /* int64 permission */ 2:
|
|
message.permission = reader.int64().toString();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* string scope = 1; */
|
|
if (message.scope !== "")
|
|
writer.tag(1, build_commonjs.WireType.LengthDelimited).string(message.scope);
|
|
/* int64 permission = 2; */
|
|
if (message.permission !== "0")
|
|
writer.tag(2, build_commonjs.WireType.Varint).int64(message.permission);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.entities.v1.CacheScope
|
|
*/
|
|
const CacheScope = new CacheScope$Type();
|
|
//# sourceMappingURL=cachescope.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/generated/results/entities/v1/cachemetadata.js
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class CacheMetadata$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.entities.v1.CacheMetadata", [
|
|
{ no: 1, name: "repository_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
|
|
{ no: 2, name: "scope", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => CacheScope }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { repositoryId: "0", scope: [] };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* int64 repository_id */ 1:
|
|
message.repositoryId = reader.int64().toString();
|
|
break;
|
|
case /* repeated github.actions.results.entities.v1.CacheScope scope */ 2:
|
|
message.scope.push(CacheScope.internalBinaryRead(reader, reader.uint32(), options));
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* int64 repository_id = 1; */
|
|
if (message.repositoryId !== "0")
|
|
writer.tag(1, build_commonjs.WireType.Varint).int64(message.repositoryId);
|
|
/* repeated github.actions.results.entities.v1.CacheScope scope = 2; */
|
|
for (let i = 0; i < message.scope.length; i++)
|
|
CacheScope.internalBinaryWrite(message.scope[i], writer.tag(2, build_commonjs.WireType.LengthDelimited).fork(), options).join();
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.entities.v1.CacheMetadata
|
|
*/
|
|
const CacheMetadata = new CacheMetadata$Type();
|
|
//# sourceMappingURL=cachemetadata.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/generated/results/api/v1/cache.js
|
|
// @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies
|
|
// @generated from protobuf file "results/api/v1/cache.proto" (package "github.actions.results.api.v1", syntax proto3)
|
|
// tslint:disable
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class CreateCacheEntryRequest$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.CreateCacheEntryRequest", [
|
|
{ no: 1, name: "metadata", kind: "message", T: () => CacheMetadata },
|
|
{ no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 3, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { key: "", version: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
|
|
message.metadata = CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
|
|
break;
|
|
case /* string key */ 2:
|
|
message.key = reader.string();
|
|
break;
|
|
case /* string version */ 3:
|
|
message.version = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
|
|
if (message.metadata)
|
|
CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, build_commonjs.WireType.LengthDelimited).fork(), options).join();
|
|
/* string key = 2; */
|
|
if (message.key !== "")
|
|
writer.tag(2, build_commonjs.WireType.LengthDelimited).string(message.key);
|
|
/* string version = 3; */
|
|
if (message.version !== "")
|
|
writer.tag(3, build_commonjs.WireType.LengthDelimited).string(message.version);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryRequest
|
|
*/
|
|
const cache_CreateCacheEntryRequest = new CreateCacheEntryRequest$Type();
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class CreateCacheEntryResponse$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.CreateCacheEntryResponse", [
|
|
{ no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
|
|
{ no: 2, name: "signed_upload_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { ok: false, signedUploadUrl: "", message: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* bool ok */ 1:
|
|
message.ok = reader.bool();
|
|
break;
|
|
case /* string signed_upload_url */ 2:
|
|
message.signedUploadUrl = reader.string();
|
|
break;
|
|
case /* string message */ 3:
|
|
message.message = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* bool ok = 1; */
|
|
if (message.ok !== false)
|
|
writer.tag(1, build_commonjs.WireType.Varint).bool(message.ok);
|
|
/* string signed_upload_url = 2; */
|
|
if (message.signedUploadUrl !== "")
|
|
writer.tag(2, build_commonjs.WireType.LengthDelimited).string(message.signedUploadUrl);
|
|
/* string message = 3; */
|
|
if (message.message !== "")
|
|
writer.tag(3, build_commonjs.WireType.LengthDelimited).string(message.message);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.CreateCacheEntryResponse
|
|
*/
|
|
const cache_CreateCacheEntryResponse = new CreateCacheEntryResponse$Type();
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class FinalizeCacheEntryUploadRequest$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.FinalizeCacheEntryUploadRequest", [
|
|
{ no: 1, name: "metadata", kind: "message", T: () => CacheMetadata },
|
|
{ no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 3, name: "size_bytes", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
|
|
{ no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { key: "", sizeBytes: "0", version: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
|
|
message.metadata = CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
|
|
break;
|
|
case /* string key */ 2:
|
|
message.key = reader.string();
|
|
break;
|
|
case /* int64 size_bytes */ 3:
|
|
message.sizeBytes = reader.int64().toString();
|
|
break;
|
|
case /* string version */ 4:
|
|
message.version = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
|
|
if (message.metadata)
|
|
CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, build_commonjs.WireType.LengthDelimited).fork(), options).join();
|
|
/* string key = 2; */
|
|
if (message.key !== "")
|
|
writer.tag(2, build_commonjs.WireType.LengthDelimited).string(message.key);
|
|
/* int64 size_bytes = 3; */
|
|
if (message.sizeBytes !== "0")
|
|
writer.tag(3, build_commonjs.WireType.Varint).int64(message.sizeBytes);
|
|
/* string version = 4; */
|
|
if (message.version !== "")
|
|
writer.tag(4, build_commonjs.WireType.LengthDelimited).string(message.version);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadRequest
|
|
*/
|
|
const cache_FinalizeCacheEntryUploadRequest = new FinalizeCacheEntryUploadRequest$Type();
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class FinalizeCacheEntryUploadResponse$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.FinalizeCacheEntryUploadResponse", [
|
|
{ no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
|
|
{ no: 2, name: "entry_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
|
|
{ no: 3, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { ok: false, entryId: "0", message: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* bool ok */ 1:
|
|
message.ok = reader.bool();
|
|
break;
|
|
case /* int64 entry_id */ 2:
|
|
message.entryId = reader.int64().toString();
|
|
break;
|
|
case /* string message */ 3:
|
|
message.message = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* bool ok = 1; */
|
|
if (message.ok !== false)
|
|
writer.tag(1, build_commonjs.WireType.Varint).bool(message.ok);
|
|
/* int64 entry_id = 2; */
|
|
if (message.entryId !== "0")
|
|
writer.tag(2, build_commonjs.WireType.Varint).int64(message.entryId);
|
|
/* string message = 3; */
|
|
if (message.message !== "")
|
|
writer.tag(3, build_commonjs.WireType.LengthDelimited).string(message.message);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.FinalizeCacheEntryUploadResponse
|
|
*/
|
|
const cache_FinalizeCacheEntryUploadResponse = new FinalizeCacheEntryUploadResponse$Type();
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class GetCacheEntryDownloadURLRequest$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.GetCacheEntryDownloadURLRequest", [
|
|
{ no: 1, name: "metadata", kind: "message", T: () => CacheMetadata },
|
|
{ no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { key: "", restoreKeys: [], version: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
|
|
message.metadata = CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
|
|
break;
|
|
case /* string key */ 2:
|
|
message.key = reader.string();
|
|
break;
|
|
case /* repeated string restore_keys */ 3:
|
|
message.restoreKeys.push(reader.string());
|
|
break;
|
|
case /* string version */ 4:
|
|
message.version = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
|
|
if (message.metadata)
|
|
CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, build_commonjs.WireType.LengthDelimited).fork(), options).join();
|
|
/* string key = 2; */
|
|
if (message.key !== "")
|
|
writer.tag(2, build_commonjs.WireType.LengthDelimited).string(message.key);
|
|
/* repeated string restore_keys = 3; */
|
|
for (let i = 0; i < message.restoreKeys.length; i++)
|
|
writer.tag(3, build_commonjs.WireType.LengthDelimited).string(message.restoreKeys[i]);
|
|
/* string version = 4; */
|
|
if (message.version !== "")
|
|
writer.tag(4, build_commonjs.WireType.LengthDelimited).string(message.version);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLRequest
|
|
*/
|
|
const cache_GetCacheEntryDownloadURLRequest = new GetCacheEntryDownloadURLRequest$Type();
|
|
// @generated message type with reflection information, may provide speed optimized methods
|
|
class GetCacheEntryDownloadURLResponse$Type extends build_commonjs.MessageType {
|
|
constructor() {
|
|
super("github.actions.results.api.v1.GetCacheEntryDownloadURLResponse", [
|
|
{ no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
|
|
{ no: 2, name: "signed_download_url", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
|
|
{ no: 3, name: "matched_key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
|
|
]);
|
|
}
|
|
create(value) {
|
|
const message = { ok: false, signedDownloadUrl: "", matchedKey: "" };
|
|
globalThis.Object.defineProperty(message, build_commonjs.MESSAGE_TYPE, { enumerable: false, value: this });
|
|
if (value !== undefined)
|
|
(0,build_commonjs.reflectionMergePartial)(this, message, value);
|
|
return message;
|
|
}
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
|
|
while (reader.pos < end) {
|
|
let [fieldNo, wireType] = reader.tag();
|
|
switch (fieldNo) {
|
|
case /* bool ok */ 1:
|
|
message.ok = reader.bool();
|
|
break;
|
|
case /* string signed_download_url */ 2:
|
|
message.signedDownloadUrl = reader.string();
|
|
break;
|
|
case /* string matched_key */ 3:
|
|
message.matchedKey = reader.string();
|
|
break;
|
|
default:
|
|
let u = options.readUnknownField;
|
|
if (u === "throw")
|
|
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
|
|
let d = reader.skip(wireType);
|
|
if (u !== false)
|
|
(u === true ? build_commonjs.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
|
|
}
|
|
}
|
|
return message;
|
|
}
|
|
internalBinaryWrite(message, writer, options) {
|
|
/* bool ok = 1; */
|
|
if (message.ok !== false)
|
|
writer.tag(1, build_commonjs.WireType.Varint).bool(message.ok);
|
|
/* string signed_download_url = 2; */
|
|
if (message.signedDownloadUrl !== "")
|
|
writer.tag(2, build_commonjs.WireType.LengthDelimited).string(message.signedDownloadUrl);
|
|
/* string matched_key = 3; */
|
|
if (message.matchedKey !== "")
|
|
writer.tag(3, build_commonjs.WireType.LengthDelimited).string(message.matchedKey);
|
|
let u = options.writeUnknownFields;
|
|
if (u !== false)
|
|
(u == true ? build_commonjs.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
|
|
return writer;
|
|
}
|
|
}
|
|
/**
|
|
* @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLResponse
|
|
*/
|
|
const cache_GetCacheEntryDownloadURLResponse = new GetCacheEntryDownloadURLResponse$Type();
|
|
/**
|
|
* @generated ServiceType for protobuf service github.actions.results.api.v1.CacheService
|
|
*/
|
|
const CacheService = new commonjs/* ServiceType */.C0("github.actions.results.api.v1.CacheService", [
|
|
{ name: "CreateCacheEntry", options: {}, I: cache_CreateCacheEntryRequest, O: cache_CreateCacheEntryResponse },
|
|
{ name: "FinalizeCacheEntryUpload", options: {}, I: cache_FinalizeCacheEntryUploadRequest, O: cache_FinalizeCacheEntryUploadResponse },
|
|
{ name: "GetCacheEntryDownloadURL", options: {}, I: cache_GetCacheEntryDownloadURLRequest, O: cache_GetCacheEntryDownloadURLResponse }
|
|
]);
|
|
//# sourceMappingURL=cache.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/generated/results/api/v1/cache.twirp-client.js
|
|
|
|
class CacheServiceClientJSON {
|
|
constructor(rpc) {
|
|
this.rpc = rpc;
|
|
this.CreateCacheEntry.bind(this);
|
|
this.FinalizeCacheEntryUpload.bind(this);
|
|
this.GetCacheEntryDownloadURL.bind(this);
|
|
}
|
|
CreateCacheEntry(request) {
|
|
const data = cache_CreateCacheEntryRequest.toJson(request, {
|
|
useProtoFieldName: true,
|
|
emitDefaultValues: false,
|
|
});
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/json", data);
|
|
return promise.then((data) => cache_CreateCacheEntryResponse.fromJson(data, {
|
|
ignoreUnknownFields: true,
|
|
}));
|
|
}
|
|
FinalizeCacheEntryUpload(request) {
|
|
const data = cache_FinalizeCacheEntryUploadRequest.toJson(request, {
|
|
useProtoFieldName: true,
|
|
emitDefaultValues: false,
|
|
});
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/json", data);
|
|
return promise.then((data) => cache_FinalizeCacheEntryUploadResponse.fromJson(data, {
|
|
ignoreUnknownFields: true,
|
|
}));
|
|
}
|
|
GetCacheEntryDownloadURL(request) {
|
|
const data = cache_GetCacheEntryDownloadURLRequest.toJson(request, {
|
|
useProtoFieldName: true,
|
|
emitDefaultValues: false,
|
|
});
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/json", data);
|
|
return promise.then((data) => cache_GetCacheEntryDownloadURLResponse.fromJson(data, {
|
|
ignoreUnknownFields: true,
|
|
}));
|
|
}
|
|
}
|
|
class CacheServiceClientProtobuf {
|
|
constructor(rpc) {
|
|
this.rpc = rpc;
|
|
this.CreateCacheEntry.bind(this);
|
|
this.FinalizeCacheEntryUpload.bind(this);
|
|
this.GetCacheEntryDownloadURL.bind(this);
|
|
}
|
|
CreateCacheEntry(request) {
|
|
const data = CreateCacheEntryRequest.toBinary(request);
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "CreateCacheEntry", "application/protobuf", data);
|
|
return promise.then((data) => CreateCacheEntryResponse.fromBinary(data));
|
|
}
|
|
FinalizeCacheEntryUpload(request) {
|
|
const data = FinalizeCacheEntryUploadRequest.toBinary(request);
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "FinalizeCacheEntryUpload", "application/protobuf", data);
|
|
return promise.then((data) => FinalizeCacheEntryUploadResponse.fromBinary(data));
|
|
}
|
|
GetCacheEntryDownloadURL(request) {
|
|
const data = GetCacheEntryDownloadURLRequest.toBinary(request);
|
|
const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/protobuf", data);
|
|
return promise.then((data) => GetCacheEntryDownloadURLResponse.fromBinary(data));
|
|
}
|
|
}
|
|
//# sourceMappingURL=cache.twirp-client.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/shared/util.js
|
|
|
|
/**
|
|
* Masks the `sig` parameter in a URL and sets it as a secret.
|
|
*
|
|
* @param url - The URL containing the signature parameter to mask
|
|
* @remarks
|
|
* This function attempts to parse the provided URL and identify the 'sig' query parameter.
|
|
* If found, it registers both the raw and URL-encoded signature values as secrets using
|
|
* the Actions `setSecret` API, which prevents them from being displayed in logs.
|
|
*
|
|
* The function handles errors gracefully if URL parsing fails, logging them as debug messages.
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* // Mask a signature in an Azure SAS token URL
|
|
* maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01');
|
|
* ```
|
|
*/
|
|
function maskSigUrl(url) {
|
|
if (!url)
|
|
return;
|
|
try {
|
|
const parsedUrl = new URL(url);
|
|
const signature = parsedUrl.searchParams.get('sig');
|
|
if (signature) {
|
|
(0,lib_core/* setSecret */.Pq)(signature);
|
|
(0,lib_core/* setSecret */.Pq)(encodeURIComponent(signature));
|
|
}
|
|
}
|
|
catch (error) {
|
|
(0,lib_core/* debug */.Yz)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`);
|
|
}
|
|
}
|
|
/**
|
|
* Masks sensitive information in URLs containing signature parameters.
|
|
* Currently supports masking 'sig' parameters in the 'signed_upload_url'
|
|
* and 'signed_download_url' properties of the provided object.
|
|
*
|
|
* @param body - The object should contain a signature
|
|
* @remarks
|
|
* This function extracts URLs from the object properties and calls maskSigUrl
|
|
* on each one to redact sensitive signature information. The function doesn't
|
|
* modify the original object; it only marks the signatures as secrets for
|
|
* logging purposes.
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* const responseBody = {
|
|
* signed_upload_url: 'https://blob.core.windows.net/?sig=abc123',
|
|
* signed_download_url: 'https://blob.core/windows.net/?sig=def456'
|
|
* };
|
|
* maskSecretUrls(responseBody);
|
|
* ```
|
|
*/
|
|
function maskSecretUrls(body) {
|
|
if (typeof body !== 'object' || body === null) {
|
|
(0,lib_core/* debug */.Yz)('body is not an object or is null');
|
|
return;
|
|
}
|
|
if ('signed_upload_url' in body &&
|
|
typeof body.signed_upload_url === 'string') {
|
|
maskSigUrl(body.signed_upload_url);
|
|
}
|
|
if ('signed_download_url' in body &&
|
|
typeof body.signed_download_url === 'string') {
|
|
maskSigUrl(body.signed_download_url);
|
|
}
|
|
}
|
|
//# sourceMappingURL=util.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/shared/cacheTwirpClient.js
|
|
var cacheTwirpClient_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
|
|
*
|
|
* It adds retry logic to the request method, which is not present in the generated client.
|
|
*
|
|
* This class is used to interact with cache service v2.
|
|
*/
|
|
class CacheServiceClient {
|
|
constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) {
|
|
this.maxAttempts = 5;
|
|
this.baseRetryIntervalMilliseconds = 3000;
|
|
this.retryMultiplier = 1.5;
|
|
const token = getRuntimeToken();
|
|
this.baseUrl = getCacheServiceURL();
|
|
if (maxAttempts) {
|
|
this.maxAttempts = maxAttempts;
|
|
}
|
|
if (baseRetryIntervalMilliseconds) {
|
|
this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds;
|
|
}
|
|
if (retryMultiplier) {
|
|
this.retryMultiplier = retryMultiplier;
|
|
}
|
|
this.httpClient = new lib/* HttpClient */.Qq(userAgent, [
|
|
new auth/* BearerCredentialHandler */.tZ(token)
|
|
]);
|
|
}
|
|
// This function satisfies the Rpc interface. It is compatible with the JSON
|
|
// JSON generated client.
|
|
request(service, method, contentType, data) {
|
|
return cacheTwirpClient_awaiter(this, void 0, void 0, function* () {
|
|
const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href;
|
|
(0,lib_core/* debug */.Yz)(`[Request] ${method} ${url}`);
|
|
const headers = {
|
|
'Content-Type': contentType
|
|
};
|
|
try {
|
|
const { body } = yield this.retryableRequest(() => cacheTwirpClient_awaiter(this, void 0, void 0, function* () { return this.httpClient.post(url, JSON.stringify(data), headers); }));
|
|
return body;
|
|
}
|
|
catch (error) {
|
|
throw new Error(`Failed to ${method}: ${error.message}`);
|
|
}
|
|
});
|
|
}
|
|
retryableRequest(operation) {
|
|
return cacheTwirpClient_awaiter(this, void 0, void 0, function* () {
|
|
let attempt = 0;
|
|
let errorMessage = '';
|
|
let rawBody = '';
|
|
while (attempt < this.maxAttempts) {
|
|
let isRetryable = false;
|
|
try {
|
|
const response = yield operation();
|
|
const statusCode = response.message.statusCode;
|
|
rawBody = yield response.readBody();
|
|
(0,lib_core/* debug */.Yz)(`[Response] - ${response.message.statusCode}`);
|
|
(0,lib_core/* debug */.Yz)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);
|
|
const body = JSON.parse(rawBody);
|
|
maskSecretUrls(body);
|
|
(0,lib_core/* debug */.Yz)(`Body: ${JSON.stringify(body, null, 2)}`);
|
|
if (this.isSuccessStatusCode(statusCode)) {
|
|
return { response, body };
|
|
}
|
|
isRetryable = this.isRetryableHttpStatusCode(statusCode);
|
|
errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`;
|
|
if (body.msg) {
|
|
if (UsageError.isUsageErrorMessage(body.msg)) {
|
|
throw new UsageError();
|
|
}
|
|
errorMessage = `${errorMessage}: ${body.msg}`;
|
|
}
|
|
// Handle rate limiting - don't retry, just warn and exit
|
|
// For more info, see https://docs.github.com/en/actions/reference/limits
|
|
if (statusCode === lib/* HttpCodes */.Hv.TooManyRequests) {
|
|
const retryAfterHeader = response.message.headers['retry-after'];
|
|
if (retryAfterHeader) {
|
|
const parsedSeconds = parseInt(retryAfterHeader, 10);
|
|
if (!isNaN(parsedSeconds) && parsedSeconds > 0) {
|
|
(0,lib_core/* warning */.$e)(`You've hit a rate limit, your rate limit will reset in ${parsedSeconds} seconds`);
|
|
}
|
|
}
|
|
throw new RateLimitError(`Rate limited: ${errorMessage}`);
|
|
}
|
|
}
|
|
catch (error) {
|
|
if (error instanceof SyntaxError) {
|
|
(0,lib_core/* debug */.Yz)(`Raw Body: ${rawBody}`);
|
|
}
|
|
if (error instanceof UsageError) {
|
|
throw error;
|
|
}
|
|
if (error instanceof RateLimitError) {
|
|
throw error;
|
|
}
|
|
if (NetworkError.isNetworkErrorCode(error === null || error === void 0 ? void 0 : error.code)) {
|
|
throw new NetworkError(error === null || error === void 0 ? void 0 : error.code);
|
|
}
|
|
isRetryable = true;
|
|
errorMessage = error.message;
|
|
}
|
|
if (!isRetryable) {
|
|
throw new Error(`Received non-retryable error: ${errorMessage}`);
|
|
}
|
|
if (attempt + 1 === this.maxAttempts) {
|
|
throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`);
|
|
}
|
|
const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt);
|
|
(0,lib_core/* info */.pq)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`);
|
|
yield this.sleep(retryTimeMilliseconds);
|
|
attempt++;
|
|
}
|
|
throw new Error(`Request failed`);
|
|
});
|
|
}
|
|
isSuccessStatusCode(statusCode) {
|
|
if (!statusCode)
|
|
return false;
|
|
return statusCode >= 200 && statusCode < 300;
|
|
}
|
|
isRetryableHttpStatusCode(statusCode) {
|
|
if (!statusCode)
|
|
return false;
|
|
const retryableStatusCodes = [
|
|
lib/* HttpCodes */.Hv.BadGateway,
|
|
lib/* HttpCodes */.Hv.GatewayTimeout,
|
|
lib/* HttpCodes */.Hv.InternalServerError,
|
|
lib/* HttpCodes */.Hv.ServiceUnavailable
|
|
];
|
|
return retryableStatusCodes.includes(statusCode);
|
|
}
|
|
sleep(milliseconds) {
|
|
return cacheTwirpClient_awaiter(this, void 0, void 0, function* () {
|
|
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|
});
|
|
}
|
|
getExponentialRetryTimeMilliseconds(attempt) {
|
|
if (attempt < 0) {
|
|
throw new Error('attempt should be a positive integer');
|
|
}
|
|
if (attempt === 0) {
|
|
return this.baseRetryIntervalMilliseconds;
|
|
}
|
|
const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt);
|
|
const maxTime = minTime * this.retryMultiplier;
|
|
// returns a random number between minTime and maxTime (exclusive)
|
|
return Math.trunc(Math.random() * (maxTime - minTime) + minTime);
|
|
}
|
|
}
|
|
function internalCacheTwirpClient(options) {
|
|
const client = new CacheServiceClient(user_agent_getUserAgentString(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);
|
|
return new CacheServiceClientJSON(client);
|
|
}
|
|
//# sourceMappingURL=cacheTwirpClient.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/tar.js
|
|
var tar_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const tar_IS_WINDOWS = process.platform === 'win32';
|
|
// Returns tar path and type: BSD or GNU
|
|
function getTarPath() {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
switch (process.platform) {
|
|
case 'win32': {
|
|
const gnuTar = yield getGnuTarPathOnWindows();
|
|
const systemTar = SystemTarPathOnWindows;
|
|
if (gnuTar) {
|
|
// Use GNUtar as default on windows
|
|
return { path: gnuTar, type: ArchiveToolType.GNU };
|
|
}
|
|
else if ((0,external_fs_.existsSync)(systemTar)) {
|
|
return { path: systemTar, type: ArchiveToolType.BSD };
|
|
}
|
|
break;
|
|
}
|
|
case 'darwin': {
|
|
const gnuTar = yield io/* which */.K7('gtar', false);
|
|
if (gnuTar) {
|
|
// fix permission denied errors when extracting BSD tar archive with GNU tar - https://github.com/actions/cache/issues/527
|
|
return { path: gnuTar, type: ArchiveToolType.GNU };
|
|
}
|
|
else {
|
|
return {
|
|
path: yield io/* which */.K7('tar', true),
|
|
type: ArchiveToolType.BSD
|
|
};
|
|
}
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
// Default assumption is GNU tar is present in path
|
|
return {
|
|
path: yield io/* which */.K7('tar', true),
|
|
type: ArchiveToolType.GNU
|
|
};
|
|
});
|
|
}
|
|
// Return arguments for tar as per tarPath, compressionMethod, method type and os
|
|
function getTarArgs(tarPath_1, compressionMethod_1, type_1) {
|
|
return tar_awaiter(this, arguments, void 0, function* (tarPath, compressionMethod, type, archivePath = '') {
|
|
const args = [`"${tarPath.path}"`];
|
|
const cacheFileName = getCacheFileName(compressionMethod);
|
|
const tarFile = 'cache.tar';
|
|
const workingDirectory = getWorkingDirectory();
|
|
// Speficic args for BSD tar on windows for workaround
|
|
const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD &&
|
|
compressionMethod !== CompressionMethod.Gzip &&
|
|
tar_IS_WINDOWS;
|
|
// Method specific args
|
|
switch (type) {
|
|
case 'create':
|
|
args.push('--posix', '-cf', BSD_TAR_ZSTD
|
|
? tarFile
|
|
: cacheFileName.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'), '--exclude', BSD_TAR_ZSTD
|
|
? tarFile
|
|
: cacheFileName.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'), '--files-from', ManifestFilename);
|
|
break;
|
|
case 'extract':
|
|
args.push('-xf', BSD_TAR_ZSTD
|
|
? tarFile
|
|
: archivePath.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'), '-P', '-C', workingDirectory.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'));
|
|
break;
|
|
case 'list':
|
|
args.push('-tf', BSD_TAR_ZSTD
|
|
? tarFile
|
|
: archivePath.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'), '-P');
|
|
break;
|
|
}
|
|
// Platform specific args
|
|
if (tarPath.type === ArchiveToolType.GNU) {
|
|
switch (process.platform) {
|
|
case 'win32':
|
|
args.push('--force-local');
|
|
break;
|
|
case 'darwin':
|
|
args.push('--delay-directory-restore');
|
|
break;
|
|
}
|
|
}
|
|
return args;
|
|
});
|
|
}
|
|
// Returns commands to run tar and compression program
|
|
function getCommands(compressionMethod_1, type_1) {
|
|
return tar_awaiter(this, arguments, void 0, function* (compressionMethod, type, archivePath = '') {
|
|
let args;
|
|
const tarPath = yield getTarPath();
|
|
const tarArgs = yield getTarArgs(tarPath, compressionMethod, type, archivePath);
|
|
const compressionArgs = type !== 'create'
|
|
? yield getDecompressionProgram(tarPath, compressionMethod, archivePath)
|
|
: yield getCompressionProgram(tarPath, compressionMethod);
|
|
const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD &&
|
|
compressionMethod !== CompressionMethod.Gzip &&
|
|
tar_IS_WINDOWS;
|
|
if (BSD_TAR_ZSTD && type !== 'create') {
|
|
args = [[...compressionArgs].join(' '), [...tarArgs].join(' ')];
|
|
}
|
|
else {
|
|
args = [[...tarArgs].join(' '), [...compressionArgs].join(' ')];
|
|
}
|
|
if (BSD_TAR_ZSTD) {
|
|
return args;
|
|
}
|
|
return [args.join(' ')];
|
|
});
|
|
}
|
|
function getWorkingDirectory() {
|
|
var _a;
|
|
return (_a = process.env['GITHUB_WORKSPACE']) !== null && _a !== void 0 ? _a : process.cwd();
|
|
}
|
|
// Common function for extractTar and listTar to get the compression method
|
|
function getDecompressionProgram(tarPath, compressionMethod, archivePath) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
// -d: Decompress.
|
|
// unzstd is equivalent to 'zstd -d'
|
|
// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
|
|
// Using 30 here because we also support 32-bit self-hosted runners.
|
|
const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD &&
|
|
compressionMethod !== CompressionMethod.Gzip &&
|
|
tar_IS_WINDOWS;
|
|
switch (compressionMethod) {
|
|
case CompressionMethod.Zstd:
|
|
return BSD_TAR_ZSTD
|
|
? [
|
|
'zstd -d --long=30 --force -o',
|
|
TarFilename,
|
|
archivePath.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/')
|
|
]
|
|
: [
|
|
'--use-compress-program',
|
|
tar_IS_WINDOWS ? '"zstd -d --long=30"' : 'unzstd --long=30'
|
|
];
|
|
case CompressionMethod.ZstdWithoutLong:
|
|
return BSD_TAR_ZSTD
|
|
? [
|
|
'zstd -d --force -o',
|
|
TarFilename,
|
|
archivePath.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/')
|
|
]
|
|
: ['--use-compress-program', tar_IS_WINDOWS ? '"zstd -d"' : 'unzstd'];
|
|
default:
|
|
return ['-z'];
|
|
}
|
|
});
|
|
}
|
|
// Used for creating the archive
|
|
// -T#: Compress using # working thread. If # is 0, attempt to detect and use the number of physical CPU cores.
|
|
// zstdmt is equivalent to 'zstd -T0'
|
|
// --long=#: Enables long distance matching with # bits. Maximum is 30 (1GB) on 32-bit OS and 31 (2GB) on 64-bit.
|
|
// Using 30 here because we also support 32-bit self-hosted runners.
|
|
// Long range mode is added to zstd in v1.3.2 release, so we will not use --long in older version of zstd.
|
|
function getCompressionProgram(tarPath, compressionMethod) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
const cacheFileName = getCacheFileName(compressionMethod);
|
|
const BSD_TAR_ZSTD = tarPath.type === ArchiveToolType.BSD &&
|
|
compressionMethod !== CompressionMethod.Gzip &&
|
|
tar_IS_WINDOWS;
|
|
switch (compressionMethod) {
|
|
case CompressionMethod.Zstd:
|
|
return BSD_TAR_ZSTD
|
|
? [
|
|
'zstd -T0 --long=30 --force -o',
|
|
cacheFileName.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'),
|
|
TarFilename
|
|
]
|
|
: [
|
|
'--use-compress-program',
|
|
tar_IS_WINDOWS ? '"zstd -T0 --long=30"' : 'zstdmt --long=30'
|
|
];
|
|
case CompressionMethod.ZstdWithoutLong:
|
|
return BSD_TAR_ZSTD
|
|
? [
|
|
'zstd -T0 --force -o',
|
|
cacheFileName.replace(new RegExp(`\\${external_path_.sep}`, 'g'), '/'),
|
|
TarFilename
|
|
]
|
|
: ['--use-compress-program', tar_IS_WINDOWS ? '"zstd -T0"' : 'zstdmt'];
|
|
default:
|
|
return ['-z'];
|
|
}
|
|
});
|
|
}
|
|
// Executes all commands as separate processes
|
|
function execCommands(commands, cwd) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
for (const command of commands) {
|
|
try {
|
|
yield (0,exec/* exec */.m)(command, undefined, {
|
|
cwd,
|
|
env: Object.assign(Object.assign({}, process.env), { MSYS: 'winsymlinks:nativestrict' })
|
|
});
|
|
}
|
|
catch (error) {
|
|
throw new Error(`${command.split(' ')[0]} failed with error: ${error === null || error === void 0 ? void 0 : error.message}`);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
// List the contents of a tar
|
|
function listTar(archivePath, compressionMethod) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
const commands = yield getCommands(compressionMethod, 'list', archivePath);
|
|
yield execCommands(commands);
|
|
});
|
|
}
|
|
// Extract a tar
|
|
function extractTar(archivePath, compressionMethod) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
// Create directory to extract tar into
|
|
const workingDirectory = getWorkingDirectory();
|
|
yield io/* mkdirP */.U$(workingDirectory);
|
|
const commands = yield getCommands(compressionMethod, 'extract', archivePath);
|
|
yield execCommands(commands);
|
|
});
|
|
}
|
|
// Create a tar
|
|
function createTar(archiveFolder, sourceDirectories, compressionMethod) {
|
|
return tar_awaiter(this, void 0, void 0, function* () {
|
|
// Write source directories to manifest.txt to avoid command length limits
|
|
(0,external_fs_.writeFileSync)(external_path_.join(archiveFolder, ManifestFilename), sourceDirectories.join('\n'));
|
|
const commands = yield getCommands(compressionMethod, 'create');
|
|
yield execCommands(commands, archiveFolder);
|
|
});
|
|
}
|
|
//# sourceMappingURL=tar.js.map
|
|
;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/cache.js
|
|
var cache_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ValidationError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'ValidationError';
|
|
Object.setPrototypeOf(this, ValidationError.prototype);
|
|
}
|
|
}
|
|
class ReserveCacheError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'ReserveCacheError';
|
|
Object.setPrototypeOf(this, ReserveCacheError.prototype);
|
|
}
|
|
}
|
|
/**
|
|
* Stable prefix the cache service writes into the cache reservation response
|
|
* when the issuer downgraded the cache token to read-only (for example, because
|
|
* the run was triggered by an untrusted event). saveCacheV1 / saveCacheV2
|
|
* dispatch on this prefix to re-classify the failure as a CacheWriteDeniedError
|
|
* so consumers and tests can distinguish a policy denial from other reservation
|
|
* failures. Internally it is logged as a non-fatal warning like other
|
|
* best-effort save failures.
|
|
*/
|
|
const CACHE_WRITE_DENIED_PREFIX = 'cache write denied:';
|
|
/**
|
|
* Raised when the cache backend refuses to reserve a writable cache entry
|
|
* because the JWT issued for this run was scoped read-only (for example, the
|
|
* run was triggered by an event the repository administrator classified as
|
|
* untrusted). The service-supplied detail message always begins with
|
|
* `cache write denied:` (the full error message includes additional context
|
|
* like the cache key).
|
|
*
|
|
* Extends ReserveCacheError for source-compatibility: existing
|
|
* `instanceof ReserveCacheError` checks and `typedError.name ===
|
|
* ReserveCacheError.name` paths keep working, while consumers that want to
|
|
* distinguish the policy case can match on this subclass.
|
|
*/
|
|
class CacheWriteDeniedError extends ReserveCacheError {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'CacheWriteDeniedError';
|
|
Object.setPrototypeOf(this, CacheWriteDeniedError.prototype);
|
|
}
|
|
}
|
|
// Re-exported from constants so consumers keep referencing it here; the shared
|
|
// value also drives detection in cacheHttpClient without duplicating the string.
|
|
const CACHE_READ_DENIED_PREFIX = CacheReadDeniedMessagePrefix;
|
|
// Raised when the cache backend denies a download URL because the run's token
|
|
// has no readable cache scopes. Caching is best-effort, so restoreCache logs a
|
|
// warning and reports a cache miss rather than rethrowing this.
|
|
class CacheReadDeniedError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'CacheReadDeniedError';
|
|
Object.setPrototypeOf(this, CacheReadDeniedError.prototype);
|
|
}
|
|
}
|
|
class FinalizeCacheError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = 'FinalizeCacheError';
|
|
Object.setPrototypeOf(this, FinalizeCacheError.prototype);
|
|
}
|
|
}
|
|
function checkPaths(paths) {
|
|
if (!paths || paths.length === 0) {
|
|
throw new ValidationError(`Path Validation Error: At least one directory or file path is required`);
|
|
}
|
|
}
|
|
function checkKey(key) {
|
|
if (key.length > 512) {
|
|
throw new ValidationError(`Key Validation Error: ${key} cannot be larger than 512 characters.`);
|
|
}
|
|
const regex = /^[^,]*$/;
|
|
if (!regex.test(key)) {
|
|
throw new ValidationError(`Key Validation Error: ${key} cannot contain commas.`);
|
|
}
|
|
}
|
|
/**
|
|
* isFeatureAvailable to check the presence of Actions cache service
|
|
*
|
|
* @returns boolean return true if Actions cache service feature is available, otherwise false
|
|
*/
|
|
function isFeatureAvailable() {
|
|
const cacheServiceVersion = getCacheServiceVersion();
|
|
// Check availability based on cache service version
|
|
switch (cacheServiceVersion) {
|
|
case 'v2':
|
|
// For v2, we need ACTIONS_RESULTS_URL
|
|
return !!process.env['ACTIONS_RESULTS_URL'];
|
|
case 'v1':
|
|
default:
|
|
// For v1, we only need ACTIONS_CACHE_URL
|
|
return !!process.env['ACTIONS_CACHE_URL'];
|
|
}
|
|
}
|
|
/**
|
|
* Restores cache from keys
|
|
*
|
|
* @param paths a list of file paths to restore from the cache
|
|
* @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
|
|
* @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
|
|
* @param downloadOptions cache download options
|
|
* @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
|
|
* @returns string returns the key for the cache hit, otherwise returns undefined
|
|
*/
|
|
function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
|
|
const cacheServiceVersion = getCacheServiceVersion();
|
|
lib_core/* debug */.Yz(`Cache service version: ${cacheServiceVersion}`);
|
|
checkPaths(paths);
|
|
const cacheMode = getCacheMode();
|
|
if (!isCacheReadable(cacheMode)) {
|
|
lib_core/* info */.pq(`Cache restore skipped: the effective cache-mode '${cacheMode}' does not permit reads.`);
|
|
lib_core/* debug */.Yz(`Skipped restore for paths [${paths.join(', ')}] with primary key '${primaryKey}'.`);
|
|
return undefined;
|
|
}
|
|
switch (cacheServiceVersion) {
|
|
case 'v2':
|
|
return yield restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
|
|
case 'v1':
|
|
default:
|
|
return yield restoreCacheV1(paths, primaryKey, restoreKeys, options, enableCrossOsArchive);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Restores cache using the legacy Cache Service
|
|
*
|
|
* @param paths a list of file paths to restore from the cache
|
|
* @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching.
|
|
* @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
|
|
* @param options cache download options
|
|
* @param enableCrossOsArchive an optional boolean enabled to restore on Windows any cache created on any platform
|
|
* @returns string returns the key for the cache hit, otherwise returns undefined
|
|
*/
|
|
function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
|
|
var _a;
|
|
restoreKeys = restoreKeys || [];
|
|
const keys = [primaryKey, ...restoreKeys];
|
|
lib_core/* debug */.Yz('Resolved Keys:');
|
|
lib_core/* debug */.Yz(JSON.stringify(keys));
|
|
if (keys.length > 10) {
|
|
throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
|
|
}
|
|
for (const key of keys) {
|
|
checkKey(key);
|
|
}
|
|
const compressionMethod = yield getCompressionMethod();
|
|
let archivePath = '';
|
|
try {
|
|
// path are needed to compute version
|
|
let cacheEntry;
|
|
try {
|
|
cacheEntry = yield getCacheEntry(keys, paths, {
|
|
compressionMethod,
|
|
enableCrossOsArchive
|
|
});
|
|
}
|
|
catch (error) {
|
|
// The v1 artifact cache service returns HTTP 403 with a
|
|
// `cache read denied:` body when the run's token has no readable cache
|
|
// scopes. getCacheEntry lives in a dependency-free internal module and
|
|
// cannot import CacheReadDeniedError without a circular dependency, so it
|
|
// only surfaces the raw denial message; we classify it into the typed
|
|
// error here so the outer catch and consumers can dispatch on it.
|
|
const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : '';
|
|
if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) {
|
|
throw new CacheReadDeniedError(errorMessage);
|
|
}
|
|
throw error;
|
|
}
|
|
if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) {
|
|
// Cache not found
|
|
return undefined;
|
|
}
|
|
if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
|
|
lib_core/* info */.pq('Lookup only - skipping download');
|
|
return cacheEntry.cacheKey;
|
|
}
|
|
archivePath = external_path_.join(yield createTempDirectory(), getCacheFileName(compressionMethod));
|
|
lib_core/* debug */.Yz(`Archive Path: ${archivePath}`);
|
|
// Download the cache from the cache entry
|
|
yield downloadCache(cacheEntry.archiveLocation, archivePath, options);
|
|
if (lib_core/* isDebug */._o()) {
|
|
yield listTar(archivePath, compressionMethod);
|
|
}
|
|
const archiveFileSize = getArchiveFileSizeInBytes(archivePath);
|
|
lib_core/* info */.pq(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
|
|
yield extractTar(archivePath, compressionMethod);
|
|
lib_core/* info */.pq('Cache restored successfully');
|
|
return cacheEntry.cacheKey;
|
|
}
|
|
catch (error) {
|
|
const typedError = error;
|
|
if (typedError.name === ValidationError.name) {
|
|
throw error;
|
|
}
|
|
else {
|
|
// warn on cache restore failure and continue build
|
|
// Log server errors (5xx) as errors, all other errors as warnings.
|
|
// A read denied by policy (CacheReadDeniedError) is not an HttpClientError
|
|
// so it falls here and is warned, treated as a cache miss.
|
|
if (typedError instanceof lib/* HttpClientError */.Kg &&
|
|
typeof typedError.statusCode === 'number' &&
|
|
typedError.statusCode >= 500) {
|
|
lib_core/* error */.z3(`Failed to restore: ${error.message}`);
|
|
}
|
|
else {
|
|
lib_core/* warning */.$e(`Failed to restore: ${error.message}`);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
// Try to delete the archive to save space
|
|
try {
|
|
yield unlinkFile(archivePath);
|
|
}
|
|
catch (error) {
|
|
lib_core/* debug */.Yz(`Failed to delete archive: ${error}`);
|
|
}
|
|
}
|
|
return undefined;
|
|
});
|
|
}
|
|
/**
|
|
* Restores cache using Cache Service v2
|
|
*
|
|
* @param paths a list of file paths to restore from the cache
|
|
* @param primaryKey an explicit key for restoring the cache. Lookup is done with prefix matching
|
|
* @param restoreKeys an optional ordered list of keys to use for restoring the cache if no cache hit occurred for primaryKey
|
|
* @param downloadOptions cache download options
|
|
* @param enableCrossOsArchive an optional boolean enabled to restore on windows any cache created on any platform
|
|
* @returns string returns the key for the cache hit, otherwise returns undefined
|
|
*/
|
|
function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) {
|
|
var _a;
|
|
// Override UploadOptions to force the use of Azure
|
|
options = Object.assign(Object.assign({}, options), { useAzureSdk: true });
|
|
restoreKeys = restoreKeys || [];
|
|
const keys = [primaryKey, ...restoreKeys];
|
|
lib_core/* debug */.Yz('Resolved Keys:');
|
|
lib_core/* debug */.Yz(JSON.stringify(keys));
|
|
if (keys.length > 10) {
|
|
throw new ValidationError(`Key Validation Error: Keys are limited to a maximum of 10.`);
|
|
}
|
|
for (const key of keys) {
|
|
checkKey(key);
|
|
}
|
|
let archivePath = '';
|
|
try {
|
|
const twirpClient = internalCacheTwirpClient();
|
|
const compressionMethod = yield getCompressionMethod();
|
|
const request = {
|
|
key: primaryKey,
|
|
restoreKeys,
|
|
version: getCacheVersion(paths, compressionMethod, enableCrossOsArchive)
|
|
};
|
|
let response;
|
|
try {
|
|
response = yield twirpClient.GetCacheEntryDownloadURL(request);
|
|
}
|
|
catch (error) {
|
|
// The receiver returns twirp PermissionDenied (403) when the run's token
|
|
// has no readable cache scopes. The client wraps that 403, so the stable
|
|
// prefix is embedded in the message rather than leading it.
|
|
const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : '';
|
|
if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) {
|
|
throw new CacheReadDeniedError(errorMessage);
|
|
}
|
|
throw error;
|
|
}
|
|
if (!response.ok) {
|
|
lib_core/* debug */.Yz(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`);
|
|
return undefined;
|
|
}
|
|
const isRestoreKeyMatch = request.key !== response.matchedKey;
|
|
if (isRestoreKeyMatch) {
|
|
lib_core/* info */.pq(`Cache hit for restore-key: ${response.matchedKey}`);
|
|
}
|
|
else {
|
|
lib_core/* info */.pq(`Cache hit for: ${response.matchedKey}`);
|
|
}
|
|
if (options === null || options === void 0 ? void 0 : options.lookupOnly) {
|
|
lib_core/* info */.pq('Lookup only - skipping download');
|
|
return response.matchedKey;
|
|
}
|
|
archivePath = external_path_.join(yield createTempDirectory(), getCacheFileName(compressionMethod));
|
|
lib_core/* debug */.Yz(`Archive path: ${archivePath}`);
|
|
lib_core/* debug */.Yz(`Starting download of archive to: ${archivePath}`);
|
|
yield downloadCache(response.signedDownloadUrl, archivePath, options);
|
|
const archiveFileSize = getArchiveFileSizeInBytes(archivePath);
|
|
lib_core/* info */.pq(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
|
|
if (lib_core/* isDebug */._o()) {
|
|
yield listTar(archivePath, compressionMethod);
|
|
}
|
|
yield extractTar(archivePath, compressionMethod);
|
|
lib_core/* info */.pq('Cache restored successfully');
|
|
return response.matchedKey;
|
|
}
|
|
catch (error) {
|
|
const typedError = error;
|
|
if (typedError.name === ValidationError.name) {
|
|
throw error;
|
|
}
|
|
else {
|
|
// Suppress all non-validation cache related errors because caching should be optional
|
|
// Log server errors (5xx) as errors, all other errors as warnings.
|
|
// A read denied by policy (CacheReadDeniedError) is not an HttpClientError
|
|
// so it falls here and is warned, treated as a cache miss.
|
|
if (typedError instanceof lib/* HttpClientError */.Kg &&
|
|
typeof typedError.statusCode === 'number' &&
|
|
typedError.statusCode >= 500) {
|
|
lib_core/* error */.z3(`Failed to restore: ${error.message}`);
|
|
}
|
|
else {
|
|
lib_core/* warning */.$e(`Failed to restore: ${error.message}`);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
try {
|
|
if (archivePath) {
|
|
yield unlinkFile(archivePath);
|
|
}
|
|
}
|
|
catch (error) {
|
|
lib_core/* debug */.Yz(`Failed to delete archive: ${error}`);
|
|
}
|
|
}
|
|
return undefined;
|
|
});
|
|
}
|
|
/**
|
|
* Saves a list of files with the specified key
|
|
*
|
|
* @param paths a list of file paths to be cached
|
|
* @param key an explicit key for restoring the cache
|
|
* @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
|
|
* @param options cache upload options
|
|
* @returns number returns cacheId if the cache was saved successfully and throws an error if save fails
|
|
*/
|
|
function cache_saveCache(paths_1, key_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
|
|
const cacheServiceVersion = getCacheServiceVersion();
|
|
lib_core/* debug */.Yz(`Cache service version: ${cacheServiceVersion}`);
|
|
checkPaths(paths);
|
|
checkKey(key);
|
|
const cacheMode = getCacheMode();
|
|
if (!isCacheWritable(cacheMode)) {
|
|
lib_core/* info */.pq(`Cache save skipped: the effective cache-mode '${cacheMode}' does not permit writes.`);
|
|
lib_core/* debug */.Yz(`Skipped save for paths [${paths.join(', ')}] with key '${key}'.`);
|
|
return -1;
|
|
}
|
|
switch (cacheServiceVersion) {
|
|
case 'v2':
|
|
return yield saveCacheV2(paths, key, options, enableCrossOsArchive);
|
|
case 'v1':
|
|
default:
|
|
return yield saveCacheV1(paths, key, options, enableCrossOsArchive);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Save cache using the legacy Cache Service
|
|
*
|
|
* @param paths
|
|
* @param key
|
|
* @param options
|
|
* @param enableCrossOsArchive
|
|
* @returns
|
|
*/
|
|
function saveCacheV1(paths_1, key_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
const compressionMethod = yield getCompressionMethod();
|
|
let cacheId = -1;
|
|
const cachePaths = yield resolvePaths(paths);
|
|
lib_core/* debug */.Yz('Cache Paths:');
|
|
lib_core/* debug */.Yz(`${JSON.stringify(cachePaths)}`);
|
|
if (cachePaths.length === 0) {
|
|
throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
|
|
}
|
|
const archiveFolder = yield createTempDirectory();
|
|
const archivePath = external_path_.join(archiveFolder, getCacheFileName(compressionMethod));
|
|
lib_core/* debug */.Yz(`Archive Path: ${archivePath}`);
|
|
try {
|
|
yield createTar(archiveFolder, cachePaths, compressionMethod);
|
|
if (lib_core/* isDebug */._o()) {
|
|
yield listTar(archivePath, compressionMethod);
|
|
}
|
|
const fileSizeLimit = 10 * 1024 * 1024 * 1024; // 10GB per repo limit
|
|
const archiveFileSize = getArchiveFileSizeInBytes(archivePath);
|
|
lib_core/* debug */.Yz(`File Size: ${archiveFileSize}`);
|
|
// For GHES, this check will take place in ReserveCache API with enterprise file size limit
|
|
if (archiveFileSize > fileSizeLimit && !isGhes()) {
|
|
throw new Error(`Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the 10GB limit, not saving cache.`);
|
|
}
|
|
lib_core/* debug */.Yz('Reserving Cache');
|
|
const reserveCacheResponse = yield reserveCache(key, paths, {
|
|
compressionMethod,
|
|
enableCrossOsArchive,
|
|
cacheSize: archiveFileSize
|
|
});
|
|
if ((_a = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _a === void 0 ? void 0 : _a.cacheId) {
|
|
cacheId = (_b = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.result) === null || _b === void 0 ? void 0 : _b.cacheId;
|
|
}
|
|
else if ((reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.statusCode) === 400) {
|
|
throw new Error((_d = (_c = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : `Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the data cap limit, not saving cache.`);
|
|
}
|
|
else {
|
|
// Inspect the receiver's error message before deciding which error to
|
|
// throw. A message starting with the stable `cache write denied:`
|
|
// prefix indicates the issuer downgraded the token to read-only
|
|
// (policy denial), not a contention case, so we surface it as a
|
|
// CacheWriteDeniedError which the outer catch arm logs at warning
|
|
// level.
|
|
const detailMessage = (_e = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _e === void 0 ? void 0 : _e.message;
|
|
if (detailMessage === null || detailMessage === void 0 ? void 0 : detailMessage.startsWith(CACHE_WRITE_DENIED_PREFIX)) {
|
|
throw new CacheWriteDeniedError(`Unable to reserve cache with key ${key}. More details: ${detailMessage}`);
|
|
}
|
|
throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache. More details: ${(_f = reserveCacheResponse === null || reserveCacheResponse === void 0 ? void 0 : reserveCacheResponse.error) === null || _f === void 0 ? void 0 : _f.message}`);
|
|
}
|
|
lib_core/* debug */.Yz(`Saving Cache (ID: ${cacheId})`);
|
|
yield saveCache(cacheId, archivePath, '', options);
|
|
}
|
|
catch (error) {
|
|
const typedError = error;
|
|
if (typedError.name === ValidationError.name) {
|
|
throw error;
|
|
}
|
|
else if (typedError.name === ReserveCacheError.name) {
|
|
lib_core/* info */.pq(`Failed to save: ${typedError.message}`);
|
|
}
|
|
else {
|
|
// Log server errors (5xx) as errors, all other errors as warnings.
|
|
// A write denied by policy (CacheWriteDeniedError) is not an
|
|
// HttpClientError and its name does not match the ReserveCacheError arm,
|
|
// so it falls here and is warned without failing the run.
|
|
if (typedError instanceof lib/* HttpClientError */.Kg &&
|
|
typeof typedError.statusCode === 'number' &&
|
|
typedError.statusCode >= 500) {
|
|
lib_core/* error */.z3(`Failed to save: ${typedError.message}`);
|
|
}
|
|
else {
|
|
lib_core/* warning */.$e(`Failed to save: ${typedError.message}`);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
// Try to delete the archive to save space
|
|
try {
|
|
yield unlinkFile(archivePath);
|
|
}
|
|
catch (error) {
|
|
lib_core/* debug */.Yz(`Failed to delete archive: ${error}`);
|
|
}
|
|
}
|
|
return cacheId;
|
|
});
|
|
}
|
|
/**
|
|
* Save cache using Cache Service v2
|
|
*
|
|
* @param paths a list of file paths to restore from the cache
|
|
* @param key an explicit key for restoring the cache
|
|
* @param options cache upload options
|
|
* @param enableCrossOsArchive an optional boolean enabled to save cache on windows which could be restored on any platform
|
|
* @returns
|
|
*/
|
|
function saveCacheV2(paths_1, key_1, options_1) {
|
|
return cache_awaiter(this, arguments, void 0, function* (paths, key, options, enableCrossOsArchive = false) {
|
|
var _a;
|
|
// Override UploadOptions to force the use of Azure
|
|
// ...options goes first because we want to override the default values
|
|
// set in UploadOptions with these specific figures
|
|
options = Object.assign(Object.assign({}, options), { uploadChunkSize: 64 * 1024 * 1024, uploadConcurrency: 8, useAzureSdk: true });
|
|
const compressionMethod = yield getCompressionMethod();
|
|
const twirpClient = internalCacheTwirpClient();
|
|
let cacheId = -1;
|
|
const cachePaths = yield resolvePaths(paths);
|
|
lib_core/* debug */.Yz('Cache Paths:');
|
|
lib_core/* debug */.Yz(`${JSON.stringify(cachePaths)}`);
|
|
if (cachePaths.length === 0) {
|
|
throw new Error(`Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved.`);
|
|
}
|
|
const archiveFolder = yield createTempDirectory();
|
|
const archivePath = external_path_.join(archiveFolder, getCacheFileName(compressionMethod));
|
|
lib_core/* debug */.Yz(`Archive Path: ${archivePath}`);
|
|
try {
|
|
yield createTar(archiveFolder, cachePaths, compressionMethod);
|
|
if (lib_core/* isDebug */._o()) {
|
|
yield listTar(archivePath, compressionMethod);
|
|
}
|
|
const archiveFileSize = getArchiveFileSizeInBytes(archivePath);
|
|
lib_core/* debug */.Yz(`File Size: ${archiveFileSize}`);
|
|
// Set the archive size in the options, will be used to display the upload progress
|
|
options.archiveSizeBytes = archiveFileSize;
|
|
lib_core/* debug */.Yz('Reserving Cache');
|
|
const version = getCacheVersion(paths, compressionMethod, enableCrossOsArchive);
|
|
const request = {
|
|
key,
|
|
version
|
|
};
|
|
let signedUploadUrl;
|
|
try {
|
|
const response = yield twirpClient.CreateCacheEntry(request);
|
|
if (!response.ok) {
|
|
// Skip the redundant inner warning when the receiver signalled a
|
|
// policy denial: the outer catch arm below will log a single
|
|
// customer-facing warning.
|
|
if (response.message &&
|
|
!response.message.startsWith(CACHE_WRITE_DENIED_PREFIX)) {
|
|
lib_core/* warning */.$e(`Cache reservation failed: ${response.message}`);
|
|
}
|
|
throw new Error(response.message || 'Response was not ok');
|
|
}
|
|
signedUploadUrl = response.signedUploadUrl;
|
|
}
|
|
catch (error) {
|
|
lib_core/* debug */.Yz(`Failed to reserve cache: ${error}`);
|
|
const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : '';
|
|
if (errorMessage.startsWith(CACHE_WRITE_DENIED_PREFIX)) {
|
|
throw new CacheWriteDeniedError(`Unable to reserve cache with key ${key}. More details: ${errorMessage}`);
|
|
}
|
|
throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache.`);
|
|
}
|
|
lib_core/* debug */.Yz(`Attempting to upload cache located at: ${archivePath}`);
|
|
yield saveCache(cacheId, archivePath, signedUploadUrl, options);
|
|
const finalizeRequest = {
|
|
key,
|
|
version,
|
|
sizeBytes: `${archiveFileSize}`
|
|
};
|
|
const finalizeResponse = yield twirpClient.FinalizeCacheEntryUpload(finalizeRequest);
|
|
lib_core/* debug */.Yz(`FinalizeCacheEntryUploadResponse: ${finalizeResponse.ok}`);
|
|
if (!finalizeResponse.ok) {
|
|
if (finalizeResponse.message) {
|
|
throw new FinalizeCacheError(finalizeResponse.message);
|
|
}
|
|
throw new Error(`Unable to finalize cache with key ${key}, another job may be finalizing this cache.`);
|
|
}
|
|
cacheId = parseInt(finalizeResponse.entryId);
|
|
}
|
|
catch (error) {
|
|
const typedError = error;
|
|
if (typedError.name === ValidationError.name) {
|
|
throw error;
|
|
}
|
|
else if (typedError.name === ReserveCacheError.name) {
|
|
lib_core/* info */.pq(`Failed to save: ${typedError.message}`);
|
|
}
|
|
else if (typedError.name === FinalizeCacheError.name) {
|
|
lib_core/* warning */.$e(typedError.message);
|
|
}
|
|
else {
|
|
// Log server errors (5xx) as errors, all other errors as warnings.
|
|
// A write denied by policy (CacheWriteDeniedError) is not an
|
|
// HttpClientError and its name does not match the ReserveCacheError arm,
|
|
// so it falls here and is warned without failing the run.
|
|
if (typedError instanceof lib/* HttpClientError */.Kg &&
|
|
typeof typedError.statusCode === 'number' &&
|
|
typedError.statusCode >= 500) {
|
|
lib_core/* error */.z3(`Failed to save: ${typedError.message}`);
|
|
}
|
|
else {
|
|
lib_core/* warning */.$e(`Failed to save: ${typedError.message}`);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
// Try to delete the archive to save space
|
|
try {
|
|
yield unlinkFile(archivePath);
|
|
}
|
|
catch (error) {
|
|
lib_core/* debug */.Yz(`Failed to delete archive: ${error}`);
|
|
}
|
|
}
|
|
return cacheId;
|
|
});
|
|
}
|
|
//# sourceMappingURL=cache.js.map
|
|
|
|
/***/ }),
|
|
|
|
/***/ 4012:
|
|
/***/ ((module) => {
|
|
|
|
module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.2.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}');
|
|
|
|
/***/ })
|
|
|
|
};
|