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

13.04% Statements 3/23
0% Branches 0/3
0% Functions 0/5
13.04% Lines 3/23

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 52 53 54 55 56 57 58 59 60            5x 5x                   5x                                                                                    
/**
 * Exports write 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 { WriteFileOperationPayload } from './write-file-operation-payload.interface';
 
/**
 * Write file operation.
 *
 * @param payload Operation payload.
 * @param releaseLock Release lock callback.
 */
export function writeFileOperation(payload: WriteFileOperationPayload, releaseLock: ReleaseLock) {
  const path = payload.path;
  const data = payload.data;
  const callback = payload.callback;
 
  const fileSize = jsb.fileUtils.getFileSize(path);
  const dataSize = getStringByteLength(data);
 
  let conditional: () => boolean;
 
  if (fileSize !== dataSize) {
    // Poll file size change.
    conditional = function conditional() {
      return dataSize === jsb.fileUtils.getFileSize(path);
    };
  } else {
    // Poll file content change.
    conditional = function conditional() {
      return data === jsb.fileUtils.getStringFromFile(path);
    };
  }
 
  function onProceed() {
    releaseLock();
    callback(true);
  }
 
  function onTimeout(elapsed: number) {
    releaseLock();
    callback(false, `Write operation to '${path}' timed out after ${elapsed / 1000}s`);
  }
 
  const result = jsb.fileUtils.writeStringToFile(data, path);
 
  Iif (!result) {
    releaseLock();
    callback(false, `Write operation to '${path}' failed immediately`);
    return;
  }
 
  pollWithBackoff(conditional, onProceed, onTimeout, 1000, 5);
}