IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

wb-manifest-worker.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. const rx = /^[a-f0-9]{32}\+[0-9]+/;
  2. const rootDir = {};
  3. const streams = [];
  4. onmessage = function(e) {
  5. switch (e.data[0]) {
  6. case 'precreatePaths':
  7. precreatePaths(e.data[1]);
  8. postMessage([ 'precreatePathsResult' ]);
  9. break;
  10. case 'parseStream':
  11. parseStream(e.data[1]);
  12. postMessage([ 'parseStreamResult' ]);
  13. break;
  14. case 'listDirectory': {
  15. const lst = listDirectory(rootDir, e.data[1], e.data[2]);
  16. postMessage([ 'listDirectoryResult', lst ])
  17. break; }
  18. default:
  19. throw Error('Unknown verb: ' + e.data[0]);
  20. }
  21. }
  22. function precreatePaths(paths) {
  23. for (let i = 0; i < paths.length; i++) {
  24. mkpath(rootDir, paths[i]);
  25. }
  26. }
  27. function parseStream(s) {
  28. if (!s) return;
  29. const tokens = s.split(' ');
  30. const streamName = unescapeName(tokens[0]);
  31. let n = tokens.map(t => rx.exec(t));
  32. n = n.indexOf(null, 1);
  33. let locators = tokens.slice(1, n);
  34. let pos = 0;
  35. locators = locators.map(loc => {
  36. const sz = parseInt(loc.split('+')[1], 10);
  37. return [ loc, pos, pos += sz ];
  38. });
  39. let fileTokens = tokens.slice(n);
  40. let lastFile = null;
  41. let lastPath = null;
  42. fileTokens.map(t => {
  43. let seg = t.split(':');
  44. seg = [ parseInt(seg[0], 10), parseInt(seg[1], 10),
  45. unescapeName(seg.slice(2).join(':')) ]
  46. const path = streamName + '/' + seg[2];
  47. let f;
  48. if (path === lastPath) {
  49. f = lastFile;
  50. } else {
  51. let dirName = path.split('/');
  52. const name = dirName[dirName.length - 1];
  53. dirName = dirName.slice(0, dirName.length - 1);
  54. const d = mkpath(rootDir, dirName);
  55. lastFile = f = makeFile(d, name);
  56. lastPath = path;
  57. }
  58. appendFile(f, streams.length, seg);
  59. });
  60. streams.push(locators);
  61. }
  62. function mkdir(parent, name) {
  63. if (name in parent && (parent[name] instanceof Array))
  64. throw Error('File with the same name already exists');
  65. if (name in parent)
  66. return parent[name];
  67. const dir = {};
  68. parent[name] = dir;
  69. return dir;
  70. }
  71. function mkpath(parent, path) {
  72. if (typeof(path) === 'string')
  73. path = path.split('/');
  74. let dir = parent;
  75. for (let i = 1; i < path.length; i++) {
  76. dir = mkdir(dir, path[i]);
  77. }
  78. return dir;
  79. }
  80. function makeFile(dir, name) {
  81. if (name in dir) {
  82. if (!(dir[name] instanceof Array))
  83. throw Error('Directory with the same name already exists');
  84. return dir[name];
  85. }
  86. const f = [[], 0];
  87. dir[name] = f;
  88. return f;
  89. }
  90. function appendFile(f, sidx, seg) {
  91. f[0].push([ sidx, seg[0], seg[1] ]);
  92. f[1] += seg[1];
  93. return f;
  94. }
  95. function unescapeName(name) {
  96. return name.replace(/(\\\\|\\[0-9]{3})/g,
  97. (_, $1) => ($1 === '\\\\' ? '\\' : String.fromCharCode(parseInt($1.substr(1), 8))));
  98. }
  99. function findDir(parent, path, lenient=false) {
  100. if (typeof(path) === 'string')
  101. path = path.split('/');
  102. if (path[0] !== '.')
  103. throw Error('Path must start with a dot (.)');
  104. let dir = parent;
  105. for (let i = 1; i < path.length; i++) {
  106. if (!(path[i] in dir)) {
  107. if (lenient)
  108. return {};
  109. else
  110. throw Error('Directory not found');
  111. }
  112. dir = dir[path[i]];
  113. }
  114. return dir;
  115. }
  116. function listDirectory(rootDir, path, lenient=false) {
  117. let dir = findDir(rootDir, path, lenient);
  118. let keys = Object.keys(dir);
  119. keys.sort();
  120. let subdirs = keys.filter(k => !(dir[k] instanceof Array));
  121. let files = keys.filter(k => (dir[k] instanceof Array));
  122. let res = subdirs.map(k => [ 'd', k, null ]);
  123. res = res.concat(files.map(k => [ 'f', k, dir[k][1] ]));
  124. return res;
  125. }