├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── lib ├── messages.js └── stat.js ├── package.json └── schemas └── hyperdrive.proto /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Andrew Osheroff 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hyperdrive-schemas 2 | Protobuf schemas for the Hyperdrive API. 3 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const p = require('path') 2 | 3 | const API_VERSION = 0 4 | 5 | module.exports = { 6 | hyperdriveSchemaPath: p.join(__dirname, 'schemas', 'hyperdrive.proto'), 7 | messages: require('./lib/messages'), 8 | Stat: require('./lib/stat'), 9 | version: API_VERSION 10 | } 11 | -------------------------------------------------------------------------------- /lib/messages.js: -------------------------------------------------------------------------------- 1 | // This file is auto generated by the protocol-buffers compiler 2 | 3 | /* eslint-disable quotes */ 4 | /* eslint-disable indent */ 5 | /* eslint-disable no-redeclare */ 6 | /* eslint-disable camelcase */ 7 | 8 | // Remember to `npm install --save protocol-buffers-encodings` 9 | var encodings = require('protocol-buffers-encodings') 10 | var varint = encodings.varint 11 | var skip = encodings.skip 12 | 13 | var Index = exports.Index = { 14 | buffer: true, 15 | encodingLength: null, 16 | encode: null, 17 | decode: null 18 | } 19 | 20 | var Mount = exports.Mount = { 21 | buffer: true, 22 | encodingLength: null, 23 | encode: null, 24 | decode: null 25 | } 26 | 27 | var Stat = exports.Stat = { 28 | buffer: true, 29 | encodingLength: null, 30 | encode: null, 31 | decode: null 32 | } 33 | 34 | var Map_string_bytes = exports.Map_string_bytes = { 35 | buffer: true, 36 | encodingLength: null, 37 | encode: null, 38 | decode: null 39 | } 40 | 41 | defineIndex() 42 | defineMount() 43 | defineStat() 44 | defineMap_string_bytes() 45 | 46 | function defineIndex () { 47 | var enc = [ 48 | encodings.string, 49 | encodings.bytes 50 | ] 51 | 52 | Index.encodingLength = encodingLength 53 | Index.encode = encode 54 | Index.decode = decode 55 | 56 | function encodingLength (obj) { 57 | var length = 0 58 | if (!defined(obj.type)) throw new Error("type is required") 59 | var len = enc[0].encodingLength(obj.type) 60 | length += 1 + len 61 | if (defined(obj.content)) { 62 | var len = enc[1].encodingLength(obj.content) 63 | length += 1 + len 64 | } 65 | return length 66 | } 67 | 68 | function encode (obj, buf, offset) { 69 | if (!offset) offset = 0 70 | if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) 71 | var oldOffset = offset 72 | if (!defined(obj.type)) throw new Error("type is required") 73 | buf[offset++] = 10 74 | enc[0].encode(obj.type, buf, offset) 75 | offset += enc[0].encode.bytes 76 | if (defined(obj.content)) { 77 | buf[offset++] = 18 78 | enc[1].encode(obj.content, buf, offset) 79 | offset += enc[1].encode.bytes 80 | } 81 | encode.bytes = offset - oldOffset 82 | return buf 83 | } 84 | 85 | function decode (buf, offset, end) { 86 | if (!offset) offset = 0 87 | if (!end) end = buf.length 88 | if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") 89 | var oldOffset = offset 90 | var obj = { 91 | type: "", 92 | content: null 93 | } 94 | var found0 = false 95 | while (true) { 96 | if (end <= offset) { 97 | if (!found0) throw new Error("Decoded message is not valid") 98 | decode.bytes = offset - oldOffset 99 | return obj 100 | } 101 | var prefix = varint.decode(buf, offset) 102 | offset += varint.decode.bytes 103 | var tag = prefix >> 3 104 | switch (tag) { 105 | case 1: 106 | obj.type = enc[0].decode(buf, offset) 107 | offset += enc[0].decode.bytes 108 | found0 = true 109 | break 110 | case 2: 111 | obj.content = enc[1].decode(buf, offset) 112 | offset += enc[1].decode.bytes 113 | break 114 | default: 115 | offset = skip(prefix & 7, buf, offset) 116 | } 117 | } 118 | } 119 | } 120 | 121 | function defineMount () { 122 | var enc = [ 123 | encodings.bytes, 124 | encodings.varint, 125 | encodings.bool 126 | ] 127 | 128 | Mount.encodingLength = encodingLength 129 | Mount.encode = encode 130 | Mount.decode = decode 131 | 132 | function encodingLength (obj) { 133 | var length = 0 134 | if (!defined(obj.key)) throw new Error("key is required") 135 | var len = enc[0].encodingLength(obj.key) 136 | length += 1 + len 137 | if (defined(obj.version)) { 138 | var len = enc[1].encodingLength(obj.version) 139 | length += 1 + len 140 | } 141 | if (defined(obj.hash)) { 142 | var len = enc[0].encodingLength(obj.hash) 143 | length += 1 + len 144 | } 145 | if (defined(obj.hypercore)) { 146 | var len = enc[2].encodingLength(obj.hypercore) 147 | length += 1 + len 148 | } 149 | return length 150 | } 151 | 152 | function encode (obj, buf, offset) { 153 | if (!offset) offset = 0 154 | if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) 155 | var oldOffset = offset 156 | if (!defined(obj.key)) throw new Error("key is required") 157 | buf[offset++] = 10 158 | enc[0].encode(obj.key, buf, offset) 159 | offset += enc[0].encode.bytes 160 | if (defined(obj.version)) { 161 | buf[offset++] = 16 162 | enc[1].encode(obj.version, buf, offset) 163 | offset += enc[1].encode.bytes 164 | } 165 | if (defined(obj.hash)) { 166 | buf[offset++] = 26 167 | enc[0].encode(obj.hash, buf, offset) 168 | offset += enc[0].encode.bytes 169 | } 170 | if (defined(obj.hypercore)) { 171 | buf[offset++] = 32 172 | enc[2].encode(obj.hypercore, buf, offset) 173 | offset += enc[2].encode.bytes 174 | } 175 | encode.bytes = offset - oldOffset 176 | return buf 177 | } 178 | 179 | function decode (buf, offset, end) { 180 | if (!offset) offset = 0 181 | if (!end) end = buf.length 182 | if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") 183 | var oldOffset = offset 184 | var obj = { 185 | key: null, 186 | version: 0, 187 | hash: null, 188 | hypercore: false 189 | } 190 | var found0 = false 191 | while (true) { 192 | if (end <= offset) { 193 | if (!found0) throw new Error("Decoded message is not valid") 194 | decode.bytes = offset - oldOffset 195 | return obj 196 | } 197 | var prefix = varint.decode(buf, offset) 198 | offset += varint.decode.bytes 199 | var tag = prefix >> 3 200 | switch (tag) { 201 | case 1: 202 | obj.key = enc[0].decode(buf, offset) 203 | offset += enc[0].decode.bytes 204 | found0 = true 205 | break 206 | case 2: 207 | obj.version = enc[1].decode(buf, offset) 208 | offset += enc[1].decode.bytes 209 | break 210 | case 3: 211 | obj.hash = enc[0].decode(buf, offset) 212 | offset += enc[0].decode.bytes 213 | break 214 | case 4: 215 | obj.hypercore = enc[2].decode(buf, offset) 216 | offset += enc[2].decode.bytes 217 | break 218 | default: 219 | offset = skip(prefix & 7, buf, offset) 220 | } 221 | } 222 | } 223 | } 224 | 225 | function defineStat () { 226 | var enc = [ 227 | encodings.varint, 228 | encodings.string, 229 | Mount, 230 | Map_string_bytes 231 | ] 232 | 233 | Stat.encodingLength = encodingLength 234 | Stat.encode = encode 235 | Stat.decode = decode 236 | 237 | function encodingLength (obj) { 238 | var length = 0 239 | if (!defined(obj.mode)) throw new Error("mode is required") 240 | var len = enc[0].encodingLength(obj.mode) 241 | length += 1 + len 242 | if (defined(obj.uid)) { 243 | var len = enc[0].encodingLength(obj.uid) 244 | length += 1 + len 245 | } 246 | if (defined(obj.gid)) { 247 | var len = enc[0].encodingLength(obj.gid) 248 | length += 1 + len 249 | } 250 | if (defined(obj.size)) { 251 | var len = enc[0].encodingLength(obj.size) 252 | length += 1 + len 253 | } 254 | if (defined(obj.blocks)) { 255 | var len = enc[0].encodingLength(obj.blocks) 256 | length += 1 + len 257 | } 258 | if (defined(obj.offset)) { 259 | var len = enc[0].encodingLength(obj.offset) 260 | length += 1 + len 261 | } 262 | if (defined(obj.byteOffset)) { 263 | var len = enc[0].encodingLength(obj.byteOffset) 264 | length += 1 + len 265 | } 266 | if (defined(obj.mtime)) { 267 | var len = enc[0].encodingLength(obj.mtime) 268 | length += 1 + len 269 | } 270 | if (defined(obj.ctime)) { 271 | var len = enc[0].encodingLength(obj.ctime) 272 | length += 1 + len 273 | } 274 | if (defined(obj.linkname)) { 275 | var len = enc[1].encodingLength(obj.linkname) 276 | length += 1 + len 277 | } 278 | if (defined(obj.mount)) { 279 | var len = enc[2].encodingLength(obj.mount) 280 | length += varint.encodingLength(len) 281 | length += 1 + len 282 | } 283 | if (defined(obj.metadata)) { 284 | var tmp = Object.keys(obj.metadata) 285 | for (var i = 0; i < tmp.length; i++) { 286 | tmp[i] = {key: tmp[i], value: obj.metadata[tmp[i]]} 287 | } 288 | for (var i = 0; i < tmp.length; i++) { 289 | if (!defined(tmp[i])) continue 290 | var len = enc[3].encodingLength(tmp[i]) 291 | length += varint.encodingLength(len) 292 | length += 1 + len 293 | } 294 | } 295 | return length 296 | } 297 | 298 | function encode (obj, buf, offset) { 299 | if (!offset) offset = 0 300 | if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) 301 | var oldOffset = offset 302 | if (!defined(obj.mode)) throw new Error("mode is required") 303 | buf[offset++] = 8 304 | enc[0].encode(obj.mode, buf, offset) 305 | offset += enc[0].encode.bytes 306 | if (defined(obj.uid)) { 307 | buf[offset++] = 16 308 | enc[0].encode(obj.uid, buf, offset) 309 | offset += enc[0].encode.bytes 310 | } 311 | if (defined(obj.gid)) { 312 | buf[offset++] = 24 313 | enc[0].encode(obj.gid, buf, offset) 314 | offset += enc[0].encode.bytes 315 | } 316 | if (defined(obj.size)) { 317 | buf[offset++] = 32 318 | enc[0].encode(obj.size, buf, offset) 319 | offset += enc[0].encode.bytes 320 | } 321 | if (defined(obj.blocks)) { 322 | buf[offset++] = 40 323 | enc[0].encode(obj.blocks, buf, offset) 324 | offset += enc[0].encode.bytes 325 | } 326 | if (defined(obj.offset)) { 327 | buf[offset++] = 48 328 | enc[0].encode(obj.offset, buf, offset) 329 | offset += enc[0].encode.bytes 330 | } 331 | if (defined(obj.byteOffset)) { 332 | buf[offset++] = 56 333 | enc[0].encode(obj.byteOffset, buf, offset) 334 | offset += enc[0].encode.bytes 335 | } 336 | if (defined(obj.mtime)) { 337 | buf[offset++] = 64 338 | enc[0].encode(obj.mtime, buf, offset) 339 | offset += enc[0].encode.bytes 340 | } 341 | if (defined(obj.ctime)) { 342 | buf[offset++] = 72 343 | enc[0].encode(obj.ctime, buf, offset) 344 | offset += enc[0].encode.bytes 345 | } 346 | if (defined(obj.linkname)) { 347 | buf[offset++] = 82 348 | enc[1].encode(obj.linkname, buf, offset) 349 | offset += enc[1].encode.bytes 350 | } 351 | if (defined(obj.mount)) { 352 | buf[offset++] = 90 353 | varint.encode(enc[2].encodingLength(obj.mount), buf, offset) 354 | offset += varint.encode.bytes 355 | enc[2].encode(obj.mount, buf, offset) 356 | offset += enc[2].encode.bytes 357 | } 358 | if (defined(obj.metadata)) { 359 | var tmp = Object.keys(obj.metadata) 360 | for (var i = 0; i < tmp.length; i++) { 361 | tmp[i] = {key: tmp[i], value: obj.metadata[tmp[i]]} 362 | } 363 | for (var i = 0; i < tmp.length; i++) { 364 | if (!defined(tmp[i])) continue 365 | buf[offset++] = 98 366 | varint.encode(enc[3].encodingLength(tmp[i]), buf, offset) 367 | offset += varint.encode.bytes 368 | enc[3].encode(tmp[i], buf, offset) 369 | offset += enc[3].encode.bytes 370 | } 371 | } 372 | encode.bytes = offset - oldOffset 373 | return buf 374 | } 375 | 376 | function decode (buf, offset, end) { 377 | if (!offset) offset = 0 378 | if (!end) end = buf.length 379 | if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") 380 | var oldOffset = offset 381 | var obj = { 382 | mode: 0, 383 | uid: 0, 384 | gid: 0, 385 | size: 0, 386 | blocks: 0, 387 | offset: 0, 388 | byteOffset: 0, 389 | mtime: 0, 390 | ctime: 0, 391 | linkname: "", 392 | mount: null, 393 | metadata: {} 394 | } 395 | var found0 = false 396 | while (true) { 397 | if (end <= offset) { 398 | if (!found0) throw new Error("Decoded message is not valid") 399 | decode.bytes = offset - oldOffset 400 | return obj 401 | } 402 | var prefix = varint.decode(buf, offset) 403 | offset += varint.decode.bytes 404 | var tag = prefix >> 3 405 | switch (tag) { 406 | case 1: 407 | obj.mode = enc[0].decode(buf, offset) 408 | offset += enc[0].decode.bytes 409 | found0 = true 410 | break 411 | case 2: 412 | obj.uid = enc[0].decode(buf, offset) 413 | offset += enc[0].decode.bytes 414 | break 415 | case 3: 416 | obj.gid = enc[0].decode(buf, offset) 417 | offset += enc[0].decode.bytes 418 | break 419 | case 4: 420 | obj.size = enc[0].decode(buf, offset) 421 | offset += enc[0].decode.bytes 422 | break 423 | case 5: 424 | obj.blocks = enc[0].decode(buf, offset) 425 | offset += enc[0].decode.bytes 426 | break 427 | case 6: 428 | obj.offset = enc[0].decode(buf, offset) 429 | offset += enc[0].decode.bytes 430 | break 431 | case 7: 432 | obj.byteOffset = enc[0].decode(buf, offset) 433 | offset += enc[0].decode.bytes 434 | break 435 | case 8: 436 | obj.mtime = enc[0].decode(buf, offset) 437 | offset += enc[0].decode.bytes 438 | break 439 | case 9: 440 | obj.ctime = enc[0].decode(buf, offset) 441 | offset += enc[0].decode.bytes 442 | break 443 | case 10: 444 | obj.linkname = enc[1].decode(buf, offset) 445 | offset += enc[1].decode.bytes 446 | break 447 | case 11: 448 | var len = varint.decode(buf, offset) 449 | offset += varint.decode.bytes 450 | obj.mount = enc[2].decode(buf, offset, offset + len) 451 | offset += enc[2].decode.bytes 452 | break 453 | case 12: 454 | var len = varint.decode(buf, offset) 455 | offset += varint.decode.bytes 456 | var tmp = enc[3].decode(buf, offset, offset + len) 457 | obj.metadata[tmp.key] = tmp.value 458 | offset += enc[3].decode.bytes 459 | break 460 | default: 461 | offset = skip(prefix & 7, buf, offset) 462 | } 463 | } 464 | } 465 | } 466 | 467 | function defineMap_string_bytes () { 468 | var enc = [ 469 | encodings.string, 470 | encodings.bytes 471 | ] 472 | 473 | Map_string_bytes.encodingLength = encodingLength 474 | Map_string_bytes.encode = encode 475 | Map_string_bytes.decode = decode 476 | 477 | function encodingLength (obj) { 478 | var length = 0 479 | if (!defined(obj.key)) throw new Error("key is required") 480 | var len = enc[0].encodingLength(obj.key) 481 | length += 1 + len 482 | if (defined(obj.value)) { 483 | var len = enc[1].encodingLength(obj.value) 484 | length += 1 + len 485 | } 486 | return length 487 | } 488 | 489 | function encode (obj, buf, offset) { 490 | if (!offset) offset = 0 491 | if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) 492 | var oldOffset = offset 493 | if (!defined(obj.key)) throw new Error("key is required") 494 | buf[offset++] = 10 495 | enc[0].encode(obj.key, buf, offset) 496 | offset += enc[0].encode.bytes 497 | if (defined(obj.value)) { 498 | buf[offset++] = 18 499 | enc[1].encode(obj.value, buf, offset) 500 | offset += enc[1].encode.bytes 501 | } 502 | encode.bytes = offset - oldOffset 503 | return buf 504 | } 505 | 506 | function decode (buf, offset, end) { 507 | if (!offset) offset = 0 508 | if (!end) end = buf.length 509 | if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") 510 | var oldOffset = offset 511 | var obj = { 512 | key: "", 513 | value: null 514 | } 515 | var found0 = false 516 | while (true) { 517 | if (end <= offset) { 518 | if (!found0) throw new Error("Decoded message is not valid") 519 | decode.bytes = offset - oldOffset 520 | return obj 521 | } 522 | var prefix = varint.decode(buf, offset) 523 | offset += varint.decode.bytes 524 | var tag = prefix >> 3 525 | switch (tag) { 526 | case 1: 527 | obj.key = enc[0].decode(buf, offset) 528 | offset += enc[0].decode.bytes 529 | found0 = true 530 | break 531 | case 2: 532 | obj.value = enc[1].decode(buf, offset) 533 | offset += enc[1].decode.bytes 534 | break 535 | default: 536 | offset = skip(prefix & 7, buf, offset) 537 | } 538 | } 539 | } 540 | } 541 | 542 | function defined (val) { 543 | return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val)) 544 | } 545 | -------------------------------------------------------------------------------- /lib/stat.js: -------------------------------------------------------------------------------- 1 | const { Stat: StatEncoder } = require('./messages') 2 | 3 | // http://man7.org/linux/man-pages/man2/stat.2.html 4 | var DEFAULT_FMODE = (4 | 2 | 0) << 6 | ((4 | 0 | 0) << 3) | (4 | 0 | 0) // rw-r--r-- 5 | var DEFAULT_DMODE = (4 | 2 | 1) << 6 | ((4 | 0 | 1) << 3) | (4 | 0 | 1) // rwxr-xr-x 6 | 7 | class Stat { 8 | constructor (data) { 9 | this.dev = 0 10 | this.nlink = 1 11 | this.rdev = 0 12 | this.blksize = 0 13 | this.ino = 0 14 | 15 | this.mode = (data && data.mode) || 0 16 | this.uid = (data && data.uid) || 0 17 | this.gid = (data && data.gid) || 0 18 | this.size = (data && data.size) || 0 19 | this.offset = (data && data.offset) || 0 20 | this.byteOffset = (data && data.byteOffset) || 0 21 | this.blocks = (data && data.blocks) || 0 22 | this.atime = data && data.atime ? new Date(data.atime) : new Date() // we just set this to mtime ... 23 | this.mtime = data && data.mtime ? new Date(data.mtime) : new Date() 24 | this.ctime = data && data.ctime ? new Date(data.ctime) : new Date() 25 | this.linkname = (data && data.linkname) || null 26 | this.mount = (data && data.mount) || null 27 | this.metadata = (data && data.metadata) || null 28 | } 29 | 30 | _check (mask) { 31 | return (mask & this.mode) === mask 32 | } 33 | 34 | encode () { 35 | return StatEncoder.encode(this) 36 | } 37 | 38 | isSocket () { 39 | return this._check(Stat.IFSOCK) 40 | } 41 | isSymbolicLink () { 42 | return this._check(Stat.IFLNK) 43 | } 44 | isFile () { 45 | return this._check(Stat.IFREG) 46 | } 47 | isBlockDevice () { 48 | return this._check(Stat.IFBLK) 49 | } 50 | isDirectory () { 51 | return this._check(Stat.IFDIR) 52 | } 53 | isCharacterDevice () { 54 | return this._check(Stat.IFCHR) 55 | } 56 | isFIFO () { 57 | return this._check(Stat.IFIFO) 58 | } 59 | } 60 | 61 | Stat.file = function (data) { 62 | data = data || {} 63 | data.mode = (data.mode || DEFAULT_FMODE) | Stat.IFREG 64 | return new Stat(data) 65 | } 66 | Stat.directory = function (data) { 67 | data = data || {} 68 | data.mode = (data.mode || DEFAULT_DMODE) | Stat.IFDIR 69 | return new Stat(data) 70 | } 71 | Stat.symlink = function (data) { 72 | data = data || {} 73 | data.mode = (data.mode || DEFAULT_FMODE) | Stat.IFLNK 74 | return new Stat(data) 75 | } 76 | 77 | Stat.decode = function (encodedStat) { 78 | const st = StatEncoder.decode(encodedStat) 79 | return new Stat(st) 80 | } 81 | 82 | Stat.IFSOCK = 0b1100 << 12 83 | Stat.IFLNK = 0b1010 << 12 84 | Stat.IFREG = 0b1000 << 12 85 | Stat.IFBLK = 0b0110 << 12 86 | Stat.IFDIR = 0b0100 << 12 87 | Stat.IFCHR = 0b0010 << 12 88 | Stat.IFIFO = 0b0001 << 12 89 | 90 | module.exports = Stat 91 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyperdrive-schemas", 3 | "version": "2.0.0", 4 | "description": "Protobuf schemas for Hyperdrive and its daemon.", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "protocol-buffers schemas/hyperdrive.proto -o lib/messages.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/andrewosh/hyperdrive-schemas.git" 12 | }, 13 | "keywords": [ 14 | "hyperdrive", 15 | "protobuf", 16 | "schema" 17 | ], 18 | "author": "Andrew Osheroff ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/andrewosh/hyperdrive-schemas/issues" 22 | }, 23 | "homepage": "https://github.com/andrewosh/hyperdrive-schemas#readme", 24 | "devDependencies": { 25 | "protocol-buffers": "^4.1.0" 26 | }, 27 | "dependencies": { 28 | "protocol-buffers-encodings": "^1.1.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /schemas/hyperdrive.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Index { 4 | required string type = 1; 5 | optional bytes content = 2; 6 | } 7 | 8 | message Mount { 9 | required bytes key = 1; 10 | optional uint64 version = 2; 11 | optional bytes hash = 3; 12 | optional bool hypercore = 4; 13 | } 14 | 15 | message Stat { 16 | required uint32 mode = 1; 17 | optional uint32 uid = 2; 18 | optional uint32 gid = 3; 19 | optional uint64 size = 4; 20 | optional uint64 blocks = 5; 21 | optional uint64 offset = 6; 22 | optional uint64 byteOffset = 7; 23 | optional uint64 mtime = 8; 24 | optional uint64 ctime = 9; 25 | optional string linkname = 10; 26 | optional Mount mount = 11; 27 | map metadata = 12; 28 | } 29 | --------------------------------------------------------------------------------