@atlaskit/collab-provider 8.4.0 → 8.6.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.
Files changed (88) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/cjs/analytics/analytics-helper.js +135 -0
  3. package/dist/cjs/analytics/performance.js +6 -5
  4. package/dist/cjs/channel.js +242 -223
  5. package/dist/cjs/document/catchup.js +142 -0
  6. package/dist/cjs/document/document-service.js +587 -0
  7. package/dist/cjs/document/step-queue-state.js +56 -0
  8. package/dist/cjs/errors/error-code-mapper.js +86 -67
  9. package/dist/cjs/errors/error-types.js +329 -21
  10. package/dist/cjs/helpers/utils.js +1 -12
  11. package/dist/cjs/index.js +8 -1
  12. package/dist/cjs/metadata/metadata-service.js +82 -0
  13. package/dist/cjs/participants/participants-helper.js +52 -0
  14. package/dist/cjs/participants/participants-service.js +259 -0
  15. package/dist/cjs/participants/participants-state.js +56 -0
  16. package/dist/cjs/{provider/telepointers.js → participants/telepointers-helper.js} +6 -6
  17. package/dist/cjs/provider/commit-step.js +14 -6
  18. package/dist/cjs/provider/index.js +291 -780
  19. package/dist/cjs/types.js +6 -1
  20. package/dist/cjs/version-wrapper.js +1 -1
  21. package/dist/cjs/version.json +1 -1
  22. package/dist/es2019/analytics/{index.js → analytics-helper.js} +15 -4
  23. package/dist/es2019/analytics/performance.js +5 -6
  24. package/dist/es2019/channel.js +140 -113
  25. package/dist/es2019/{provider → document}/catchup.js +6 -4
  26. package/dist/es2019/document/document-service.js +472 -0
  27. package/dist/es2019/document/step-queue-state.js +35 -0
  28. package/dist/es2019/errors/error-code-mapper.js +87 -63
  29. package/dist/es2019/errors/error-types.js +221 -5
  30. package/dist/es2019/helpers/utils.js +0 -10
  31. package/dist/es2019/index.js +2 -1
  32. package/dist/es2019/metadata/metadata-service.js +61 -0
  33. package/dist/es2019/participants/participants-helper.js +25 -0
  34. package/dist/es2019/participants/participants-service.js +207 -0
  35. package/dist/es2019/participants/participants-state.js +30 -0
  36. package/dist/es2019/{provider/telepointers.js → participants/telepointers-helper.js} +2 -2
  37. package/dist/es2019/provider/commit-step.js +12 -5
  38. package/dist/es2019/provider/index.js +240 -640
  39. package/dist/es2019/types.js +8 -1
  40. package/dist/es2019/version-wrapper.js +1 -1
  41. package/dist/es2019/version.json +1 -1
  42. package/dist/esm/analytics/analytics-helper.js +128 -0
  43. package/dist/esm/analytics/performance.js +5 -6
  44. package/dist/esm/channel.js +243 -224
  45. package/dist/esm/document/catchup.js +133 -0
  46. package/dist/esm/document/document-service.js +579 -0
  47. package/dist/esm/document/step-queue-state.js +48 -0
  48. package/dist/esm/errors/error-code-mapper.js +87 -64
  49. package/dist/esm/errors/error-types.js +321 -18
  50. package/dist/esm/helpers/utils.js +0 -10
  51. package/dist/esm/index.js +2 -1
  52. package/dist/esm/metadata/metadata-service.js +74 -0
  53. package/dist/esm/participants/participants-helper.js +44 -0
  54. package/dist/esm/participants/participants-service.js +251 -0
  55. package/dist/esm/participants/participants-state.js +48 -0
  56. package/dist/esm/{provider/telepointers.js → participants/telepointers-helper.js} +4 -4
  57. package/dist/esm/provider/commit-step.js +12 -5
  58. package/dist/esm/provider/index.js +291 -779
  59. package/dist/esm/types.js +8 -1
  60. package/dist/esm/version-wrapper.js +1 -1
  61. package/dist/esm/version.json +1 -1
  62. package/dist/types/analytics/{index.d.ts → analytics-helper.d.ts} +3 -1
  63. package/dist/types/analytics/performance.d.ts +3 -1
  64. package/dist/types/analytics/ufo.d.ts +1 -1
  65. package/dist/types/channel.d.ts +13 -6
  66. package/dist/types/document/document-service.d.ts +86 -0
  67. package/dist/types/document/step-queue-state.d.ts +16 -0
  68. package/dist/types/errors/error-code-mapper.d.ts +2 -36
  69. package/dist/types/errors/error-types.d.ts +439 -4
  70. package/dist/types/helpers/const.d.ts +2 -2
  71. package/dist/types/helpers/utils.d.ts +0 -6
  72. package/dist/types/index.d.ts +3 -1
  73. package/dist/types/metadata/metadata-service.d.ts +25 -0
  74. package/dist/types/participants/participants-helper.d.ts +15 -0
  75. package/dist/types/participants/participants-service.d.ts +74 -0
  76. package/dist/types/participants/participants-state.d.ts +13 -0
  77. package/dist/types/participants/telepointers-helper.d.ts +4 -0
  78. package/dist/types/provider/commit-step.d.ts +17 -6
  79. package/dist/types/provider/index.d.ts +81 -78
  80. package/dist/types/types.d.ts +56 -31
  81. package/package.json +6 -6
  82. package/report.api.md +187 -21
  83. package/dist/cjs/analytics/index.js +0 -95
  84. package/dist/cjs/provider/catchup.js +0 -139
  85. package/dist/esm/analytics/index.js +0 -88
  86. package/dist/esm/provider/catchup.js +0 -130
  87. package/dist/types/provider/telepointers.d.ts +0 -5
  88. /package/dist/types/{provider → document}/catchup.d.ts +0 -0
package/dist/esm/types.js CHANGED
@@ -1,7 +1,14 @@
1
+ // Initial draft
2
+
3
+ /**
4
+ * @deprecated Use ProviderError type instead
5
+ */
6
+
1
7
  // Channel
2
8
 
3
9
  export var AcknowledgementResponseTypes;
4
10
  (function (AcknowledgementResponseTypes) {
5
11
  AcknowledgementResponseTypes["SUCCESS"] = "SUCCESS";
6
12
  AcknowledgementResponseTypes["ERROR"] = "ERROR";
7
- })(AcknowledgementResponseTypes || (AcknowledgementResponseTypes = {}));
13
+ })(AcknowledgementResponseTypes || (AcknowledgementResponseTypes = {})); // ESS-2916 Type def for namespace status - lock/unlock
14
+ // Catchup
@@ -1,5 +1,5 @@
1
1
  export var name = "@atlaskit/collab-provider";
2
- export var version = "8.4.0";
2
+ export var version = "8.6.0";
3
3
  export var nextMajorVersion = function nextMajorVersion() {
4
4
  return [Number(version.split('.')[0]) + 1, 0, 0].join('.');
5
5
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/collab-provider",
3
- "version": "8.4.0",
3
+ "version": "8.6.0",
4
4
  "sideEffects": false
5
5
  }
@@ -2,8 +2,10 @@ import type { AnalyticsWebClient } from '@atlaskit/analytics-listeners';
2
2
  import type { ActionAnalyticsEvent, EVENT_STATUS } from '../helpers/const';
3
3
  export default class AnalyticsHelper {
4
4
  analyticsClient: AnalyticsWebClient | undefined;
5
+ getAnalyticsClient: Promise<AnalyticsWebClient> | undefined;
5
6
  documentAri: string;
6
- constructor(documentAri: string, analyticsClient?: AnalyticsWebClient);
7
+ constructor(documentAri: string, analyticsClient?: AnalyticsWebClient, getAnalyticsClient?: Promise<AnalyticsWebClient>);
7
8
  sendErrorEvent(error: unknown, errorMessage: string): void;
8
9
  sendActionEvent(action: ActionAnalyticsEvent['eventAction'], status: EVENT_STATUS, attributes?: Omit<ActionAnalyticsEvent['attributes'], 'documentAri' | 'eventStatus'>): void;
10
+ private sendEvent;
9
11
  }
@@ -1,4 +1,4 @@
1
- import AnalyticsHelper from '.';
1
+ import AnalyticsHelper from './analytics-helper';
2
2
  export declare enum MEASURE_NAME {
3
3
  SOCKET_CONNECT = "socketConnect",
4
4
  DOCUMENT_INIT = "documentInit",
@@ -6,6 +6,8 @@ export declare enum MEASURE_NAME {
6
6
  PUBLISH_PAGE = "publishPage",
7
7
  GET_CURRENT_STATE = "getCurrentState"
8
8
  }
9
+ export declare const isPerformanceAPIAvailable: () => boolean;
10
+ export declare const measureMap: Map<string, number>;
9
11
  export declare function startMeasure(measureName: MEASURE_NAME, analyticsHelper: AnalyticsHelper | undefined): void;
10
12
  export declare function stopMeasure(measureName: MEASURE_NAME, analyticsHelper: AnalyticsHelper | undefined, onMeasureComplete?: (duration: number, startTime: number) => void): {
11
13
  duration: number;
@@ -1,3 +1,3 @@
1
1
  import { UFOExperience } from '@atlaskit/ufo';
2
- import AnalyticsHelper from '.';
2
+ import AnalyticsHelper from './analytics-helper';
3
3
  export declare const createDocInitExp: (analyticsHelper: AnalyticsHelper | undefined) => UFOExperience | undefined;
@@ -1,7 +1,7 @@
1
1
  import { Emitter } from './emitter';
2
2
  import type { Config, ChannelEvent, CatchupResponse, Metadata } from './types';
3
3
  import type { Socket } from 'socket.io-client';
4
- import AnalyticsHelper from './analytics';
4
+ import AnalyticsHelper from './analytics/analytics-helper';
5
5
  export declare class Channel extends Emitter<ChannelEvent> {
6
6
  private connected;
7
7
  private config;
@@ -22,18 +22,25 @@ export declare class Channel extends Emitter<ChannelEvent> {
22
22
  /**
23
23
  * Connect to collab service using websockets
24
24
  */
25
- connect(): void;
25
+ connect(shouldInitialize?: boolean): void;
26
26
  private handlePermissionInvalidateToken;
27
27
  private onConnectError;
28
28
  private onReconnectError;
29
29
  private onConnect;
30
30
  private onReceiveData;
31
- fetchCatchup(fromVersion: number): Promise<CatchupResponse>;
31
+ fetchCatchup: (fromVersion: number) => Promise<CatchupResponse>;
32
32
  /**
33
- * Send message to service. Timestamp will be added server side.
33
+ * Send message to the back-end service over the channel. Timestamp will be added server side.
34
+ * @throws {NotInitializedError} Channel not initialized
35
+ * @throws {NotConnectedError} Channel not connected
34
36
  */
35
- broadcast<K extends keyof ChannelEvent>(type: K, data: Omit<ChannelEvent[K], 'timestamp'>, callback?: Function): void;
36
- sendMetadata(metadata: Metadata): void;
37
+ broadcast: <K extends keyof ChannelEvent>(type: K, data: Omit<ChannelEvent[K], "timestamp">, callback?: Function | undefined) => void;
38
+ /**
39
+ * Send metadata to to the back-end service over the channel
40
+ * @throws {NotInitializedError} Channel not initialized
41
+ * @throws {NotConnectedError} Channel not connected
42
+ */
43
+ sendMetadata: (metadata: Metadata) => void;
37
44
  sendPresenceJoined(): void;
38
45
  onOnlineHandler: () => void;
39
46
  disconnect(): void;
@@ -0,0 +1,86 @@
1
+ /// <reference types="lodash" />
2
+ import AnalyticsHelper from '../analytics/analytics-helper';
3
+ import { CatchupResponse, ChannelEvent, CollabEvents, CollabInitPayload, StepsPayload } from '../types';
4
+ import type { Step as ProseMirrorStep } from 'prosemirror-transform';
5
+ import type { MetadataService } from '../metadata/metadata-service';
6
+ import { SyncUpErrorFunction } from '@atlaskit/editor-common/types';
7
+ import type { EditorState, Transaction } from 'prosemirror-state';
8
+ import { ResolvedEditorState } from '@atlaskit/editor-common/collab';
9
+ import { ParticipantsService } from '../participants/participants-service';
10
+ import type { InternalError } from '../errors/error-types';
11
+ export declare class DocumentService {
12
+ private participantsService;
13
+ private analyticsHelper;
14
+ private fetchCatchup;
15
+ private providerEmitCallback;
16
+ private broadcast;
17
+ private getUserId;
18
+ private onErrorHandled;
19
+ private metadataService;
20
+ private getState;
21
+ private onSyncUpError?;
22
+ private stepQueue;
23
+ private stepRejectCounter;
24
+ private clientId?;
25
+ /**
26
+ *
27
+ * @param participantsService - The participants service, used when users are detected active when making changes to the document
28
+ * and to emit their telepointers from steps they add
29
+ * @param analyticsHelper - Helper for analytics events
30
+ * @param fetchCatchup - Function to fetch "catchup" data, data required to rebase current steps to the latest version.
31
+ * @param providerEmitCallback - Callback for emitting events to listeners on the provider
32
+ * @param broadcastMetadata - Callback for broadcasting metadata changes to other clients
33
+ * @param broadcast - Callback for broadcasting events to other clients
34
+ * @param getUserId - Callback to fetch the current user's ID
35
+ * @param onErrorHandled - Callback to handle
36
+ */
37
+ constructor(participantsService: ParticipantsService, analyticsHelper: AnalyticsHelper | undefined, fetchCatchup: (fromVersion: number) => Promise<CatchupResponse>, providerEmitCallback: (evt: keyof CollabEvents, data: any) => void, broadcast: <K extends keyof ChannelEvent>(type: K, data: Omit<ChannelEvent[K], 'timestamp'>, callback?: Function) => void, getUserId: () => string | undefined, onErrorHandled: (error: InternalError) => void, metadataService: MetadataService);
38
+ /**
39
+ * To prevent calling catchup to often, use lodash throttle to reduce the frequency
40
+ */
41
+ throttledCatchup: import("lodash").DebouncedFunc<() => Promise<void>>;
42
+ /**
43
+ * Called when:
44
+ * * session established(offline -> online)
45
+ * * try to accept steps but version is behind.
46
+ */
47
+ private catchup;
48
+ getCurrentPmVersion: () => number;
49
+ private processQueue;
50
+ getCurrentState: () => Promise<ResolvedEditorState>;
51
+ private processSteps;
52
+ getUnconfirmedStepsOrigins: () => readonly Transaction<any>[] | undefined;
53
+ getUnconfirmedSteps: () => readonly ProseMirrorStep[] | undefined;
54
+ private applyLocalSteps;
55
+ /**
56
+ * Called when we receive steps from the service
57
+ */
58
+ onStepsAdded: (data: StepsPayload) => void;
59
+ onRestore: ({ doc, version, metadata }: CollabInitPayload) => void;
60
+ getFinalAcknowledgedState: () => Promise<ResolvedEditorState>;
61
+ updateDocument: ({ doc, version, metadata, reserveCursor, }: CollabInitPayload) => void;
62
+ /**
63
+ * Commit the unconfirmed local steps to the back-end service
64
+ * @throws {Error} Couldn't sync the steps after retrying 30 times
65
+ */
66
+ commitUnconfirmedSteps: () => Promise<void>;
67
+ setup({ getState, onSyncUpError, clientId, }: {
68
+ getState: () => EditorState;
69
+ onSyncUpError?: SyncUpErrorFunction;
70
+ clientId: number | string | undefined;
71
+ }): this;
72
+ /**
73
+ * We can use this function to throttle/delay
74
+ * Any send steps operation
75
+ *
76
+ * The getState function will return the current EditorState
77
+ * from the EditorView.
78
+ */
79
+ sendStepsFromCurrentState(): void;
80
+ onStepRejectedError: () => void;
81
+ /**
82
+ * Send steps from transaction to other participants
83
+ * It needs the superfluous arguments because we keep the interface of the send API the same as the Synchrony plugin
84
+ */
85
+ send(_tr: Transaction | null, _oldState: EditorState | null, newState: EditorState): void;
86
+ }
@@ -0,0 +1,16 @@
1
+ import { StepsPayload } from '../types';
2
+ export declare class StepQueueState {
3
+ private queuePaused;
4
+ private queue;
5
+ queueSteps(data: StepsPayload): void;
6
+ getQueue: () => StepsPayload[];
7
+ filterQueue: (condition: (stepsPayload: StepsPayload) => boolean) => void;
8
+ /**
9
+ * Get whether the document service has stopped processing new steps whilst it carries out processes such as catchup.
10
+ * Exposed for testing
11
+ */
12
+ isPaused: () => boolean;
13
+ pauseQueue: () => void;
14
+ resumeQueue: () => void;
15
+ shift: () => StepsPayload | undefined;
16
+ }
@@ -1,36 +1,2 @@
1
- import type { CollabErrorPayload, ErrorPayload } from '../types';
2
- export declare const ErrorCodeMapper: {
3
- noPermissionError: {
4
- code: string;
5
- message: string;
6
- };
7
- documentNotFound: {
8
- code: string;
9
- message: string;
10
- };
11
- hasToLogin: {
12
- code: string;
13
- message: string;
14
- };
15
- catchupFail: {
16
- code: string;
17
- message: string;
18
- };
19
- serviceUnvailable: {
20
- code: string;
21
- message: string;
22
- };
23
- failToSave: {
24
- code: string;
25
- message: string;
26
- };
27
- restoreError: {
28
- code: string;
29
- message: string;
30
- };
31
- internalError: {
32
- code: string;
33
- message: string;
34
- };
35
- };
36
- export declare const errorCodeMapper: (error: ErrorPayload) => CollabErrorPayload | undefined;
1
+ import { InternalError, ProviderError } from './error-types';
2
+ export declare const errorCodeMapper: (error: InternalError) => ProviderError | undefined;