@lvce-editor/file-system-worker 5.10.0 → 5.11.0

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.
@@ -324,7 +324,6 @@ const walkValue = (value, transferrables, isTransferrable) => {
324
324
  for (const property of Object.values(value)) {
325
325
  walkValue(property, transferrables, isTransferrable);
326
326
  }
327
- return;
328
327
  }
329
328
  };
330
329
  const getTransferrables = value => {
@@ -478,7 +477,14 @@ class IpcError extends VError {
478
477
  const cause = new Error(message);
479
478
  // @ts-ignore
480
479
  cause.code = code;
481
- cause.stack = stack;
480
+ if (stack) {
481
+ Object.defineProperty(cause, 'stack', {
482
+ configurable: true,
483
+ enumerable: false,
484
+ value: stack,
485
+ writable: true
486
+ });
487
+ }
482
488
  super(cause, betterMessage);
483
489
  } else {
484
490
  super(betterMessage);
@@ -828,7 +834,10 @@ const constructError = (message, type, name) => {
828
834
  if (ErrorConstructor === Error) {
829
835
  const error = new Error(message);
830
836
  if (name && name !== 'VError') {
831
- error.name = name;
837
+ Object.defineProperty(error, 'name', {
838
+ configurable: true,
839
+ value: name
840
+ });
832
841
  }
833
842
  return error;
834
843
  }
@@ -845,8 +854,10 @@ const getCurrentStack = () => {
845
854
  const currentStack = joinLines(splitLines(new Error().stack || '').slice(stackLinesToSkip));
846
855
  return currentStack;
847
856
  };
848
- const getNewLineIndex = (string, startIndex = undefined) => {
849
- return string.indexOf(NewLine, startIndex);
857
+ const getNewLineIndex = (string, startIndex) => {
858
+ {
859
+ return string.indexOf(NewLine);
860
+ }
850
861
  };
851
862
  const getParentStack = error => {
852
863
  let parentStack = error.stack || error.data || error.message || '';
@@ -857,55 +868,91 @@ const getParentStack = error => {
857
868
  };
858
869
  const MethodNotFound = -32601;
859
870
  const Custom = -32001;
871
+ const setStack = (error, stack) => {
872
+ const descriptor = Object.getOwnPropertyDescriptor(error, 'stack');
873
+ if (descriptor) {
874
+ if (!descriptor.configurable && !descriptor.writable) {
875
+ return;
876
+ }
877
+ if (!descriptor.configurable && descriptor.writable) {
878
+ error.stack = stack;
879
+ return;
880
+ }
881
+ }
882
+ Object.defineProperty(error, 'stack', {
883
+ configurable: true,
884
+ value: stack,
885
+ writable: true
886
+ });
887
+ };
888
+ const restoreExistingError = (error, currentStack) => {
889
+ if (typeof error.stack === 'string') {
890
+ setStack(error, `${error.stack}${NewLine}${currentStack}`);
891
+ }
892
+ return error;
893
+ };
894
+ const restoreMethodNotFoundError = (error, currentStack) => {
895
+ const restoredError = new JsonRpcError(error.message);
896
+ const parentStack = getParentStack(error);
897
+ setStack(restoredError, `${parentStack}${NewLine}${currentStack}`);
898
+ return restoredError;
899
+ };
900
+ const restoreStackFromData = (restoredError, error, currentStack) => {
901
+ if (error.data.stack && error.data.type && error.message) {
902
+ setStack(restoredError, `${error.data.type}: ${error.message}${NewLine}${error.data.stack}${NewLine}${currentStack}`);
903
+ return;
904
+ }
905
+ if (error.data.stack) {
906
+ setStack(restoredError, error.data.stack);
907
+ }
908
+ };
909
+ const applyDataProperties = (restoredError, error) => {
910
+ restoreStackFromData(restoredError, error, getCurrentStack());
911
+ if (error.data.codeFrame) {
912
+ // @ts-ignore
913
+ restoredError.codeFrame = error.data.codeFrame;
914
+ }
915
+ if (error.data.code) {
916
+ // @ts-ignore
917
+ restoredError.code = error.data.code;
918
+ }
919
+ if (error.data.type) {
920
+ // @ts-ignore
921
+ restoredError.name = error.data.type;
922
+ }
923
+ };
924
+ const applyDirectProperties = (restoredError, error) => {
925
+ if (error.stack) {
926
+ const lowerStack = restoredError.stack || '';
927
+ const indexNewLine = getNewLineIndex(lowerStack);
928
+ const parentStack = getParentStack(error);
929
+ // @ts-ignore
930
+ setStack(restoredError, `${parentStack}${lowerStack.slice(indexNewLine)}`);
931
+ }
932
+ if (error.codeFrame) {
933
+ // @ts-ignore
934
+ restoredError.codeFrame = error.codeFrame;
935
+ }
936
+ };
937
+ const restoreMessageError = (error, _currentStack) => {
938
+ const restoredError = constructError(error.message, error.type, error.name);
939
+ if (error.data) {
940
+ applyDataProperties(restoredError, error);
941
+ } else {
942
+ applyDirectProperties(restoredError, error);
943
+ }
944
+ return restoredError;
945
+ };
860
946
  const restoreJsonRpcError = error => {
861
947
  const currentStack = getCurrentStack();
862
948
  if (error && error instanceof Error) {
863
- if (typeof error.stack === 'string') {
864
- error.stack = error.stack + NewLine + currentStack;
865
- }
866
- return error;
949
+ return restoreExistingError(error, currentStack);
867
950
  }
868
951
  if (error && error.code && error.code === MethodNotFound) {
869
- const restoredError = new JsonRpcError(error.message);
870
- const parentStack = getParentStack(error);
871
- restoredError.stack = parentStack + NewLine + currentStack;
872
- return restoredError;
952
+ return restoreMethodNotFoundError(error, currentStack);
873
953
  }
874
954
  if (error && error.message) {
875
- const restoredError = constructError(error.message, error.type, error.name);
876
- if (error.data) {
877
- if (error.data.stack && error.data.type && error.message) {
878
- restoredError.stack = error.data.type + ': ' + error.message + NewLine + error.data.stack + NewLine + currentStack;
879
- } else if (error.data.stack) {
880
- restoredError.stack = error.data.stack;
881
- }
882
- if (error.data.codeFrame) {
883
- // @ts-ignore
884
- restoredError.codeFrame = error.data.codeFrame;
885
- }
886
- if (error.data.code) {
887
- // @ts-ignore
888
- restoredError.code = error.data.code;
889
- }
890
- if (error.data.type) {
891
- // @ts-ignore
892
- restoredError.name = error.data.type;
893
- }
894
- } else {
895
- if (error.stack) {
896
- const lowerStack = restoredError.stack || '';
897
- // @ts-ignore
898
- const indexNewLine = getNewLineIndex(lowerStack);
899
- const parentStack = getParentStack(error);
900
- // @ts-ignore
901
- restoredError.stack = parentStack + lowerStack.slice(indexNewLine);
902
- }
903
- if (error.codeFrame) {
904
- // @ts-ignore
905
- restoredError.codeFrame = error.codeFrame;
906
- }
907
- }
908
- return restoredError;
955
+ return restoreMessageError(error);
909
956
  }
910
957
  if (typeof error === 'string') {
911
958
  return new Error(`JsonRpc Error: ${error}`);
@@ -1312,28 +1359,72 @@ const create$3 = async ({
1312
1359
  }) => {
1313
1360
  // TODO create a commandMap per rpc instance
1314
1361
  register$1(commandMap);
1315
- const rawIpc = await IpcParentWithWebSocket$1.create({
1316
- webSocket
1317
- });
1362
+ let rawIpc;
1363
+ try {
1364
+ rawIpc = await IpcParentWithWebSocket$1.create({
1365
+ webSocket
1366
+ });
1367
+ } catch (error) {
1368
+ throw new VError(error, 'Failed to create rpc connection');
1369
+ }
1318
1370
  const ipc = IpcParentWithWebSocket$1.wrap(rawIpc);
1319
1371
  handleIpc(ipc);
1320
1372
  const rpc = createRpc(ipc);
1321
1373
  return rpc;
1322
1374
  };
1323
1375
 
1376
+ const reconnectDelay = 2000;
1377
+ const waitForReconnect = async () => {
1378
+ await new Promise(resolve => {
1379
+ setTimeout(resolve, reconnectDelay);
1380
+ });
1381
+ };
1382
+ const connect = async ({
1383
+ commandMap,
1384
+ wsUrl
1385
+ }) => {
1386
+ const webSocket = new WebSocket(wsUrl);
1387
+ try {
1388
+ const rpc = await create$3({
1389
+ commandMap,
1390
+ webSocket
1391
+ });
1392
+ return {
1393
+ rpc,
1394
+ webSocket
1395
+ };
1396
+ } catch (error) {
1397
+ webSocket.close();
1398
+ throw error;
1399
+ }
1400
+ };
1324
1401
  const create$2 = async ({
1325
1402
  commandMap,
1403
+ onClose,
1326
1404
  type
1327
1405
  }) => {
1328
1406
  const host = getHost();
1329
1407
  const protocol = getProtocol();
1330
1408
  const wsUrl = getWebSocketUrl(type, host, protocol);
1331
- const webSocket = new WebSocket(wsUrl);
1332
- const rpc = await create$3({
1333
- commandMap,
1334
- webSocket
1335
- });
1336
- return rpc;
1409
+ let connection;
1410
+ try {
1411
+ connection = await connect({
1412
+ commandMap,
1413
+ wsUrl
1414
+ });
1415
+ } catch {
1416
+ await waitForReconnect();
1417
+ connection = await connect({
1418
+ commandMap,
1419
+ wsUrl
1420
+ });
1421
+ }
1422
+ if (onClose) {
1423
+ connection.webSocket.addEventListener('close', onClose, {
1424
+ once: true
1425
+ });
1426
+ }
1427
+ return connection.rpc;
1337
1428
  };
1338
1429
 
1339
1430
  const create$1 = async ({
@@ -1672,6 +1763,7 @@ const Http = 'http:';
1672
1763
  const Memory = 'memfs:';
1673
1764
  const Https = 'https:';
1674
1765
  const File$2 = 'file:';
1766
+ const Fetch$1 = 'fetch:';
1675
1767
 
1676
1768
  const watchCallbacks = Object.create(null);
1677
1769
  const registerWatchCallback = (id, rpcId, commandId, uri) => {
@@ -1855,6 +1947,10 @@ const FileSystemMemory = {
1855
1947
  writeFile: writeFile$1
1856
1948
  };
1857
1949
 
1950
+ const isFetch = uri => {
1951
+ return uri.startsWith(Fetch$1);
1952
+ };
1953
+
1858
1954
  const isHttp = uri => {
1859
1955
  return uri.startsWith(Http) || uri.startsWith(Https);
1860
1956
  };
@@ -1870,6 +1966,9 @@ const remove = async dirent => {
1870
1966
  return remove$2(dirent);
1871
1967
  };
1872
1968
  const readFile = async uri => {
1969
+ if (isFetch(uri)) {
1970
+ return invoke$2('FileSystem.readFile', uri);
1971
+ }
1873
1972
  if (isHttp(uri)) {
1874
1973
  return readFile$3(uri);
1875
1974
  }
@@ -1885,6 +1984,9 @@ const appendFile = async (uri, text) => {
1885
1984
  return appendFile$1(uri, text);
1886
1985
  };
1887
1986
  const readDirWithFileTypes = async uri => {
1987
+ if (isFetch(uri)) {
1988
+ return invoke$2('FileSystem.readDirWithFileTypes', uri);
1989
+ }
1888
1990
  if (isMemory(uri)) {
1889
1991
  return invoke$2('FileSystem.readDirWithFileTypes', uri);
1890
1992
  }
@@ -1931,6 +2033,9 @@ const stat = async dirent => {
1931
2033
  return stat$2(dirent);
1932
2034
  };
1933
2035
  const exists = async uri => {
2036
+ if (isFetch(uri)) {
2037
+ return invoke$2('FileSystem.exists', uri);
2038
+ }
1934
2039
  if (isHttp(uri)) {
1935
2040
  return exists$3(uri);
1936
2041
  }
@@ -2072,8 +2177,25 @@ const createFileSystemProcessRpc = async platform => {
2072
2177
  return create();
2073
2178
  };
2074
2179
 
2180
+ const throwUnavailableError = () => {
2181
+ throw new Error('Disk file system is not available in web');
2182
+ };
2183
+ const createUnavailableFileSystemProcessRpc = () => {
2184
+ return {
2185
+ dispose: async () => {},
2186
+ invoke: async () => {
2187
+ return throwUnavailableError();
2188
+ },
2189
+ invokeAndTransfer: async () => {
2190
+ return throwUnavailableError();
2191
+ },
2192
+ send: throwUnavailableError
2193
+ };
2194
+ };
2195
+
2075
2196
  const initializeFileSystemProcess = async platform => {
2076
2197
  if (platform === Web) {
2198
+ set(createUnavailableFileSystemProcessRpc());
2077
2199
  return;
2078
2200
  }
2079
2201
  const rpc = await createFileSystemProcessRpc(platform);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/file-system-worker",
3
- "version": "5.10.0",
3
+ "version": "5.11.0",
4
4
  "description": "File System Worker",
5
5
  "keywords": [
6
6
  "Lvce Editor"