UNPKG

@hashgraph/sdk

Version:
3 lines (2 loc) 5.4 kB
import t from"../Hbar.js";import n,{TRANSACTION_REGISTRY as s}from"../transaction/Transaction.js";import{encode as e}from"../encoding/utf8.js";import i from"./FileId.js";import r from"../transaction/TransactionId.js";import a from"../Timestamp.js";import h from"../transaction/List.js";import o from"../account/AccountId.js";class c extends n{constructor(n={}){super(),this._fileId=null,this._contents=null,this._maxChunks=20,this._chunkSize=4096,this._chunkInterval=10,this._defaultMaxTransactionFee=new t(5),null!=n.fileId&&this.setFileId(n.fileId),null!=n.contents&&this.setContents(n.contents),null!=n.maxChunks&&this.setMaxChunks(n.maxChunks),null!=n.chunkSize&&this.setChunkSize(n.chunkSize),null!=n.chunkInterval&&this.setChunkInterval(n.chunkInterval),this._transactionIds=new h}static _fromProtobuf(t,s,e,r,a){const h=a[0].fileAppend;let o;const u=r.length>0?r.length:1;for(let t=0;t<a.length;t+=u){const n=a[t].fileAppend;if(null==n.contents)break;if(null==o){o=new Uint8Array(n.contents);continue}const s=new Uint8Array(o.length+n.contents.length);s.set(o,0),s.set(n.contents,o.length),o=s}const l=h.contents?.length||void 0,d=a.length?a.length/u:void 0;let _;if(e.length>1){const t=e[0].validStart,n=e[1].validStart;t&&n&&(_=n.nanos.sub(t.nanos).toNumber())}return n._fromProtobufTransactions(new c({fileId:null!=h.fileID?i._fromProtobuf(h.fileID):void 0,contents:o,chunkSize:l,maxChunks:d,chunkInterval:_}),t,s,e,r,a)}get fileId(){return this._fileId}setFileId(t){return this._requireNotFrozen(),this._fileId="string"==typeof t?i.fromString(t):t.clone(),this}getRequiredChunks(){if(null==this._contents)return 1;return Math.ceil(this._contents.length/this._chunkSize)}get contents(){return this._contents}setContents(t){return this._requireNotFrozen(),this._contents=t instanceof Uint8Array?t:e(t),this}get maxChunks(){return this._maxChunks}setMaxChunks(t){if(t<=0)throw new Error("Max chunks must be greater than 0");return this._requireNotFrozen(),this._maxChunks=t,this}get chunkSize(){return this._chunkSize}setChunkSize(t){if(t<=0)throw new Error("Chunk size must be greater than 0");return this._chunkSize=t,this}get chunkInterval(){return this._chunkInterval}setChunkInterval(t){return this._chunkInterval=t,this}freezeWith(t){if(super.freezeWith(t),null==this._contents)return this;let n=this._getTransactionId();this._transactionIds.locked=!1,this._transactions.clear(),this._transactionIds.clear(),this._signedTransactions.clear();for(let t=0;t<this.getRequiredChunks();t++){this._transactionIds.push(n),this._transactionIds.advance();for(const t of this._nodeAccountIds.list)this._signedTransactions.push(this._makeSignedTransaction(t));n=new r(n.accountId,new a(n.validStart.seconds,n.validStart.nanos.add(this._chunkInterval)))}return this._transactionIds.advance(),this._transactionIds.setLocked(),this}schedule(){if(this._requireNotFrozen(),null!=this._contents&&this._contents.length>this._chunkSize)throw new Error(`cannot schedule \`FileAppendTransaction\` with message over ${this._chunkSize} bytes`);return super.schedule()}async execute(t,n){return(await this.executeAll(t,n))[0]}async executeAll(t,n){if(this.maxChunks&&this.getRequiredChunks()>this.maxChunks)throw new Error(`cannot execute \`FileAppendTransaction\` with more than ${this.maxChunks} chunks`);super._isFrozen()||this.freezeWith(t);const s=this._getTransactionId(),e=t.operatorAccountId;null!=e&&e.equals(s.accountId)&&await super.signWithOperator(t);const i=[];let r=n;for(let n=0;n<this._transactionIds.length;n++){const n=Date.now(),s=await super.execute(t,r);null!=r&&(r=Date.now()-n),await s.getReceipt(t),i.push(s)}return i}_validateChecksums(t){null!=this._fileId&&this._fileId.validateChecksum(t)}_execute(t,n){return t.file.appendContent(n)}_getTransactionDataCase(){return"fileAppend"}_buildIncompleteTransactions(){const t=o.fromString("0.0.0"),n=this.transactionId?.accountId||t,s=this.transactionId?.validStart||a.fromDate(new Date);if(this.maxChunks&&this.getRequiredChunks()>this.maxChunks)throw new Error(`cannot build \`FileAppendTransaction\` with more than ${this.maxChunks} chunks`);this._transactionIds.locked=!1,this._transactions.clear(),this._transactionIds.clear(),this._signedTransactions.clear();for(let t=0;t<this.getRequiredChunks();t++){let e=r.withValidStart(n,s.plusNanos(this._chunkInterval*t));if(this._transactionIds.push(e),this._transactionIds.advance(),0===this._nodeAccountIds.list.length)this._transactions.push(this._makeSignedTransaction(null));else for(const t of this._nodeAccountIds.list)this._transactions.push(this._makeSignedTransaction(t))}this._transactionIds.advance(),this._transactionIds.setLocked()}_buildAllTransactions(){if(this.maxChunks&&this.getRequiredChunks()>this.maxChunks)throw new Error(`cannot build \`FileAppendTransaction\` with more than ${this.maxChunks} chunks`);for(let t=0;t<this._signedTransactions.length;t++)this._buildTransaction(t)}_getLogId(){return`FileAppendTransaction:${this._transactionIds.current.validStart.toString()}`}_makeTransactionData(){const t=null!=this._contents?this._contents.length:0,n=this._transactionIds.index*this._chunkSize,s=Math.min(n+this._chunkSize,t);return{fileID:null!=this._fileId?this._fileId._toProtobuf():null,contents:null!=this._contents?this._contents.slice(n,s):null}}}s.set("fileAppend",c._fromProtobuf);export{c as default}; //# sourceMappingURL=FileAppendTransaction.js.map