Skip to content

Commit

Permalink
Add promise iterators
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladimir Privezenov committed Jun 8, 2023
1 parent 02fa42a commit c6704ae
Show file tree
Hide file tree
Showing 9 changed files with 455 additions and 33 deletions.
1 change: 1 addition & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ jobs:
node-qunit-puppeteer tests/word/merge-documents/mergeDocuments.html
node-qunit-puppeteer tests/word/shortcuts/shortcuts.html
node-qunit-puppeteer tests/slide/shortcuts/shortcuts.html
node-qunit-puppeteer tests/common/promise-iterators/promiseIterator.html
builder-tests:
runs-on: ubuntu-latest
steps:
Expand Down
48 changes: 15 additions & 33 deletions common/ExternalDataLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,45 +83,27 @@
};
CExternalDataLoader.prototype.resolveUpdateData = function (arrData)
{
const oThis = this;
arrData = arrData || [];
let nLength = Math.max(arrData.length, this.externalReferences.length);
let nCounter = 0;
const arrValues = [];

function getNext(oValue)
{
arrValues.push(oValue);
nCounter += 1;

if (nCounter < nLength)
{
resolvePromise();
}
else
{
oThis.fCallback(arrValues);
}
}

function resolvePromise()
const nLength = Math.max(arrData.length, this.externalReferences.length);
const arrFPromiseGetters = [];
for (let i = 0; i < nLength; i += 1)
{
if (oThis.isLocalDesktop || (arrData[nCounter] && (!arrData[nCounter]["error"] || oThis.externalReferences[nCounter].isExternalLink())))
if (this.isLocalDesktop || (arrData[i] && (!arrData[i]["error"] || this.externalReferences[i].isExternalLink())))
{
const oPromiseGetter = new CExternalDataPromiseGetter(oThis.api, oThis.getExternalReference(nCounter), arrData[nCounter]);
const oPromise = oPromiseGetter.getPromise();
oPromise.then(getNext);
const oPromiseGetter = new CExternalDataPromiseGetter(this.api, this.getExternalReference(i), arrData[i]);
arrFPromiseGetters.push(oPromiseGetter.getPromise.bind(oPromiseGetter));
}
}

if (nCounter < nLength)
{
resolvePromise();
}
else
this.doUpdate(arrFPromiseGetters);
};
CExternalDataLoader.prototype.doUpdate = function (arrFPromiseGetters)
{
const oThis = this;
const oPromiseGetterIterator = new AscCommon.CPromiseGetterIterator(arrFPromiseGetters);
oPromiseGetterIterator.forAllSuccessValues(function (arrValues)
{
this.fCallback(arrValues);
}
oThis.fCallback(arrValues);
});
};
CExternalDataLoader.prototype.getExternalReference = function (nId)
{
Expand Down
119 changes: 119 additions & 0 deletions common/PromiseIterators.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/

"use strict";

(function (window)
{

function CPromiseIteratorBase()
{
}
CPromiseIteratorBase.prototype.getPromise = function (nIndex)
{

};
CPromiseIteratorBase.prototype.forEachValue = function (fSuccess, fReject, fAfterAll)
{
let nIndex = 0;
const oThis = this;

const resolveIndexPromise = function()
{
const oPromise = oThis.getPromise(nIndex);
if (oPromise)
{
oPromise.then(function (oValue)
{
nIndex += 1;
fSuccess && fSuccess(oValue);
resolveIndexPromise();
}, function (reason)
{
nIndex += 1;
fReject && fReject(reason);
resolveIndexPromise();
});
}
else
{
fAfterAll && fAfterAll();
}
};
resolveIndexPromise();
};
CPromiseIteratorBase.prototype.forAllSuccessValues = function (fCallback)
{
const arrValues = [];
const fAfterAll = function ()
{
fCallback(arrValues);
}
this.forEachValue(function (oValue)
{
arrValues.push(oValue);
}, undefined, fAfterAll);
};

function CPromiseIterator(arrPromises)
{
CPromiseIteratorBase.call(this);
this.promises = arrPromises;
}
AscFormat.InitClassWithoutType(CPromiseIterator, CPromiseIteratorBase);

CPromiseIterator.prototype.getPromise = function (nIndex)
{
return this.promises[nIndex];
};

function CPromiseGetterIterator(arrFPromiseGetters)
{
CPromiseIteratorBase.call(this);
this.promiseGetters = arrFPromiseGetters;
}
AscFormat.InitClassWithoutType(CPromiseGetterIterator, CPromiseIteratorBase);

CPromiseGetterIterator.prototype.getPromise = function (nIndex)
{
const fPromiseGetter = this.promiseGetters[nIndex];
if (fPromiseGetter)
{
return fPromiseGetter();
}
};

AscCommon = window.AscCommon = window.AscCommon || {};
AscCommon.CPromiseGetterIterator = CPromiseGetterIterator;
AscCommon.CPromiseIterator = CPromiseIterator;

})(window);
1 change: 1 addition & 0 deletions configs/cell.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"common/Drawings/DrawingObjectsHandlers.js",
"common/Drawings/TextDrawer.js",

"common/PromiseIterators.js",
"common/ExternalDataLoader.js",

"common/Drawings/Externals.js",
Expand Down
1 change: 1 addition & 0 deletions configs/slide.json
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@
"common/Drawings/DrawingObjectsHandlers.js",
"common/Drawings/TextDrawer.js",

"common/PromiseIterators.js",
"common/ExternalDataLoader.js",

"common/Drawings/Externals.js",
Expand Down
1 change: 1 addition & 0 deletions configs/word.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@
"common/Drawings/DrawingObjectsHandlers.js",
"common/Drawings/TextDrawer.js",

"common/PromiseIterators.js",
"common/ExternalDataLoader.js",

"common/Drawings/Externals.js",
Expand Down
30 changes: 30 additions & 0 deletions tests/common/promise-iterators/promiseIterator.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Promise iterators test</title>

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/qunit/2.16.0/qunit.css" rel="stylesheet" media="screen" />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/qunit/2.16.0/qunit.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.min.js"></script>

<script type="text/javascript" src="../../../develop/sdkjs/cell/scripts.js"></script>
<script type="text/javascript">
window.sdk_scripts.forEach(function(item){
document.write('<script type="text/javascript" src="' + item + '"><\/script>');
});
</script>

<script type="text/javascript" src="promiseIterator.js"></script>
</head>
<body>
<h1 id="qunit-header">Test the promise iterators</h1>
<h2 id="qunit-banner"></h2>
<div id="qunit-testrunner-toolbar"></div>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
<div id="qunit-fixture">test markup, will be hidden</div>
</body>
</html>
Loading

0 comments on commit c6704ae

Please sign in to comment.