* Asserts that all pad data is consistent. Throws if inconsistent.
()
| 900 | * Asserts that all pad data is consistent. Throws if inconsistent. |
| 901 | */ |
| 902 | async check() { |
| 903 | assert(this.id != null); |
| 904 | assert.equal(typeof this.id, 'string'); |
| 905 | |
| 906 | const head = this.getHeadRevisionNumber(); |
| 907 | assert(head != null); |
| 908 | assert(Number.isInteger(head)); |
| 909 | assert(head >= -1); |
| 910 | |
| 911 | const savedRevisionsList = this.getSavedRevisionsList(); |
| 912 | assert(Array.isArray(savedRevisionsList)); |
| 913 | assert.equal(this.getSavedRevisionsNumber(), savedRevisionsList.length); |
| 914 | let prevSavedRev = null; |
| 915 | for (const rev of savedRevisionsList) { |
| 916 | assert(rev != null); |
| 917 | assert(Number.isInteger(rev)); |
| 918 | assert(rev >= 0); |
| 919 | assert(rev <= head); |
| 920 | assert(prevSavedRev == null || rev > prevSavedRev); |
| 921 | prevSavedRev = rev; |
| 922 | } |
| 923 | const savedRevisions = this.getSavedRevisions(); |
| 924 | assert(Array.isArray(savedRevisions)); |
| 925 | assert.equal(savedRevisions.length, savedRevisionsList.length); |
| 926 | const savedRevisionsIds = new Set(); |
| 927 | for (const savedRev of savedRevisions) { |
| 928 | assert(savedRev != null); |
| 929 | assert.equal(typeof savedRev, 'object'); |
| 930 | assert(savedRevisionsList.includes(savedRev.revNum)); |
| 931 | assert(savedRev.id != null); |
| 932 | assert.equal(typeof savedRev.id, 'string'); |
| 933 | assert(!savedRevisionsIds.has(savedRev.id)); |
| 934 | savedRevisionsIds.add(savedRev.id); |
| 935 | } |
| 936 | |
| 937 | const pool = this.apool(); |
| 938 | assert(pool instanceof AttributePool); |
| 939 | await pool.check(); |
| 940 | |
| 941 | const authorIds = new Set(); |
| 942 | pool.eachAttrib((k, v) => { |
| 943 | if (k === 'author' && v) authorIds.add(v); |
| 944 | }); |
| 945 | const revs = Stream.range(0, head + 1) |
| 946 | .map(async (r: number) => { |
| 947 | const isKeyRev = r === this.getKeyRevisionNumber(r); |
| 948 | try { |
| 949 | return await Promise.all([ |
| 950 | r, |
| 951 | this.getRevisionChangeset(r), |
| 952 | this.getRevisionAuthor(r), |
| 953 | this.getRevisionDate(r), |
| 954 | isKeyRev, |
| 955 | isKeyRev ? this._getKeyRevisionAText(r) : null, |
| 956 | ]); |
| 957 | } catch (err:any) { |
| 958 | err.message = `(pad ${this.id} revision ${r}) ${err.message}`; |
| 959 | throw err; |