Permalink
January 18, 2023 20:26
Newer
100644
68 lines (56 sloc)
1.81 KB
Ignoring revisions in .git-blame-ignore-revs.
1
'use strict';
2
3
var GetIntrinsic = require('get-intrinsic');
4
5
var $SyntaxError = GetIntrinsic('%SyntaxError%');
6
var $TypeError = GetIntrinsic('%TypeError%');
7
var $Promise = GetIntrinsic('%Promise%', true);
8
9
var Call = require('./Call');
10
var CompletionRecord = require('./CompletionRecord');
11
var GetMethod = require('./GetMethod');
12
var Type = require('./Type');
13
14
var assertRecord = require('../helpers/assertRecord');
15
16
var callBound = require('call-bind/callBound');
17
18
var $then = callBound('Promise.prototype.then', true);
19
20
// https://262.ecma-international.org/12.0/#sec-asynciteratorclose
21
22
module.exports = function AsyncIteratorClose(iteratorRecord, completion) {
23
assertRecord(Type, 'Iterator Record', 'iteratorRecord', iteratorRecord); // step 1
24
25
if (!(completion instanceof CompletionRecord)) {
26
throw new $TypeError('Assertion failed: completion is not a Completion Record instance'); // step 2
27
}
28
29
if (!$then) {
30
throw new $SyntaxError('This environment does not support Promises.');
31
}
32
33
var iterator = iteratorRecord['[[Iterator]]']; // step 3
34
35
return $then(
36
$then(
37
$then(
38
new $Promise(function (resolve) {
39
resolve(GetMethod(iterator, 'return')); // step 4
40
// resolve(Call(ret, iterator, [])); // step 6
41
}),
42
function (returnV) { // step 5.a
43
if (typeof returnV === 'undefined') {
44
return completion; // step 5.b
45
}
46
return Call(returnV, iterator); // step 5.c, 5.d.
47
}
48
),
49
null,
50
function (e) {
51
if (completion.type() === 'throw') {
52
completion['?'](); // step 6
53
} else {
54
throw e; // step 7
55
}
56
}
57
),
58
function (innerResult) { // step 8
59
if (completion.type() === 'throw') {
60
completion['?'](); // step 6
61
}
62
if (Type(innerResult) !== 'Object') {
63
throw new $TypeError('`innerResult` must be an Object'); // step 10
64
}
65
return completion;
66
}
67
);
68
};