js-dos 8.1.4 → 8.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +1 -1
  2. package/dist/emulators/emulators.js +2 -0
  3. package/dist/emulators/emulators.js.map +1 -0
  4. package/dist/emulators/types/build.d.ts +28 -0
  5. package/dist/emulators/types/dos/bundle/dos-bundle.d.ts +20 -0
  6. package/dist/emulators/types/dos/dosbox/ts/direct.d.ts +3 -0
  7. package/dist/emulators/types/dos/dosbox/ts/worker.d.ts +3 -0
  8. package/dist/emulators/types/emulators.d.ts +76 -0
  9. package/dist/emulators/types/http.d.ts +9 -0
  10. package/dist/emulators/types/impl/ci-impl.d.ts +29 -0
  11. package/dist/emulators/types/impl/emulators-impl.d.ts +26 -0
  12. package/dist/emulators/types/impl/modules.d.ts +38 -0
  13. package/dist/emulators/types/libzip/libzip.d.ts +16 -0
  14. package/dist/emulators/types/protocol/messages-queue.d.ts +8 -0
  15. package/dist/emulators/types/protocol/protocol.d.ts +128 -0
  16. package/dist/emulators/wdosbox-x.js +55 -0
  17. package/dist/emulators/wdosbox-x.js.symbols +8760 -0
  18. package/dist/emulators/wdosbox-x.wasm +0 -0
  19. package/dist/emulators/wdosbox.js +55 -0
  20. package/dist/emulators/wdosbox.js.symbols +3001 -0
  21. package/dist/emulators/wdosbox.wasm +0 -0
  22. package/dist/emulators/wlibzip.js +21 -0
  23. package/dist/emulators/wlibzip.js.symbols +268 -0
  24. package/dist/emulators/wlibzip.wasm +0 -0
  25. package/dist/js-dos.css +1 -0
  26. package/dist/js-dos.js +22 -0
  27. package/dist/js-dos.js.map +1 -0
  28. package/package.json +1 -1
  29. package/release.zip +0 -0
  30. package/.eslintrc.json +0 -43
  31. package/.github/workflows/build.yml +0 -51
  32. package/.gitmodules +0 -4
  33. package/index.html +0 -110
  34. package/postcss.config.cjs +0 -8
  35. package/src/app.css +0 -14
  36. package/src/base.css +0 -10
  37. package/src/components/checkbox.tsx +0 -41
  38. package/src/components/close-button.tsx +0 -17
  39. package/src/components/components.css +0 -28
  40. package/src/components/dos-option-checkbox.tsx +0 -94
  41. package/src/components/dos-option-select.tsx +0 -108
  42. package/src/components/dos-option-slider.tsx +0 -35
  43. package/src/components/error.tsx +0 -16
  44. package/src/components/loading.tsx +0 -26
  45. package/src/components/lock.tsx +0 -10
  46. package/src/components/select.tsx +0 -33
  47. package/src/components/slider.tsx +0 -69
  48. package/src/download-file.ts +0 -18
  49. package/src/frame/account-frame.tsx +0 -156
  50. package/src/frame/editor/defaults.ts +0 -419
  51. package/src/frame/editor/editor-conf-frame.tsx +0 -227
  52. package/src/frame/editor/editor-frame.css +0 -55
  53. package/src/frame/editor/editor-fs-frame.tsx +0 -314
  54. package/src/frame/fat-drives-frame.tsx +0 -199
  55. package/src/frame/frame.css +0 -119
  56. package/src/frame/frame.tsx +0 -34
  57. package/src/frame/image-rendering-frame.tsx +0 -8
  58. package/src/frame/network-frame.tsx +0 -157
  59. package/src/frame/quick-save-frame.tsx +0 -98
  60. package/src/frame/settings-frame.tsx +0 -14
  61. package/src/frame/stats-frame.tsx +0 -87
  62. package/src/host/bundle-storage.ts +0 -91
  63. package/src/host/fullscreen.ts +0 -35
  64. package/src/host/lcache.ts +0 -203
  65. package/src/host/lstorage.ts +0 -156
  66. package/src/i18n.ts +0 -185
  67. package/src/index.css +0 -7
  68. package/src/load.ts +0 -132
  69. package/src/login/login.css +0 -9
  70. package/src/login/login.tsx +0 -77
  71. package/src/main.tsx +0 -197
  72. package/src/public/types.ts +0 -45
  73. package/src/sidebar/account-button.tsx +0 -33
  74. package/src/sidebar/cloud-save-button.tsx +0 -89
  75. package/src/sidebar/diskette-icon.tsx +0 -14
  76. package/src/sidebar/fullscreen-button.tsx +0 -44
  77. package/src/sidebar/network-button.tsx +0 -39
  78. package/src/sidebar/sidebar-button.tsx +0 -244
  79. package/src/sidebar/sidebar.css +0 -47
  80. package/src/sidebar/sidebar.tsx +0 -30
  81. package/src/sockdrive/LICENSE +0 -674
  82. package/src/sockdrive/README.md +0 -45
  83. package/src/sockdrive/include/sockdrive.h +0 -23
  84. package/src/sockdrive/js/.eslintrc.json +0 -43
  85. package/src/sockdrive/js/package.json +0 -29
  86. package/src/sockdrive/js/src/fatfs/chains.js +0 -318
  87. package/src/sockdrive/js/src/fatfs/dir.js +0 -385
  88. package/src/sockdrive/js/src/fatfs/helpers.js +0 -210
  89. package/src/sockdrive/js/src/fatfs/index.js +0 -606
  90. package/src/sockdrive/js/src/fatfs/structs.js +0 -255
  91. package/src/sockdrive/js/src/fatfs/vol.js +0 -166
  92. package/src/sockdrive/js/src/sockdrive/cache.ts +0 -56
  93. package/src/sockdrive/js/src/sockdrive/drive.ts +0 -471
  94. package/src/sockdrive/js/src/sockdrive/lru.ts +0 -221
  95. package/src/sockdrive/js/src/sockdrive/types.ts +0 -14
  96. package/src/sockdrive/js/src/sockdrive-fat.d.ts +0 -64
  97. package/src/sockdrive/js/src/sockdrive-fat.ts +0 -226
  98. package/src/sockdrive/js/src/sockdrive-native.ts +0 -100
  99. package/src/sockdrive/js/src/test/test.ts +0 -289
  100. package/src/sockdrive/js/tsconfig.json +0 -11
  101. package/src/sockdrive/js/webpack.config.js +0 -68
  102. package/src/sockdrive/js/yarn.lock +0 -1808
  103. package/src/store/auth.ts +0 -115
  104. package/src/store/dos.ts +0 -305
  105. package/src/store/editor.ts +0 -61
  106. package/src/store/init.ts +0 -48
  107. package/src/store/storage.ts +0 -32
  108. package/src/store/ui.ts +0 -191
  109. package/src/store.tsx +0 -116
  110. package/src/ui.tsx +0 -140
  111. package/src/v8/changes.ts +0 -56
  112. package/src/v8/config.ts +0 -20
  113. package/src/v8/subscriptions.ts +0 -62
  114. package/src/vite-env.d.ts +0 -5
  115. package/src/window/dos/controls/keyboard.ts +0 -32
  116. package/src/window/dos/controls/keys.ts +0 -331
  117. package/src/window/dos/controls/mouse/mount.ts +0 -99
  118. package/src/window/dos/controls/mouse/mouse-locked.ts +0 -51
  119. package/src/window/dos/controls/mouse/mouse-not-locked.ts +0 -84
  120. package/src/window/dos/controls/mouse/mouse-swipe.ts +0 -57
  121. package/src/window/dos/controls/mouse/pointer.ts +0 -85
  122. package/src/window/dos/controls/mouse.ts +0 -21
  123. package/src/window/dos/dos-dhry2.tsx +0 -191
  124. package/src/window/dos/dos-runtime.tsx +0 -216
  125. package/src/window/dos/dos-window.tsx +0 -91
  126. package/src/window/dos/render/canvas.ts +0 -65
  127. package/src/window/dos/render/resize.ts +0 -31
  128. package/src/window/dos/render/webgl.ts +0 -173
  129. package/src/window/dos/sound/audio-node.ts +0 -148
  130. package/src/window/error-window.tsx +0 -9
  131. package/src/window/loading-window.tsx +0 -54
  132. package/src/window/prerun-window.tsx +0 -121
  133. package/src/window/select-window.tsx +0 -118
  134. package/src/window/window.css +0 -78
  135. package/src/window/window.tsx +0 -49
  136. package/src/ws/ws-sockdrive.ts +0 -123
  137. package/src/ws/ws-transport-layer.ts +0 -468
  138. package/tailwind.config.cjs +0 -48
  139. package/tsconfig.json +0 -32
  140. package/tsconfig.node.json +0 -9
  141. package/vite.config.ts +0 -25
@@ -1,45 +0,0 @@
1
- # sockdrive client api sdk
2
-
3
- # js
4
-
5
- Plain js api ready to use in browser.
6
-
7
- Building:
8
-
9
- ```js
10
- cd js
11
- yarn
12
- yarn run webpack
13
- ```
14
-
15
- Js api is in `js/dist/sockdriveFat.js`. The api is node-like fs api.
16
-
17
- Testing:
18
-
19
- 1. Install dosfstools
20
- 2. cd js/dist/test && make-img-linux.sh
21
- 3. Serve dist folder
22
- 4. Open test.html in browser to run tests.
23
-
24
- ## 3rdparty code
25
-
26
- ### LRU cache
27
-
28
- `src/sockdrive/lru.js` is from https://github.com/rsms/js-lru
29
- Licensed under MIT. Copyright (c) 2010 Rasmus Andersson <http://hunch.se/>
30
-
31
- ### fatfs (fork)
32
-
33
- `src/fatfs` is a fork of https://github.com/natevw/fatfs
34
-
35
- License information:
36
-
37
- ```
38
- © 2014 Nathan Vander Wilt.
39
- Funding for this work was provided by Technical Machine, Inc.
40
-
41
- Reuse under your choice of:
42
-
43
- * BSD-2-Clause
44
- * Apache 2.0
45
- ```
@@ -1,23 +0,0 @@
1
- //
2
- // Created by caiii on 30.08.2023.
3
- //
4
-
5
- #ifndef SOCKDRIVE_H
6
- #define SOCKDRIVE_H
7
-
8
- #include <stddef.h>
9
- #include <stdint.h>
10
-
11
- extern "C" {
12
- size_t sockdrive_open(const char* url, const char* owner, const char* name, const char* token);
13
- uint8_t sockdrive_read(size_t handle, uint32_t sector, uint8_t * buffer);
14
- uint8_t sockdrive_write(size_t handle, uint32_t sector, uint8_t* buffer);
15
- uint32_t sockdrive_size(size_t handle);
16
- uint32_t sockdrive_heads(size_t handle);
17
- uint32_t sockdrive_sectors(size_t handle);
18
- uint32_t sockdrive_cylinders(size_t handle);
19
- uint32_t sockdrive_sector_size(size_t handle);
20
- void sockdrive_close(size_t handle);
21
- }
22
-
23
- #endif //SOCKDRIVE_H
@@ -1,43 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "es2021": true
5
- },
6
- "extends": [
7
- "google"
8
- ],
9
- "parser": "@typescript-eslint/parser",
10
- "parserOptions": {
11
- "ecmaVersion": 12,
12
- "sourceType": "module"
13
- },
14
- "plugins": [
15
- "@typescript-eslint"
16
- ],
17
- "rules": {
18
- "object-curly-spacing": [
19
- "error",
20
- "always"
21
- ],
22
- "require-jsdoc": "off",
23
- "quotes": [
24
- "error",
25
- "double"
26
- ],
27
- "indent": [
28
- "error",
29
- 4,
30
- {
31
- "SwitchCase": 1,
32
- "FunctionDeclaration": {
33
- "parameters": "first"
34
- }
35
- }
36
- ],
37
- "max-len": [
38
- "error",
39
- 120
40
- ]
41
- },
42
- "ignorePatterns": ["dist/**/*"]
43
- }
@@ -1,29 +0,0 @@
1
- {
2
- "name": "sockdrive-asyncify",
3
- "version": "1.0.0",
4
- "description": "The sockdrive support for emscripten",
5
- "license": "GPLv3",
6
- "private": true,
7
- "dependencies": {
8
- "buffer": "^6.0.3",
9
- "fifolock": "^1.0.0",
10
- "stream-browserify": "^3.0.0",
11
- "struct-fu": "^1.2.1",
12
- "typedarray-to-buffer": "^4.0.0",
13
- "xok": "^1.0.0"
14
- },
15
- "devDependencies": {
16
- "@types/chai": "^4.3.6",
17
- "@types/mocha": "^10.0.1",
18
- "@typescript-eslint/eslint-plugin": "^6.7.2",
19
- "@typescript-eslint/parser": "^6.7.2",
20
- "eslint": "^8.48.0",
21
- "eslint-config-google": "^0.14.0",
22
- "eslint-webpack-plugin": "^4.0.1",
23
- "process": "^0.11.10",
24
- "ts-loader": "^9.4.4",
25
- "typescript": "^5.2.2",
26
- "webpack": "^5.88.2",
27
- "webpack-cli": "^5.1.4"
28
- }
29
- }
@@ -1,318 +0,0 @@
1
- const S = require("./structs.js");
2
- const _ = require("./helpers.js");
3
-
4
- function _baseChain(vol) {
5
- const chain = {};
6
-
7
- chain.sectorSize = vol._sectorSize;
8
-
9
- function posFromOffset(off) {
10
- const secSize = chain.sectorSize;
11
- const offset = off % secSize;
12
- const sector = (off - offset) / secSize;
13
- return { sector: sector, offset: offset };
14
- }
15
-
16
- chain.cacheAdvice = "NORMAL";
17
- chain._vol_readSectors = vol._readSectors.bind(vol);
18
- chain._vol_writeSectors = vol._writeSectors.bind(vol);
19
-
20
- // cb(error, bytesRead, buffer)
21
- chain.readFromPosition = function(targetPos, buffer, cb) {
22
- if (typeof targetPos === "number") targetPos = posFromOffset(targetPos);
23
- if (typeof buffer === "number") buffer = _.allocBuffer(buffer);
24
- /* NOTE: to keep our contract with the volume driver, we need to read on _full_ sector boundaries!
25
- So we divide the read into [up to] three parts: {preface, main, trailer}
26
- This is kind of unfortunate, but in practice should often still be reasonably efficient. */
27
- if (targetPos.offset) {
28
- chain.readSectors(targetPos.sector, _.allocBuffer(chain.sectorSize), function(e, d) {
29
- if (e || !d) cb(e, 0, buffer);
30
- else { // copy preface into `buffer`
31
- const dBeg = targetPos.offset;
32
- const dEnd = dBeg + buffer.length;
33
- d.copy(buffer, 0, dBeg, dEnd);
34
- if (dEnd > d.length) readMain();
35
- else cb(null, buffer.length, buffer);
36
- }
37
- });
38
- } else readMain();
39
- function readMain() {
40
- const prefaceLen = targetPos.offset && (chain.sectorSize - targetPos.offset);
41
- const trailerLen = (buffer.length - prefaceLen) % chain.sectorSize;
42
- const mainSector = (prefaceLen) ? targetPos.sector + 1 : targetPos.sector;
43
- const mainBuffer = (trailerLen) ? buffer.slice(prefaceLen, -trailerLen) : buffer.slice(prefaceLen);
44
- if (mainBuffer.length) {
45
- chain.readSectors(mainSector, mainBuffer, function(e, d) {
46
- if (e || !d) cb(e, prefaceLen, buffer);
47
- else if (!trailerLen) cb(null, buffer.length, buffer);
48
- else readTrailer();
49
- });
50
- } else readTrailer();
51
- function readTrailer() {
52
- const trailerSector = mainSector + (mainBuffer.length / chain.sectorSize);
53
- chain.readSectors(trailerSector, _.allocBuffer(chain.sectorSize), function(e, d) {
54
- if (e || !d) cb(e, buffer.length-trailerLen, buffer);
55
- else {
56
- d.copy(buffer, buffer.length-trailerLen, 0, trailerLen);
57
- cb(null, buffer.length, buffer);
58
- }
59
- });
60
- }
61
- }
62
- };
63
-
64
- // cb(error)
65
- chain.writeToPosition = function(targetPos, data, cb) {
66
- _.log(_.log.DBG, "WRITING", data.length, "bytes at", targetPos, "in", this.toJSON(), data);
67
- if (typeof targetPos === "number") targetPos = posFromOffset(targetPos);
68
-
69
- const prefaceBuffer = (targetPos.offset) ? data.slice(0, chain.sectorSize-targetPos.offset) : null;
70
- if (prefaceBuffer) {
71
- _modifySector(targetPos.sector, targetPos.offset, prefaceBuffer, function(e) {
72
- if (e) cb(e);
73
- else if (prefaceBuffer.length < data.length) writeMain();
74
- else cb();
75
- });
76
- } else writeMain();
77
- function writeMain() {
78
- const prefaceLen = (prefaceBuffer) ? prefaceBuffer.length : 0;
79
- const trailerLen = (data.length - prefaceLen) % chain.sectorSize;
80
- const mainSector = (prefaceLen) ? targetPos.sector + 1 : targetPos.sector;
81
- const mainBuffer = (trailerLen) ? data.slice(prefaceLen, -trailerLen) : data.slice(prefaceLen);
82
- if (mainBuffer.length) {
83
- chain.writeSectors(mainSector, mainBuffer, function(e) {
84
- if (e) cb(e);
85
- else if (!trailerLen) cb();
86
- else writeTrailer();
87
- });
88
- } else writeTrailer();
89
- function writeTrailer() {
90
- const trailerSector = mainSector + (mainBuffer.length / chain.sectorSize);
91
- const trailerBuffer = data.slice(data.length-trailerLen); // WORKAROUND: https://github.com/tessel/runtime/issues/721
92
- _modifySector(trailerSector, 0, trailerBuffer, cb);
93
- }
94
- }
95
- function _modifySector(sec, off, data, cb) {
96
- chain.readSectors(sec, _.allocBuffer(chain.sectorSize), function(e, orig) {
97
- if (e) return cb(e);
98
- orig || (orig = _.allocBuffer(chain.sectorSize, 0));
99
- data.copy(orig, off);
100
- chain.writeSectors(sec, orig, cb);
101
- });
102
- }
103
- };
104
-
105
- return chain;
106
- };
107
-
108
-
109
- exports.clusterChain = function(vol, firstCluster, _parent) {
110
- const chain = _baseChain(vol);
111
- const cache = [firstCluster];
112
-
113
- chain.firstCluster = firstCluster;
114
-
115
- function _cacheIsComplete() {
116
- return cache[cache.length-1] === "eof";
117
- }
118
-
119
- function extendCacheToInclude(i, cb) { // NOTE: may `cb()` before returning!
120
- if (i < cache.length) cb(null, cache[i]);
121
- else if (_cacheIsComplete()) cb(null, "eof");
122
- else {
123
- vol.fetchFromFAT(cache[cache.length-1], function(e, d) {
124
- if (e) cb(e);
125
- else if (typeof d === "string" && d !== "eof") cb(S.err.IO());
126
- else {
127
- cache.push(d);
128
- extendCacheToInclude(i, cb);
129
- }
130
- });
131
- }
132
- }
133
-
134
- function expandChainToLength(clusterCount, cb) {
135
- if (!_cacheIsComplete()) throw Error("Must be called only when cache is complete!");
136
- else cache.pop(); // remove 'eof' entry until finished
137
-
138
- function addCluster(clustersNeeded, lastCluster) {
139
- if (!clustersNeeded) cache.push("eof"), cb();
140
- else {
141
- vol.allocateInFAT(lastCluster, function(e, newCluster) {
142
- if (e) cb(e);
143
- else {
144
- vol.storeToFAT(lastCluster, newCluster, function(e) {
145
- if (e) return cb(e);
146
-
147
- cache.push(newCluster);
148
- addCluster(clustersNeeded-1, newCluster);
149
- });
150
- }
151
- });
152
- }
153
- }
154
- addCluster(clusterCount - cache.length, cache[cache.length - 1]);
155
- }
156
-
157
- function shrinkChainToLength(clusterCount, cb) {
158
- if (!_cacheIsComplete()) throw Error("Must be called only when cache is complete!");
159
- else cache.pop(); // remove 'eof' entry until finished
160
-
161
- function removeClusters(count, cb) {
162
- if (!count) cache.push("eof"), cb();
163
- else {
164
- vol.storeToFAT(cache.pop(), "free", function(e) {
165
- if (e) cb(e);
166
- else removeClusters(count - 1, cb);
167
- });
168
- }
169
- }
170
- // NOTE: for now, we don't remove the firstCluster ourselves; we should though!
171
- if (clusterCount) removeClusters(cache.length - clusterCount, cb);
172
- else removeClusters(cache.length - 1, cb);
173
- }
174
-
175
- // [{firstSector,numSectors},{firstSector,numSectors},…]
176
- function determineSectorGroups(sectorIdx, numSectors, alloc, cb) {
177
- let sectorOffset = sectorIdx % vol._sectorsPerCluster;
178
- const clusterIdx = (sectorIdx - sectorOffset) / vol._sectorsPerCluster;
179
- const numClusters = Math.ceil((numSectors + sectorOffset) / vol._sectorsPerCluster);
180
- const chainLength = clusterIdx + numClusters;
181
- extendCacheToInclude(chainLength-1, function(e, c) {
182
- if (e) cb(e);
183
- else if (c === "eof" && alloc) {
184
- expandChainToLength(chainLength, function(e) {
185
- if (e) cb(e);
186
- else _determineSectorGroups();
187
- });
188
- } else _determineSectorGroups();
189
- });
190
- function _determineSectorGroups() {
191
- // …now we have a complete cache
192
- const groups = [];
193
- let _group = null;
194
- for (var i = clusterIdx; i < chainLength; ++i) {
195
- const c = (i < cache.length) ? cache[i] : "eof";
196
- if (c === "eof") break;
197
- else if (_group && c !== _group._nextCluster) {
198
- groups.push(_group);
199
- _group = null;
200
- }
201
- if (!_group) {
202
- _group = {
203
- _nextCluster: c+1,
204
- firstSector: vol._firstSectorOfCluster(c) + sectorOffset,
205
- numSectors: vol._sectorsPerCluster - sectorOffset,
206
- };
207
- } else {
208
- _group._nextCluster += 1;
209
- _group.numSectors += vol._sectorsPerCluster;
210
- }
211
- sectorOffset = 0; // only first group is offset
212
- }
213
- if (_group) groups.push(_group);
214
- cb(null, groups, i === chainLength);
215
- }
216
- }
217
-
218
- chain.readSectors = function(i, dest, cb) {
219
- let groupOffset = 0; let groupsPending;
220
- determineSectorGroups(i, dest.length / chain.sectorSize, false, function(e, groups, complete) {
221
- if (e) cb(e);
222
- else if (!complete) groupsPending = -1, _pastEOF(cb);
223
- else if ((groupsPending = groups.length)) {
224
- const process = (group) => new Promise((resolve) => {
225
- const groupLength = group.numSectors * chain.sectorSize;
226
- const groupBuffer = dest.slice(groupOffset, groupOffset += groupLength);
227
- chain._vol_readSectors(group.firstSector, groupBuffer, function(e, d) {
228
- if (e && groupsPending !== -1) groupsPending = -1, cb(e);
229
- else if (--groupsPending === 0) cb(null, dest);
230
- resolve();
231
- });
232
- });
233
-
234
- (async () => {
235
- for (const group of groups) {
236
- await process(group);
237
- }
238
- })().catch((e) => cb(e));
239
- } else cb(null, dest); // 0-length destination case
240
- });
241
- };
242
-
243
- // TODO: does this handle NOSPC condition?
244
- chain.writeSectors = function(i, data, cb) {
245
- let groupOffset = 0; let groupsPending;
246
- determineSectorGroups(i, data.length / chain.sectorSize, true, function(e, groups) {
247
- if (e) cb(e);
248
- else if ((groupsPending = groups.length)) {
249
- const process = (group) => new Promise((resolve) => {
250
- const groupLength = group.numSectors * chain.sectorSize;
251
- const groupBuffer = data.slice(groupOffset, groupOffset += groupLength);
252
- chain._vol_writeSectors(group.firstSector, groupBuffer, function(e) {
253
- if (e && groupsPending !== -1) groupsPending = -1, cb(e);
254
- else if (--groupsPending === 0) cb();
255
- resolve();
256
- });
257
- });
258
-
259
- (async () => {
260
- for (const group of groups) {
261
- await process(group);
262
- }
263
- })().catch((e) => cb(e));
264
- } else cb(); // 0-length data case
265
- });
266
- };
267
-
268
- chain.truncate = function(numSectors, cb) {
269
- extendCacheToInclude(Infinity, function(e, c) {
270
- if (e) return cb(e);
271
-
272
- const currentLength = cache.length-1;
273
- const clustersNeeded = Math.ceil(numSectors / vol._sectorsPerCluster);
274
- if (clustersNeeded < currentLength) shrinkChainToLength(clustersNeeded, cb);
275
- else if (clustersNeeded > currentLength) expandChainToLength(clustersNeeded, cb);
276
- else cb();
277
- });
278
- };
279
-
280
-
281
- chain.toJSON = function() {
282
- return { firstCluster: firstCluster };
283
- };
284
-
285
- return chain;
286
- };
287
-
288
- exports.sectorChain = function(vol, firstSector, numSectors) {
289
- const chain = _baseChain(vol);
290
-
291
- chain.firstSector = firstSector;
292
- chain.numSectors = numSectors;
293
-
294
- chain.readSectors = function(i, dest, cb) {
295
- if (i < numSectors) chain._vol_readSectors(firstSector+i, dest, cb);
296
- else _pastEOF(cb);
297
- };
298
-
299
- chain.writeSectors = function(i, data, cb) {
300
- if (i < numSectors) chain._vol_writeSectors(firstSector+i, data, cb);
301
- else _.delayedCall(cb, S.err.NOSPC());
302
- };
303
-
304
- chain.truncate = function(i, cb) {
305
- _.delayedCall(cb, S.err.INVAL());
306
- };
307
-
308
- chain.toJSON = function() {
309
- return { firstSector: firstSector, numSectors: numSectors };
310
- };
311
-
312
- return chain;
313
- };
314
-
315
- // NOTE: used with mixed feelings, broken out to mark uses
316
- function _pastEOF(cb) {
317
- _.delayedCall(cb, null, null);
318
- }