@lvce-editor/completion-worker 1.0.0 → 1.2.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.
@@ -403,9 +403,103 @@ const IpcChildWithModuleWorkerAndMessagePort$1 = {
403
403
  listen: listen$6,
404
404
  wrap: wrap$e
405
405
  };
406
+ const addListener = (emitter, type, callback) => {
407
+ if ('addEventListener' in emitter) {
408
+ emitter.addEventListener(type, callback);
409
+ } else {
410
+ emitter.on(type, callback);
411
+ }
412
+ };
413
+ const removeListener = (emitter, type, callback) => {
414
+ if ('removeEventListener' in emitter) {
415
+ emitter.removeEventListener(type, callback);
416
+ } else {
417
+ emitter.off(type, callback);
418
+ }
419
+ };
420
+ const getFirstEvent = (eventEmitter, eventMap) => {
421
+ const {
422
+ resolve,
423
+ promise
424
+ } = Promise.withResolvers();
425
+ const listenerMap = Object.create(null);
426
+ const cleanup = value => {
427
+ for (const event of Object.keys(eventMap)) {
428
+ removeListener(eventEmitter, event, listenerMap[event]);
429
+ }
430
+ resolve(value);
431
+ };
432
+ for (const [event, type] of Object.entries(eventMap)) {
433
+ const listener = event => {
434
+ cleanup({
435
+ type,
436
+ event
437
+ });
438
+ };
439
+ addListener(eventEmitter, event, listener);
440
+ listenerMap[event] = listener;
441
+ }
442
+ return promise;
443
+ };
444
+ const Message$1 = 3;
445
+ const create$5$1 = async ({
446
+ messagePort,
447
+ isMessagePortOpen
448
+ }) => {
449
+ if (!isMessagePort(messagePort)) {
450
+ throw new IpcError('port must be of type MessagePort');
451
+ }
452
+ if (isMessagePortOpen) {
453
+ return messagePort;
454
+ }
455
+ const eventPromise = getFirstEvent(messagePort, {
456
+ message: Message$1
457
+ });
458
+ messagePort.start();
459
+ const {
460
+ type,
461
+ event
462
+ } = await eventPromise;
463
+ if (type !== Message$1) {
464
+ throw new IpcError('Failed to wait for ipc message');
465
+ }
466
+ if (event.data !== readyMessage) {
467
+ throw new IpcError('unexpected first message');
468
+ }
469
+ return messagePort;
470
+ };
471
+ const signal$1 = messagePort => {
472
+ messagePort.start();
473
+ };
474
+ class IpcParentWithMessagePort extends Ipc {
475
+ getData = getData$2;
476
+ send(message) {
477
+ this._rawIpc.postMessage(message);
478
+ }
479
+ sendAndTransfer(message) {
480
+ const transfer = getTransferrables(message);
481
+ this._rawIpc.postMessage(message, transfer);
482
+ }
483
+ dispose() {
484
+ this._rawIpc.close();
485
+ }
486
+ onMessage(callback) {
487
+ this._rawIpc.addEventListener('message', callback);
488
+ }
489
+ onClose(callback) {}
490
+ }
491
+ const wrap$5 = messagePort => {
492
+ return new IpcParentWithMessagePort(messagePort);
493
+ };
494
+ const IpcParentWithMessagePort$1 = {
495
+ __proto__: null,
496
+ create: create$5$1,
497
+ signal: signal$1,
498
+ wrap: wrap$5
499
+ };
406
500
 
407
501
  const Two = '2.0';
408
- const create$4 = (method, params) => {
502
+ const create$4$1 = (method, params) => {
409
503
  return {
410
504
  jsonrpc: Two,
411
505
  method,
@@ -413,7 +507,7 @@ const create$4 = (method, params) => {
413
507
  };
414
508
  };
415
509
  const callbacks = Object.create(null);
416
- const set$2 = (id, fn) => {
510
+ const set$3 = (id, fn) => {
417
511
  callbacks[id] = fn;
418
512
  };
419
513
  const get$2 = id => {
@@ -432,13 +526,13 @@ const registerPromise = () => {
432
526
  resolve,
433
527
  promise
434
528
  } = Promise.withResolvers();
435
- set$2(id, resolve);
529
+ set$3(id, resolve);
436
530
  return {
437
531
  id,
438
532
  promise
439
533
  };
440
534
  };
441
- const create$2$1 = (method, params) => {
535
+ const create$2$2 = (method, params) => {
442
536
  const {
443
537
  id,
444
538
  promise
@@ -730,7 +824,7 @@ const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
730
824
  const {
731
825
  message,
732
826
  promise
733
- } = create$2$1(method, params);
827
+ } = create$2$2(method, params);
734
828
  if (useSendAndTransfer && ipc.sendAndTransfer) {
735
829
  ipc.sendAndTransfer(message);
736
830
  } else {
@@ -740,13 +834,13 @@ const invokeHelper = async (ipc, method, params, useSendAndTransfer) => {
740
834
  return unwrapJsonRpcResult(responseMessage);
741
835
  };
742
836
  const send = (transport, method, ...params) => {
743
- const message = create$4(method, params);
837
+ const message = create$4$1(method, params);
744
838
  transport.send(message);
745
839
  };
746
- const invoke$3 = (ipc, method, ...params) => {
840
+ const invoke$2 = (ipc, method, ...params) => {
747
841
  return invokeHelper(ipc, method, params, false);
748
842
  };
749
- const invokeAndTransfer = (ipc, method, ...params) => {
843
+ const invokeAndTransfer$1 = (ipc, method, ...params) => {
750
844
  return invokeHelper(ipc, method, params, true);
751
845
  };
752
846
 
@@ -776,10 +870,10 @@ const createRpc = ipc => {
776
870
  send(ipc, method, ...params);
777
871
  },
778
872
  invoke(method, ...params) {
779
- return invoke$3(ipc, method, ...params);
873
+ return invoke$2(ipc, method, ...params);
780
874
  },
781
875
  invokeAndTransfer(method, ...params) {
782
- return invokeAndTransfer(ipc, method, ...params);
876
+ return invokeAndTransfer$1(ipc, method, ...params);
783
877
  },
784
878
  async dispose() {
785
879
  await ipc?.dispose();
@@ -818,6 +912,35 @@ const listen$1 = async (module, options) => {
818
912
  return ipc;
819
913
  };
820
914
  const create$3 = async ({
915
+ commandMap,
916
+ messagePort
917
+ }) => {
918
+ // TODO create a commandMap per rpc instance
919
+ register(commandMap);
920
+ const rawIpc = await IpcParentWithMessagePort$1.create({
921
+ messagePort,
922
+ isMessagePortOpen: true
923
+ });
924
+ const ipc = IpcParentWithMessagePort$1.wrap(rawIpc);
925
+ handleIpc(ipc);
926
+ const rpc = createRpc(ipc);
927
+ messagePort.start();
928
+ return rpc;
929
+ };
930
+ const create$2$1 = async ({
931
+ commandMap,
932
+ messagePort
933
+ }) => {
934
+ return create$3({
935
+ commandMap,
936
+ messagePort
937
+ });
938
+ };
939
+ const PlainMessagePortRpcParent = {
940
+ __proto__: null,
941
+ create: create$2$1
942
+ };
943
+ const create$4 = async ({
821
944
  commandMap
822
945
  }) => {
823
946
  // TODO create a commandMap per rpc instance
@@ -829,7 +952,7 @@ const create$3 = async ({
829
952
  };
830
953
  const WebWorkerRpcClient = {
831
954
  __proto__: null,
832
- create: create$3
955
+ create: create$4
833
956
  };
834
957
 
835
958
  const create$2 = () => {
@@ -893,11 +1016,11 @@ const create$2 = () => {
893
1016
 
894
1017
  const {
895
1018
  get: get$1,
896
- set: set$1,
1019
+ set: set$2,
897
1020
  wrapCommand
898
1021
  } = create$2();
899
1022
 
900
- const create$1 = (uid, x, y, width, height, parentUid) => {
1023
+ const create$1 = (uid, x, y, width, height, editorUid, editorLanguageId) => {
901
1024
  const state = {
902
1025
  uid,
903
1026
  items: [],
@@ -916,9 +1039,11 @@ const create$1 = (uid, x, y, width, height, parentUid) => {
916
1039
  headerHeight: 0,
917
1040
  leadingWord: '',
918
1041
  unfilteredItems: [],
919
- version: 0
1042
+ version: 0,
1043
+ editorUid,
1044
+ editorLanguageId
920
1045
  };
921
- set$1(uid, state, state);
1046
+ set$2(uid, state, state);
922
1047
  };
923
1048
 
924
1049
  const modules = [];
@@ -950,14 +1075,17 @@ const getCommandIds = () => {
950
1075
  return commandIds;
951
1076
  };
952
1077
 
953
- const initialize = async () => {
954
- // TODO create connection to extension host worker
1078
+ const getPortTuple = () => {
1079
+ const {
1080
+ port1,
1081
+ port2
1082
+ } = new MessageChannel();
1083
+ return {
1084
+ port1,
1085
+ port2
1086
+ };
955
1087
  };
956
1088
 
957
- const OnCompletion = 'onCompletion';
958
-
959
- const CompletionExecute = 'ExtensionHostCompletion.execute';
960
-
961
1089
  const rpcs = Object.create(null);
962
1090
  const set$9 = (id, rpc) => {
963
1091
  rpcs[id] = rpc;
@@ -989,56 +1117,98 @@ const create = rpcId => {
989
1117
  };
990
1118
  const EditorWorker$1 = 99;
991
1119
  const ExtensionHostWorker = 44;
992
- const RendererWorker$1 = 1;
993
1120
  const {
994
- invoke: invoke$8} = create(EditorWorker$1);
1121
+ invoke: invoke$8,
1122
+ invokeAndTransfer: invokeAndTransfer$8,
1123
+ set: set$8
1124
+ } = create(EditorWorker$1);
995
1125
  const EditorWorker = {
996
1126
  __proto__: null,
997
- invoke: invoke$8};
1127
+ invoke: invoke$8,
1128
+ invokeAndTransfer: invokeAndTransfer$8,
1129
+ set: set$8
1130
+ };
998
1131
  const {
999
- invoke: invoke$6} = create(ExtensionHostWorker);
1132
+ invoke: invoke$6,
1133
+ set: set$6
1134
+ } = create(ExtensionHostWorker);
1000
1135
  const ExtensionHost = {
1001
1136
  __proto__: null,
1002
- invoke: invoke$6};
1137
+ invoke: invoke$6,
1138
+ set: set$6
1139
+ };
1140
+
1003
1141
  const {
1004
- invoke: invoke$4,
1005
- set: set$4
1006
- } = create(RendererWorker$1);
1007
- const RendererWorker = {
1008
- __proto__: null,
1009
- invoke: invoke$4,
1010
- set: set$4
1142
+ invoke: invoke$1,
1143
+ set: set$1,
1144
+ invokeAndTransfer
1145
+ } = EditorWorker;
1146
+
1147
+ const sendMessagePortToExtensionHostWorker = async port => {
1148
+ const command = 'HandleMessagePort.handleMessagePort2';
1149
+ // @ts-ignore
1150
+ await invokeAndTransfer(
1151
+ // @ts-ignore
1152
+ 'SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionHostWorker', port, command, 0 // TODO
1153
+ );
1154
+ };
1155
+
1156
+ const createExtensionHostRpc = async () => {
1157
+ try {
1158
+ const {
1159
+ port1,
1160
+ port2
1161
+ } = getPortTuple();
1162
+ await sendMessagePortToExtensionHostWorker(port2);
1163
+ const rpc = await PlainMessagePortRpcParent.create({
1164
+ commandMap: {},
1165
+ messagePort: port1
1166
+ });
1167
+ return rpc;
1168
+ } catch (error) {
1169
+ throw new VError(error, `Failed to create extension host rpc`);
1170
+ }
1011
1171
  };
1012
1172
 
1013
1173
  const {
1014
- set,
1015
- invoke: invoke$2} = RendererWorker;
1174
+ invoke,
1175
+ set
1176
+ } = ExtensionHost;
1177
+
1178
+ const initialize = async () => {
1179
+ const rpc = await createExtensionHostRpc();
1180
+ set(rpc);
1181
+ };
1182
+
1183
+ const OnCompletion = 'onCompletion';
1184
+
1185
+ const CompletionExecute = 'ExtensionHostCompletion.execute';
1016
1186
 
1017
1187
  // TODO add tests for this
1018
1188
  const activateByEvent = async event => {
1019
- await invoke$2('ExtensionHostManagement.activateByEvent', event);
1189
+ // @ts-ignore
1190
+ await invoke$1('ActivateByEvent.activateByEvent', event);
1020
1191
  };
1021
1192
 
1022
- const {
1023
- invoke: invoke$1} = ExtensionHost;
1024
-
1025
1193
  const execute = async ({
1026
- editor,
1194
+ editorLanguageId,
1195
+ editorUid,
1027
1196
  args,
1028
1197
  event,
1029
1198
  method,
1030
1199
  noProviderFoundMessage,
1031
1200
  noProviderFoundResult = undefined
1032
1201
  }) => {
1033
- const fullEvent = `${event}:${editor.languageId}`;
1202
+ const fullEvent = `${event}:${editorLanguageId}`;
1034
1203
  await activateByEvent(fullEvent);
1035
- const result = await invoke$1(method, editor.uid, ...args);
1204
+ const result = await invoke(method, editorUid, ...args);
1036
1205
  return result;
1037
1206
  };
1038
1207
 
1039
- const executeCompletionProvider = async (editor, offset) => {
1208
+ const executeCompletionProvider = async (editorUid, editorLanguageId, offset) => {
1040
1209
  return execute({
1041
- editor,
1210
+ editorUid,
1211
+ editorLanguageId,
1042
1212
  event: OnCompletion,
1043
1213
  method: CompletionExecute,
1044
1214
  args: [offset],
@@ -1046,15 +1216,15 @@ const executeCompletionProvider = async (editor, offset) => {
1046
1216
  noProviderFoundResult: []});
1047
1217
  };
1048
1218
 
1049
- const getOffsetAtCursor = editor => {
1050
- // TODO
1219
+ const getOffsetAtCursor = editorUid => {
1220
+ // TODO ask editor worker
1051
1221
  return 0;
1052
1222
  };
1053
1223
 
1054
1224
  // TODO possible to do this with events/state machine instead of promises -> enables canceling operations / concurrent calls
1055
- const getCompletions = async editor => {
1225
+ const getCompletions = async (editorUid, editorLanguageId) => {
1056
1226
  const offset = getOffsetAtCursor();
1057
- const completions = await executeCompletionProvider(editor, offset);
1227
+ const completions = await executeCompletionProvider(editorUid, editorLanguageId, offset);
1058
1228
  return completions;
1059
1229
  };
1060
1230
 
@@ -1271,49 +1441,33 @@ const getListHeight = (itemsLength, itemHeight, maxHeight) => {
1271
1441
  return Math.min(totalHeight, maxHeight);
1272
1442
  };
1273
1443
 
1274
- const {
1275
- invoke} = EditorWorker;
1276
-
1277
1444
  const getPositionAtCursor = async parentUid => {
1278
- const position = await invoke('Editor.getPositionAtCursor', parentUid);
1445
+ const position = await invoke$1('Editor.getPositionAtCursor', parentUid);
1279
1446
  return position;
1280
1447
  };
1281
1448
 
1282
- const RE_WORD = /[\w\-]+$/;
1283
- const getWordAtOffset = editor => {
1284
- const {
1285
- lines,
1286
- selections
1287
- } = editor;
1288
- const rowIndex = selections[0];
1289
- const columnIndex = selections[1];
1290
- const line = lines[rowIndex];
1291
- const part = line.slice(0, columnIndex);
1292
- const wordMatch = part.match(RE_WORD);
1293
- if (wordMatch) {
1294
- return wordMatch[0];
1295
- }
1449
+ const getWordAtOffset = async editorUid => {
1450
+ // TODO ask editor worker
1296
1451
  return '';
1297
1452
  };
1298
1453
 
1299
1454
  const loadContent = async state => {
1300
- const editor = {}; // TODO
1301
1455
  const {
1302
1456
  itemHeight,
1303
- maxHeight
1457
+ maxHeight,
1458
+ editorUid,
1459
+ editorLanguageId
1304
1460
  } = state;
1305
- const unfilteredItems = await getCompletions(editor);
1306
- const wordAtOffset = getWordAtOffset(editor);
1461
+ const unfilteredItems = await getCompletions(editorUid, editorLanguageId);
1462
+ const wordAtOffset = await getWordAtOffset();
1307
1463
  const items = filterCompletionItems(unfilteredItems, wordAtOffset);
1308
1464
  const {
1309
1465
  rowIndex,
1310
1466
  columnIndex,
1311
1467
  x,
1312
1468
  y
1313
- } = await getPositionAtCursor(editor);
1469
+ } = await getPositionAtCursor(editorUid);
1314
1470
  const newMaxLineY = Math.min(items.length, 8);
1315
- editor.widgets = editor.widgets || [];
1316
- // editor.widgets.push(ViewletModuleId.EditorCompletion)
1317
1471
  const itemsLength = items.length;
1318
1472
  const newFocusedIndex = itemsLength === 0 ? -1 : 0;
1319
1473
  const total = items.length;
@@ -1333,7 +1487,6 @@ const loadContent = async state => {
1333
1487
  // @ts-ignore
1334
1488
  rowIndex,
1335
1489
  columnIndex,
1336
- // editorUid,
1337
1490
  width: 200
1338
1491
  };
1339
1492
  };
@@ -1373,7 +1526,7 @@ const render2 = (uid, diffResult) => {
1373
1526
  oldState,
1374
1527
  newState
1375
1528
  } = get$1(uid);
1376
- set$1(uid, newState, newState);
1529
+ set$2(uid, newState, newState);
1377
1530
  const commands = applyRender(oldState, newState, diffResult);
1378
1531
  return commands;
1379
1532
  };
@@ -1389,14 +1542,14 @@ const commandMap = {
1389
1542
  'Completions.loadContent': wrapCommand(loadContent),
1390
1543
  'Completions.render2': render2,
1391
1544
  'Completions.terminate': terminate,
1392
- 'Completions.intialize': initialize
1545
+ 'Completions.initialize': initialize
1393
1546
  };
1394
1547
 
1395
1548
  const listen = async () => {
1396
1549
  const rpc = await WebWorkerRpcClient.create({
1397
1550
  commandMap: commandMap
1398
1551
  });
1399
- set(rpc);
1552
+ set$1(rpc);
1400
1553
  };
1401
1554
 
1402
1555
  const main = async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/completion-worker",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Web Worker for the find widget in Lvce Editor",
5
5
  "repository": {
6
6
  "type": "git",