UNPKG

3.89 kBJavaScriptView Raw
1var fs = require('fs'),
2 randomstring = require('./randomstring');
3
4
5/**
6 * create unique name file.
7 *
8 * @param {String} template template string for filename.
9 * @param {Function} callback callback function.
10 * @throws {TypeError} cannot use Promise and callback function is not found.
11 * @return {Promise} Promise.
12 */
13function createFile(template, callback) {
14 var filename = randomstring.generate(template);
15
16 // callback is not a Function
17 if (typeof callback !== 'function') {
18 // can use Promise
19 if (typeof Promise === 'function') {
20 // return Promise
21 return new Promise(function(resolve, reject) {
22 createFile(template, function(err, filename) {
23 (err) ? reject(err) : resolve(filename);
24 });
25 });
26 } else {
27 // throw TypeError when cannot use Promise
28 throw new TypeError('callback function required');
29 }
30 }
31
32 fs.open(filename, 'ax+', 384 /*=0600*/, function(err, fd) {
33 if (err) {
34 if (err.code === 'EEXIST') {
35 // FIXME: infinite loop
36 setImmediate(function(tmpl, cb) {
37 createFile(tmpl, cb);
38 }, template, callback);
39
40 return;
41 }
42
43 // filename set to null if throws error
44 filename = null;
45 }
46
47 if (fd) {
48 fs.close(fd, function(err) {
49 callback(err, filename);
50 });
51 } else {
52 callback(err, filename);
53 }
54 });
55}
56
57
58/**
59 * sync version createFile.
60 *
61 * @param {String} template template string for filename.
62 * @throws {Error} error of fs.openSync or fs.closeSync.
63 * @return {String} created filename.
64 */
65function createFileSync(template) {
66 var isExist, filename, fd;
67
68 // FIXME: infinite loop
69 do {
70 isExist = false;
71 filename = randomstring.generate(template);
72 try {
73 fd = fs.openSync(filename, 'ax+', 384 /*=0600*/);
74 } catch (e) {
75 if (e.code === 'EEXIST') {
76 isExist = true;
77 } else {
78 throw e;
79 }
80 } finally {
81 fd && fs.closeSync(fd);
82 }
83 } while (isExist);
84
85 return filename;
86}
87
88
89/**
90 * create unique name dir.
91 *
92 * @param {String} template template string for dirname.
93 * @param {Function} callback callback function.
94 * @throws {TypeError} cannot use Promise and callback function is not found.
95 * @return {Promise} Promise.
96 */
97function createDir(template, callback) {
98 var dirname = randomstring.generate(template);
99
100 // callback is not a Function
101 if (typeof callback !== 'function') {
102 // can use Promise
103 if (typeof Promise === 'function') {
104 // return Promise
105 return new Promise(function(resolve, reject) {
106 createDir(template, function(err, dirname) {
107 (err) ? reject(err) : resolve(dirname);
108 });
109 });
110 } else {
111 // throw TypeError when cannot use Promise
112 throw new TypeError('callback function required');
113 }
114 }
115
116 fs.mkdir(dirname, 448 /*=0700*/, function(err) {
117 if (err) {
118 if (err.code === 'EEXIST') {
119 // FIXME: infinite loop
120 setImmediate(function(tmpl, cb) {
121 createDir(tmpl, cb);
122 }, template, callback);
123
124 return;
125 }
126
127 // dirname set to null if throws error
128 dirname = null;
129 }
130
131 callback(err, dirname);
132 });
133}
134
135
136/**
137 * sync version createDir.
138 *
139 * @param {String} template template string for dirname.
140 * @return {String} created dirname.
141 */
142function createDirSync(template) {
143 var isExist, dirname;
144
145 // FIXME: infinite loop
146 do {
147 isExist = false;
148 dirname = randomstring.generate(template);
149 try {
150 fs.mkdirSync(dirname, 448 /*=0700*/);
151 } catch (e) {
152 if (e.code === 'EEXIST') {
153 isExist = true;
154 } else {
155 throw e;
156 }
157 }
158 } while (isExist);
159
160 return dirname;
161}
162
163
164/**
165 * export.
166 */
167module.exports = {
168 createFile: createFile,
169 createFileSync: createFileSync,
170 createDir: createDir,
171 createDirSync: createDirSync
172};