All files / src/file-system-module/operations/append-file append-file-operation.function.ts

15% Statements 3/20
0% Branches 0/3
0% Functions 0/4
15% Lines 3/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51            5x 5x                   5x                                                                  
/**
 * Exports append file operation function.
 *
 * @module
 */
import type { ReleaseLock } from '@agogpixel/pgmmv-resource-support/src/locks/release-lock.type';
import { getStringByteLength } from '@agogpixel/pgmmv-resource-support/src/string/get-string-byte-length.function';
import { pollWithBackoff } from '@agogpixel/pgmmv-resource-support/src/time/poll-with-backoff.function';
 
import type { AppendFileOperationPayload } from './append-file-operation-payload.interface';
 
/**
 * Append file operation.
 *
 * @param payload Operation payload.
 * @param releaseLock Release lock callback.
 */
export function appendFileOperation(payload: AppendFileOperationPayload, releaseLock: ReleaseLock) {
  const path = payload.path;
  const data = payload.data;
  const callback = payload.callback;
 
  const oldFileContent = jsb.fileUtils.getStringFromFile(path);
  const newFileContent = `${oldFileContent ? oldFileContent + '\n' : ''}${data}`;
  const newFileSize = getStringByteLength(newFileContent);
 
  function conditional() {
    return newFileSize === jsb.fileUtils.getFileSize(path);
  }
 
  function onProceed() {
    releaseLock();
    callback(true);
  }
 
  function onTimeout(elapsed: number) {
    releaseLock();
    callback(false, `Append operation to '${path}' timed out after ${elapsed / 1000}s`);
  }
 
  const result = jsb.fileUtils.writeStringToFile(newFileContent, path);
 
  Iif (!result) {
    releaseLock();
    callback(false, `Append operation to '${path}' failed immediately`);
    return;
  }
 
  pollWithBackoff(conditional, onProceed, onTimeout, 1000, 5);
}