# all files / red/runtime/storage/localfilesystem/ util.js

85.37% Statements 35/41
83.33% Branches 10/12
90% Functions 9/10
85.37% Lines 35/41

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98

    1×
    1×
    1×

    1×

    1×
    15×
    1×

    15×

    1×
    11×
    11×
    11×
    8×
    2×
    2×
    2×
    1×

    1×
    1×
    1×

    1×

    1×

    1×

    6×
    6×

    3×
    2×

    3×

    1×

    45×
    45×
    45×
    45×
    45×

    45×

     /**
     * Copyright JS Foundation and other contributors, http://js.foundation
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     **/

    var fs = require('fs-extra');
    var when = require('when');
    var nodeFn = require('when/node/function');

    var log = require("../../log");

    function parseJSON(data) {
        if (data.charCodeAt(0) === 0xFEFF) {
            data = data.slice(1)
        }
        return JSON.parse(data);
    }
    function readFile(path,backupPath,emptyResponse,type) {
        return when.promise(function(resolve) {
            fs.readFile(path,'utf8',function(err,data) {
                if (!err) {
                    if (data.length === 0) {
                        log.warn(log._("storage.localfilesystem.empty",{type:type}));
                        try {
                            var backupStat = fs.statSync(backupPath);
                            Iif (backupStat.size === 0) {
                                // Empty flows, empty backup - return empty flow
                                return resolve(emptyResponse);
                            }
                            // Empty flows, restore backup
                            log.warn(log._("storage.localfilesystem.restore",{path:backupPath,type:type}));
                            fs.copy(backupPath,path,function(backupCopyErr) {
                                Iif (backupCopyErr) {
                                    // Restore backup failed
                                    log.warn(log._("storage.localfilesystem.restore-fail",{message:backupCopyErr.toString(),type:type}));
                                    resolve([]);
                                } else {
                                    // Loop back in to load the restored backup
                                    resolve(readFile(path,backupPath,emptyResponse,type));
                                }
                            });
                            return;
                        } catch(backupStatErr) {
                            // Empty flow file, no back-up file
                            return resolve(emptyResponse);
                        }
                    }
                    try {
                        return resolve(parseJSON(data));
                    } catch(parseErr) {
                        log.warn(log._("storage.localfilesystem.invalid",{type:type}));
                        return resolve(emptyResponse);
                    }
                } else {
                    if (type === 'flow') {
                        log.info(log._("storage.localfilesystem.create",{type:type}));
                    }
                    resolve(emptyResponse);
                }
            });
        });
    }

    module.exports = {
        /**
         * Write content to a file using UTF8 encoding.
         * This forces a fsync before completing to ensure
         * the write hits disk.
         */
        writeFile: function(path,content) {
            return when.promise(function(resolve,reject) {
                var stream = fs.createWriteStream(path);
                stream.on('open',function(fd) {
                    stream.end(content,'utf8',function() {
                        fs.fsync(fd,resolve);
                    });
                });
                stream.on('error',function(err) {
                    reject(err);
                });
            });
        },
        readFile: readFile,

        parseJSON: parseJSON
    }