(parent, name, input, output)
| 3067 | return node; |
| 3068 | }, |
| 3069 | createDevice(parent, name, input, output) { |
| 3070 | var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); |
| 3071 | var mode = FS_getMode(!!input, !!output); |
| 3072 | if (!FS.createDevice.major) FS.createDevice.major = 64; |
| 3073 | var dev = FS.makedev(FS.createDevice.major++, 0); |
| 3074 | FS.registerDevice(dev, { |
| 3075 | open(stream) { |
| 3076 | stream.seekable = false; |
| 3077 | }, |
| 3078 | close(stream) { |
| 3079 | if (output && output.buffer && output.buffer.length) { |
| 3080 | output(10); |
| 3081 | } |
| 3082 | }, |
| 3083 | read(stream, buffer, offset, length, pos) { |
| 3084 | var bytesRead = 0; |
| 3085 | for (var i = 0; i < length; i++) { |
| 3086 | var result; |
| 3087 | try { |
| 3088 | result = input(); |
| 3089 | } catch (e) { |
| 3090 | throw new FS.ErrnoError(29); |
| 3091 | } |
| 3092 | if (result === undefined && bytesRead === 0) { |
| 3093 | throw new FS.ErrnoError(6); |
| 3094 | } |
| 3095 | if (result === null || result === undefined) break; |
| 3096 | bytesRead++; |
| 3097 | buffer[offset + i] = result; |
| 3098 | } |
| 3099 | if (bytesRead) { |
| 3100 | stream.node.timestamp = Date.now(); |
| 3101 | } |
| 3102 | return bytesRead; |
| 3103 | }, |
| 3104 | write(stream, buffer, offset, length, pos) { |
| 3105 | for (var i = 0; i < length; i++) { |
| 3106 | try { |
| 3107 | output(buffer[offset + i]); |
| 3108 | } catch (e) { |
| 3109 | throw new FS.ErrnoError(29); |
| 3110 | } |
| 3111 | } |
| 3112 | if (length) { |
| 3113 | stream.node.timestamp = Date.now(); |
| 3114 | } |
| 3115 | return i; |
| 3116 | }, |
| 3117 | }); |
| 3118 | return FS.mkdev(path, mode, dev); |
| 3119 | }, |
| 3120 | forceLoadFile(obj) { |
| 3121 | if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; |
| 3122 | if (typeof XMLHttpRequest != 'undefined') { |
nothing calls this directly
no test coverage detected