Skip to content
Permalink
Newer
Older
100644 121 lines (94 sloc) 3.97 KB
Ignoring revisions in .git-blame-ignore-revs.
1
'use strict';
2
3
var GetIntrinsic = require('get-intrinsic');
4
5
var $TypeError = GetIntrinsic('%TypeError%');
6
7
var AsyncFromSyncIteratorContinuation = require('./AsyncFromSyncIteratorContinuation');
8
var Call = require('./Call');
9
var CreateIterResultObject = require('./CreateIterResultObject');
10
var Get = require('./Get');
11
var GetMethod = require('./GetMethod');
12
var IteratorNext = require('./IteratorNext');
13
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
14
var Type = require('./Type');
15
16
var SLOT = require('internal-slot');
17
18
var assertRecord = require('../helpers/assertRecord');
19
20
var $AsyncFromSyncIteratorPrototype = GetIntrinsic('%AsyncFromSyncIteratorPrototype%', true) || {
21
next: function next(value) {
22
var O = this; // step 1
23
24
SLOT.assert(O, '[[SyncIteratorRecord]]'); // step 2
25
26
var argsLength = arguments.length;
27
28
return new Promise(function (resolve) { // step 3
29
var syncIteratorRecord = SLOT.get(O, '[[SyncIteratorRecord]]'); // step 4
30
var result;
31
if (argsLength > 0) {
32
result = IteratorNext(syncIteratorRecord, value); // step 5.a
33
} else { // step 6
34
result = IteratorNext(syncIteratorRecord);// step 6.a
35
}
36
resolve(AsyncFromSyncIteratorContinuation(result)); // step 8
37
});
38
},
39
'return': function () {
40
var O = this; // step 1
41
42
SLOT.assert(O, '[[SyncIteratorRecord]]'); // step 2
43
44
var valueIsPresent = arguments.length > 0;
45
var value = valueIsPresent ? arguments[0] : void undefined;
46
47
return new Promise(function (resolve, reject) { // step 3
48
var syncIterator = SLOT.get(O, '[[SyncIteratorRecord]]')['[[Iterator]]']; // step 4
49
var iteratorReturn = GetMethod(syncIterator, 'return'); // step 5
50
51
if (typeof iteratorReturn === 'undefined') { // step 7
52
var iterResult = CreateIterResultObject(value, true); // step 7.a
53
Call(resolve, undefined, [iterResult]); // step 7.b
54
return;
55
}
56
var result;
57
if (valueIsPresent) { // step 8
58
result = Call(iteratorReturn, syncIterator, [value]); // step 8.a
59
} else { // step 9
60
result = Call(iteratorReturn, syncIterator); // step 9.a
61
}
62
if (Type(result) !== 'Object') { // step 11
63
Call(reject, undefined, [new $TypeError('Iterator `return` method returned a non-object value.')]); // step 11.a
64
return;
65
}
66
67
resolve(AsyncFromSyncIteratorContinuation(result)); // step 12
68
});
69
},
70
'throw': function () {
71
var O = this; // step 1
72
73
SLOT.assert(O, '[[SyncIteratorRecord]]'); // step 2
74
75
var valueIsPresent = arguments.length > 0;
76
var value = valueIsPresent ? arguments[0] : void undefined;
77
78
return new Promise(function (resolve, reject) { // step 3
79
var syncIterator = SLOT.get(O, '[[SyncIteratorRecord]]')['[[Iterator]]']; // step 4
80
81
var throwMethod = GetMethod(syncIterator, 'throw'); // step 5
82
83
if (typeof throwMethod === 'undefined') { // step 7
84
Call(reject, undefined, [value]); // step 7.a
85
return;
86
}
87
88
var result;
89
if (valueIsPresent) { // step 8
90
result = Call(throwMethod, syncIterator, [value]); // step 8.a
91
} else { // step 9
92
result = Call(throwMethod, syncIterator); // step 9.a
93
}
94
if (Type(result) !== 'Object') { // step 11
95
Call(reject, undefined, [new $TypeError('Iterator `throw` method returned a non-object value.')]); // step 11.a
96
return;
97
}
98
99
resolve(AsyncFromSyncIteratorContinuation(result/* , promiseCapability */)); // step 12
100
});
101
}
102
};
103
104
// https://262.ecma-international.org/14.0/#sec-createasyncfromsynciterator
105
106
module.exports = function CreateAsyncFromSyncIterator(syncIteratorRecord) {
107
assertRecord(Type, 'Iterator Record', 'syncIteratorRecord', syncIteratorRecord);
108
109
// var asyncIterator = OrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] »); // step 1
110
var asyncIterator = OrdinaryObjectCreate($AsyncFromSyncIteratorPrototype);
111
112
SLOT.set(asyncIterator, '[[SyncIteratorRecord]]', syncIteratorRecord); // step 2
113
114
var nextMethod = Get(asyncIterator, 'next'); // step 3
115
116
return { // steps 3-4
117
'[[Iterator]]': asyncIterator,
118
'[[NextMethod]]': nextMethod,
119
'[[Done]]': false
120
};
121
};