@palantir/pack.state.foundry-event 0.1.2 → 0.2.1

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.
@@ -1,8 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var pack_auth = require('@palantir/pack.auth');
4
- var cometd = require('cometd');
5
- require('cometd/AckExtension.js');
6
4
  var pack_core = require('@palantir/pack.core');
7
5
  var pack_documentSchema_modelTypes = require('@palantir/pack.document-schema.model-types');
8
6
  var pack_state_core = require('@palantir/pack.state.core');
@@ -29,6 +27,20 @@ function _interopNamespace(e) {
29
27
 
30
28
  var y__namespace = /*#__PURE__*/_interopNamespace(y);
31
29
 
30
+ // src/FoundryEventService.ts
31
+
32
+ // src/cometd/lazyLoadCometD.ts
33
+ async function lazyLoadCometD() {
34
+ const cometdModule = await import('cometd');
35
+ const {
36
+ default: AckExtension
37
+ } = await import('cometd/AckExtension.js');
38
+ return {
39
+ ...cometdModule,
40
+ AckExtension
41
+ };
42
+ }
43
+
32
44
  // src/cometd/EventServiceCometD.ts
33
45
  var BEARER_TOKEN_FIELD = "bearer-token";
34
46
  var EXTENSION_ACK = "AckExtension";
@@ -40,66 +52,79 @@ var EventServiceCometD = class {
40
52
  subscriptionById = /* @__PURE__ */ new Map();
41
53
  tokenExtension = new TokenExtension();
42
54
  nextSubscriptionHandle = 0;
43
- constructor(app, cometd$1 = new cometd.CometD()) {
55
+ cometd;
56
+ constructor(app, cometdLoader = lazyLoadCometD) {
44
57
  this.app = app;
45
- this.cometd = cometd$1;
58
+ this.cometdLoader = cometdLoader;
46
59
  this.logger = app.config.logger.child({}, {
47
60
  msgPrefix: "EventServiceCometD"
48
61
  });
49
- this.configureCometd();
50
- this.cometd.registerExtension(EXTENSION_ACK, new cometd.AckExtension());
51
- this.cometd.registerExtension(EXTENSION_HANDSHAKE_TOKEN, this.tokenExtension);
52
62
  pack_auth.getAuthModule(app).onTokenChange((token) => {
53
63
  this.tokenExtension.setToken(token);
54
64
  });
55
65
  }
56
- initialize() {
66
+ async initialize() {
57
67
  if (this.initializePromise != null) {
58
68
  return this.initializePromise;
59
69
  }
60
- this.initializePromise = new Promise((resolve) => {
61
- this.cometd.addListener(META_CHANNEL_HANDSHAKE, ({
62
- clientId,
63
- connectionType,
64
- error,
65
- successful
66
- }) => {
67
- if (successful) {
68
- this.logger.info("CometD handshake successful", {
69
- clientId,
70
- connectionType
71
- });
72
- resolve();
73
- this.cometd.batch(() => {
74
- this.subscriptionById.forEach((subscription, subscriptionId) => {
75
- this.logger.debug("Resubscribing to channel", {
76
- channel: subscription.eventChannel,
77
- subscriptionId
78
- });
79
- const subscribeProps = subscription.getSubscriptionRequest?.();
80
- subscription.handle = this.cometd.resubscribe(subscription.handle, {
81
- ext: subscribeProps
70
+ this.initializePromise = (async () => {
71
+ if (this.cometd == null) {
72
+ const {
73
+ AckExtension,
74
+ CometD
75
+ } = await this.cometdLoader();
76
+ this.cometd = new CometD();
77
+ this.configureCometd();
78
+ this.cometd.registerExtension(EXTENSION_ACK, new AckExtension());
79
+ this.cometd.registerExtension(EXTENSION_HANDSHAKE_TOKEN, this.tokenExtension);
80
+ }
81
+ await new Promise((resolve) => {
82
+ this.cometd.addListener(META_CHANNEL_HANDSHAKE, ({
83
+ clientId,
84
+ connectionType,
85
+ error,
86
+ successful
87
+ }) => {
88
+ if (successful) {
89
+ this.logger.info("CometD handshake successful", {
90
+ clientId,
91
+ connectionType
92
+ });
93
+ resolve();
94
+ this.cometd.batch(() => {
95
+ this.subscriptionById.forEach((subscription, subscriptionId) => {
96
+ this.logger.debug("Resubscribing to channel", {
97
+ channel: subscription.eventChannel,
98
+ subscriptionId
99
+ });
100
+ const subscribeProps = subscription.getSubscriptionRequest?.();
101
+ subscription.handle = this.cometd.resubscribe(subscription.handle, {
102
+ ext: subscribeProps
103
+ });
82
104
  });
83
105
  });
84
- });
85
- } else {
86
- this.logger.warn("CometD handshake failed", {
87
- clientId,
88
- error
89
- });
90
- }
91
- });
92
- const authModule = pack_auth.getAuthModule(this.app);
93
- void authModule.getToken().then((token) => {
94
- this.logger.info("Initializing CometD with token");
95
- this.tokenExtension.setToken(token);
96
- this.cometd.handshake();
106
+ } else {
107
+ this.logger.warn("CometD handshake failed", {
108
+ clientId,
109
+ error
110
+ });
111
+ }
112
+ });
113
+ const authModule = pack_auth.getAuthModule(this.app);
114
+ void authModule.getToken().then((token) => {
115
+ this.logger.info("Initializing CometD with token");
116
+ this.tokenExtension.setToken(token);
117
+ this.cometd.handshake();
118
+ });
97
119
  });
98
- });
120
+ })();
99
121
  return this.initializePromise;
100
122
  }
101
123
  async subscribe(channel, onMessage, getSubscriptionRequest) {
102
124
  await this.initialize();
125
+ if (this.cometd == null) {
126
+ throw new Error("CometD not initialized");
127
+ }
103
128
  const subscriptionId = (this.nextSubscriptionHandle++).toString(10);
104
129
  return new Promise((resolve, reject) => {
105
130
  const messageHandler = (receivedData) => {
@@ -160,6 +185,12 @@ var EventServiceCometD = class {
160
185
  eventChannel
161
186
  } = subscription;
162
187
  this.subscriptionById.delete(subscriptionId);
188
+ if (this.cometd == null) {
189
+ this.logger.warn("CometD not initialized, cannot unsubscribe", {
190
+ subscriptionId
191
+ });
192
+ return;
193
+ }
163
194
  this.cometd.unsubscribe(handle, (message) => {
164
195
  if (!message.successful) {
165
196
  this.logger.warn("Server unsubscribe confirmation failed", {
@@ -172,6 +203,9 @@ var EventServiceCometD = class {
172
203
  }
173
204
  async publish(channel, content) {
174
205
  await this.initialize();
206
+ if (this.cometd == null) {
207
+ throw new Error("CometD not initialized");
208
+ }
175
209
  return new Promise((resolve, reject) => {
176
210
  this.cometd.publish(channel, content, (message) => {
177
211
  if (message.successful) {
@@ -196,6 +230,9 @@ var EventServiceCometD = class {
196
230
  this.configureCometd(logLevel);
197
231
  }
198
232
  configureCometd(logLevel) {
233
+ if (this.cometd == null) {
234
+ return;
235
+ }
199
236
  const url = getCometDWebsocketUrl(this.app.config);
200
237
  this.logger.info("Configuring cometD ", {
201
238
  url
@@ -229,19 +266,21 @@ var TokenExtension = class {
229
266
  return message;
230
267
  };
231
268
  };
269
+
270
+ // src/FoundryEventService.ts
232
271
  var UPDATE_ORIGIN_REMOTE = "remote";
233
272
  var getDocumentUpdatesChannelId = (documentId) => `/document/${documentId}/updates`;
234
273
  var getDocumentPublishChannelId = (documentId) => `/document/${documentId}/publish`;
235
274
  var getDocumentActivityChannelId = (documentId) => `/document/${documentId}/activity`;
236
275
  var getDocumentPresenceChannelId = (documentId) => `/document/${documentId}/presence`;
237
276
  var getDocumentPresencePublishChannelId = (documentId) => `/document/${documentId}/presence-publish`;
238
- var FoundryEventService = class {
277
+ var FoundryEventServiceImpl = class {
239
278
  eventService;
240
279
  logger;
241
280
  sessions = /* @__PURE__ */ new Map();
242
- constructor(app, cometd) {
281
+ constructor(app, cometdLoader) {
243
282
  this.app = app;
244
- this.eventService = new EventServiceCometD(app, cometd);
283
+ this.eventService = new EventServiceCometD(app, cometdLoader);
245
284
  this.logger = app.config.logger.child({}, {
246
285
  level: "debug",
247
286
  msgPrefix: "FoundryEventService"
@@ -371,12 +410,12 @@ var FoundryEventService = class {
371
410
  if (ignoreSelfUpdates && localUserId != null) {
372
411
  switch (update.type) {
373
412
  case "presenceChangeEvent":
374
- if (update.presenceChangeEvent.userId === localUserId) {
413
+ if (update.userId === localUserId) {
375
414
  return;
376
415
  }
377
416
  break;
378
417
  case "customPresenceEvent":
379
- if (update.customPresenceEvent.userId === localUserId) {
418
+ if (update.userId === localUserId) {
380
419
  return;
381
420
  }
382
421
  break;
@@ -411,12 +450,10 @@ var FoundryEventService = class {
411
450
  throw new Error("Could not get current userId");
412
451
  }
413
452
  return this.eventService.publish(channelId, {
414
- custom: {
415
- clientId: session.clientId,
416
- eventData: messageData,
417
- // FIXME: why do we have to send this, we are authenticated
418
- userId
419
- },
453
+ clientId: session.clientId,
454
+ eventData: messageData,
455
+ // FIXME: why do we have to send this, we are authenticated
456
+ userId,
420
457
  type: "custom"
421
458
  }).catch((error) => {
422
459
  this.logger.error("Failed to publish custom presence", error, {
@@ -523,8 +560,8 @@ var FoundryEventService = class {
523
560
  return documentId;
524
561
  }
525
562
  };
526
- function createFoundryEventService(app, cometd) {
527
- return new FoundryEventService(app, cometd);
563
+ function createFoundryEventService(app, cometdLoader) {
564
+ return new FoundryEventServiceImpl(app, cometdLoader);
528
565
  }
529
566
  function isEditDescription(obj) {
530
567
  return obj != null && typeof obj === "object" && "data" in obj && "model" in obj && typeof obj.model === "object" && obj.model != null && pack_documentSchema_modelTypes.hasMetadata(obj.model);
@@ -539,8 +576,6 @@ function createDocumentEditDescription(editDescription) {
539
576
  };
540
577
  }
541
578
 
542
- exports.EventServiceCometD = EventServiceCometD;
543
- exports.FoundryEventService = FoundryEventService;
544
579
  exports.createFoundryEventService = createFoundryEventService;
545
580
  //# sourceMappingURL=index.cjs.map
546
581
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["cometd","CometD","AckExtension","getAuthModule","generateId","Base64","DocumentLoadStatus","y","justOnce","hasMetadata","getMetadata"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAuthModule } from \"@palantir/pack.auth\";\nimport { AckExtension, CometD } from \"cometd\";\n// side-effect shenanigans imports the class impl to cometd module\nimport \"cometd/AckExtension.js\";\nconst BEARER_TOKEN_FIELD = \"bearer-token\";\nconst EXTENSION_ACK = \"AckExtension\";\nconst EXTENSION_HANDSHAKE_TOKEN = \"handshakeToken\";\nconst META_CHANNEL_HANDSHAKE = \"/meta/handshake\";\nexport class EventServiceCometD {\n logger;\n initializePromise;\n subscriptionById = new Map();\n tokenExtension = new TokenExtension();\n nextSubscriptionHandle = 0;\n constructor(app, cometd = new CometD()) {\n this.app = app;\n this.cometd = cometd;\n this.logger = app.config.logger.child({}, {\n msgPrefix: \"EventServiceCometD\"\n });\n this.configureCometd();\n this.cometd.registerExtension(EXTENSION_ACK, new AckExtension());\n this.cometd.registerExtension(EXTENSION_HANDSHAKE_TOKEN, this.tokenExtension);\n\n // TODO: Support binary messages\n // this.cometd.registerExtension(BINARY_EXTENSION_NAME, new BinaryExtension());\n\n // Any time the token changes, update the extension so reconnection requests use the new token.\n // This will also be called on initial token set when the auth module is initialized.\n getAuthModule(app).onTokenChange(token => {\n this.tokenExtension.setToken(token);\n });\n }\n initialize() {\n if (this.initializePromise != null) {\n return this.initializePromise;\n }\n this.initializePromise = new Promise(resolve => {\n this.cometd.addListener(META_CHANNEL_HANDSHAKE, ({\n clientId,\n connectionType,\n error,\n successful\n }) => {\n if (successful) {\n this.logger.info(\"CometD handshake successful\", {\n clientId,\n connectionType\n });\n resolve();\n this.cometd.batch(() => {\n this.subscriptionById.forEach((subscription, subscriptionId) => {\n this.logger.debug(\"Resubscribing to channel\", {\n channel: subscription.eventChannel,\n subscriptionId\n });\n const subscribeProps = subscription.getSubscriptionRequest?.();\n subscription.handle = this.cometd.resubscribe(subscription.handle, {\n ext: subscribeProps\n });\n });\n });\n } else {\n this.logger.warn(\"CometD handshake failed\", {\n clientId,\n error\n });\n }\n });\n const authModule = getAuthModule(this.app);\n void authModule.getToken().then(token => {\n this.logger.info(\"Initializing CometD with token\");\n this.tokenExtension.setToken(token);\n this.cometd.handshake();\n });\n });\n return this.initializePromise;\n }\n async subscribe(channel, onMessage, getSubscriptionRequest) {\n await this.initialize();\n const subscriptionId = (this.nextSubscriptionHandle++).toString(10);\n return new Promise((resolve, reject) => {\n const messageHandler = receivedData => {\n if (!this.subscriptionById.has(subscriptionId)) {\n this.logger.info(\"Dropping message for unsubscribing channel\", {\n channel,\n subscriptionId\n });\n return;\n }\n this.logger.debug(\"Received message on channel\", {\n channel,\n subscriptionId,\n hasData: receivedData.data != null\n });\n onMessage(receivedData.data);\n };\n const subscribeCallback = message => {\n if (message.successful) {\n this.logger.debug(\"Successfully subscribed to channel\", {\n channel,\n subscriptionId\n });\n resolve(subscriptionId);\n } else {\n this.subscriptionById.delete(subscriptionId);\n // TODO: Is failure really expected? It's not on the type...\n const maybeFailureReason = \"failure\" in message && typeof message.failure === \"object\" && message.failure && \"reason\" in message.failure && typeof message.failure.reason === \"string\" ? message.failure.reason : undefined;\n this.logger.error(\"Failed to subscribe to channel \", {\n channel,\n error: message.error,\n maybeFailureReason\n });\n const errorMessage = message.error ?? (maybeFailureReason != null ? `(no error message provided by server, a guess: ${maybeFailureReason})` : \"(no error message provided by server)\");\n reject(new Error(`Failed to subscribe to channel ${channel}: ${errorMessage}`));\n }\n };\n const ext = getSubscriptionRequest?.();\n const subscriptionHandle = ext != null ? this.cometd.subscribe(channel, messageHandler, {\n ext\n }, subscribeCallback) : this.cometd.subscribe(channel, messageHandler, subscribeCallback);\n this.subscriptionById.set(subscriptionId, {\n handle: subscriptionHandle,\n getSubscriptionRequest,\n eventChannel: channel\n });\n });\n }\n unsubscribe(subscriptionId) {\n const subscription = this.subscriptionById.get(subscriptionId);\n if (subscription == null) {\n this.logger.warn(\"Attempted to unsubscribe from unknown subscriptionId\", {\n subscriptionId\n });\n return;\n }\n const {\n handle,\n eventChannel\n } = subscription;\n this.subscriptionById.delete(subscriptionId);\n this.cometd.unsubscribe(handle, message => {\n if (!message.successful) {\n this.logger.warn(\"Server unsubscribe confirmation failed\", {\n eventChannel,\n subscriptionId,\n error: message.error\n });\n }\n });\n }\n async publish(channel, content) {\n await this.initialize();\n return new Promise((resolve, reject) => {\n this.cometd.publish(channel, content, message => {\n if (message.successful) {\n this.logger.debug(\"Successfully published message\", channel, {\n content\n });\n resolve();\n } else {\n const error = new Error(`Failed to publish to ${channel}`, {\n cause: message.error\n });\n this.logger.error(\"Failed to publish\", {\n channel,\n error\n });\n reject(error);\n }\n });\n });\n }\n setLogLevel(logLevel) {\n this.configureCometd(logLevel);\n }\n configureCometd(logLevel) {\n const url = getCometDWebsocketUrl(this.app.config);\n this.logger.info(\"Configuring cometD \", {\n url\n });\n this.cometd.configure({\n url,\n // NOTE : Allow higher latency on busy networks to avoid retry loops when servers or networks fall behind.\n maxNetworkDelay: 30_000,\n logLevel,\n autoBatch: true\n });\n }\n}\nfunction getCometDWebsocketUrl(appConfig) {\n const httpUrl = new URL(`${appConfig.remote.packWsPath}/cometd`, appConfig.remote.baseUrl);\n httpUrl.protocol.replace(/https?/, \"ws\");\n // TODO: likely need a specific port for ingest - all of this should be in in appConfig\n return httpUrl.href;\n}\nclass TokenExtension {\n currentToken;\n setToken(token) {\n this.currentToken = token;\n }\n outgoing = message => {\n // Always use the latest token when doing a handshake (handles reconnects)\n if (message.channel === META_CHANNEL_HANDSHAKE) {\n if (this.currentToken) {\n message.ext ??= {};\n message.ext[BEARER_TOKEN_FIELD] = this.currentToken;\n }\n }\n return message;\n };\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAuthModule } from \"@palantir/pack.auth\";\nimport { generateId, justOnce } from \"@palantir/pack.core\";\nimport { getMetadata, hasMetadata } from \"@palantir/pack.document-schema.model-types\";\nimport { DocumentLoadStatus } from \"@palantir/pack.state.core\";\nimport { Base64 } from \"js-base64\";\nimport * as y from \"yjs\";\nimport { EventServiceCometD } from \"./cometd/EventServiceCometD.js\";\n\n// TODO: replace with @osdk/foundry.pack types when they land.\n\n// TODO: presence api should have an eventType so we don't need extra wrapper here.\n\nconst UPDATE_ORIGIN_REMOTE = \"remote\";\nconst getDocumentUpdatesChannelId = documentId => `/document/${documentId}/updates`;\nconst getDocumentPublishChannelId = documentId => `/document/${documentId}/publish`;\nconst getDocumentActivityChannelId = documentId => `/document/${documentId}/activity`;\nconst getDocumentPresenceChannelId = documentId => `/document/${documentId}/presence`;\nconst getDocumentPresencePublishChannelId = documentId => `/document/${documentId}/presence-publish`;\n/**\n * This manages event subscriptions and publishing of document related events via\n * our PACK Foundry backend's cometd service.\n */\nexport class FoundryEventService {\n eventService;\n logger;\n sessions = new Map();\n constructor(app, cometd) {\n this.app = app;\n this.eventService = new EventServiceCometD(app, cometd);\n this.logger = app.config.logger.child({}, {\n level: \"debug\",\n msgPrefix: \"FoundryEventService\"\n });\n }\n getOrCreateSession(documentId, yDoc) {\n const sessionId = this.getSessionId(documentId);\n let session = this.sessions.get(sessionId);\n if (!session) {\n session = {\n activitySubscriptionId: undefined,\n clientId: crypto.randomUUID(),\n documentId,\n documentSubscriptionId: undefined,\n lastRevisionId: undefined,\n localYDocUpdateHandler: undefined,\n presenceSubscriptionId: undefined,\n yDoc\n };\n this.sessions.set(sessionId, session);\n }\n return session;\n }\n startDocumentSync(documentId, yDoc, onStatusChange) {\n const session = this.getOrCreateSession(documentId, yDoc);\n if (session.documentSubscriptionId != null) {\n throw new Error(`Document data sync already active for document ${documentId}`);\n }\n const localYDocUpdateHandler = (update, origin) => {\n if (origin === UPDATE_ORIGIN_REMOTE) {\n return;\n }\n const lastRevisionId = session.lastRevisionId;\n if (lastRevisionId == null) {\n this.logger.error(\"Cannot publish document update before initial load is complete. The local state will remain inconsistent.\", {\n docId: documentId\n });\n return;\n }\n const publishChannelId = getDocumentPublishChannelId(documentId);\n const editId = generateId();\n const description = isEditDescription(origin) ? createDocumentEditDescription(origin) : undefined;\n void this.eventService.publish(publishChannelId, {\n clientId: session.clientId,\n description,\n editId,\n yjsUpdate: {\n data: Base64.fromUint8Array(update)\n }\n }).catch(error => {\n this.logger.error(\"Failed to publish document update\", error, {\n docId: documentId\n });\n });\n };\n session.localYDocUpdateHandler = localYDocUpdateHandler;\n yDoc.on(\"update\", localYDocUpdateHandler);\n onStatusChange({\n load: DocumentLoadStatus.LOADING\n });\n const channelId = getDocumentUpdatesChannelId(documentId);\n this.eventService.subscribe(channelId, message => {\n if (session.localYDocUpdateHandler !== localYDocUpdateHandler) {\n return;\n }\n this.handleDocumentUpdateMessage(session, message, yDoc, onStatusChange);\n }, () => ({\n clientId: session.clientId,\n lastRevisionId: session.lastRevisionId?.toString()\n })).then(subscriptionId => {\n if (session.localYDocUpdateHandler === localYDocUpdateHandler) {\n session.documentSubscriptionId = subscriptionId;\n } else {\n this.eventService.unsubscribe(subscriptionId);\n this.sessions.delete(this.getSessionId(documentId));\n }\n }).catch(e => {\n if (session.localYDocUpdateHandler === localYDocUpdateHandler) {\n const error = new Error(\"Failed to setup document data subscription\", {\n cause: e\n });\n onStatusChange({\n error,\n load: DocumentLoadStatus.ERROR\n });\n } else {\n this.logger.warn(\"Document data subscription error after subscription was closed\", {\n docId: documentId,\n error: e\n });\n }\n });\n return {\n clientId: session.clientId,\n documentId: session.documentId\n };\n }\n subscribeToActivityUpdates(documentId, callback) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentActivityChannelId(documentId);\n return this.eventService.subscribe(channelId, event => {\n this.logger.debug(\"Received activity event\", {\n docId: documentId,\n event\n });\n callback(event);\n }).then(subscriptionId => {\n session.activitySubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to activity updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to activity updates\", {\n cause: e\n });\n });\n }\n subscribeToPresenceUpdates(documentId, callback, options = {}) {\n const {\n ignoreSelfUpdates = true\n } = options;\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresenceChannelId(documentId);\n return this.eventService.subscribe(channelId, update => {\n // TODO: api should provide clientId so we filter on our presence messages only,\n // but allow apps to decide what they do with same-user-different-client messages ie\n // from different tabs or devices.\n const localUserId = getAuthModule(this.app).getCurrentUser(true)?.userId;\n if (ignoreSelfUpdates && localUserId != null) {\n switch (update.type) {\n case \"presenceChangeEvent\":\n if (update.presenceChangeEvent.userId === localUserId) {\n return;\n }\n break;\n case \"customPresenceEvent\":\n if (update.customPresenceEvent.userId === localUserId) {\n return;\n }\n break;\n default:\n update;\n break;\n }\n }\n this.logger.debug(\"Received presence update\", {\n docId: documentId,\n updateType: update.type\n });\n callback(update);\n }).then(subscriptionId => {\n session.presenceSubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to presence updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to presence updates\", {\n cause: e\n });\n });\n }\n publishCustomPresence(documentId, eventType, eventData) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\n const messageData = {\n eventData,\n eventType\n };\n // TODO: maybe the session should hold userId\n // Though would need better reconnection handling to ensure userId doesn't change.\n const userId = getAuthModule(this.app).getCurrentUser(true)?.userId;\n if (userId == null) {\n throw new Error(\"Could not get current userId\");\n }\n return this.eventService.publish(channelId, {\n custom: {\n clientId: session.clientId,\n eventData: messageData,\n // FIXME: why do we have to send this, we are authenticated\n userId\n },\n type: \"custom\"\n }).catch(error => {\n this.logger.error(\"Failed to publish custom presence\", error, {\n docId: documentId\n });\n throw error;\n });\n }\n stopDocumentSync(session) {\n const sessionId = this.getSessionId(session.documentId);\n const internalSession = this.sessions.get(sessionId);\n if (internalSession == null) {\n this.logger.warn(\"Attempted to stop sync for unknown session\", {\n documentId: session.documentId,\n clientId: session.clientId\n });\n return;\n }\n if (internalSession.localYDocUpdateHandler != null) {\n internalSession.yDoc?.off(\"update\", internalSession.localYDocUpdateHandler);\n internalSession.localYDocUpdateHandler = undefined;\n }\n if (internalSession.activitySubscriptionId) {\n this.eventService.unsubscribe(internalSession.activitySubscriptionId);\n }\n if (internalSession.presenceSubscriptionId) {\n this.eventService.unsubscribe(internalSession.presenceSubscriptionId);\n }\n if (internalSession.documentSubscriptionId) {\n this.eventService.unsubscribe(internalSession.documentSubscriptionId);\n this.sessions.delete(sessionId);\n }\n }\n handleDocumentUpdateMessage(session, message, yDoc, onStatusChange) {\n switch (message.type) {\n case \"error\":\n const {\n args,\n code,\n errorInstanceId\n } = message;\n this.logger.error(\"Received document update error message\", {\n docId: session.documentId,\n code,\n errorInstanceId,\n args\n });\n onStatusChange({\n error: new Error(`Subscription in error state [${errorInstanceId}]`, {\n cause: message\n }),\n load: DocumentLoadStatus.ERROR\n });\n break;\n case \"update\":\n const {\n baseRevisionId,\n clientId,\n revisionId,\n update\n } = message;\n const data = update != null && typeof update.data === \"string\" ? Base64.toUint8Array(update.data) : undefined;\n const messageDetail = {\n baseRevisionId,\n clientId,\n revisionId,\n updateSize: data?.byteLength ?? 0\n };\n\n // FIXME: the typescript generators for api types come out as string, hard to be clear that they are numbers.\n if (session.lastRevisionId != null && Number(baseRevisionId) !== session.lastRevisionId) {\n this.logger.error(\"Got unexpected update for baseRevisionId\", {\n docId: session.documentId,\n lastRevisionId: session.lastRevisionId,\n message: messageDetail\n });\n return;\n }\n this.logger.debug(\"Applying remote Y.js update\", {\n docId: session.documentId,\n lastRevisionId: session.lastRevisionId,\n message: messageDetail\n });\n session.lastRevisionId = Number(revisionId);\n if (data != null) {\n y.applyUpdate(yDoc, data, UPDATE_ORIGIN_REMOTE);\n }\n onStatusChange({\n load: DocumentLoadStatus.LOADED\n });\n break;\n default:\n message;\n const {\n type\n } = message;\n justOnce(`unknown-collab-update-type:${type}`, () => {\n this.logger.warn(\"Received unknown DocumentUpdateMessage type. This is only warned the first occurrence.\", {\n docId: session.documentId,\n updateType: type\n });\n });\n break;\n }\n }\n getSessionId(documentId) {\n return documentId;\n }\n}\nexport function createFoundryEventService(app, cometd) {\n return new FoundryEventService(app, cometd);\n}\nfunction isEditDescription(obj) {\n return obj != null && typeof obj === \"object\" && \"data\" in obj && \"model\" in obj && typeof obj.model === \"object\" && obj.model != null && hasMetadata(obj.model);\n}\nfunction createDocumentEditDescription(editDescription) {\n return {\n eventData: {\n data: editDescription.data,\n version: 1\n },\n eventType: getMetadata(editDescription.model).name\n };\n}"]}
1
+ {"version":3,"sources":["../../src/cometd/lazyLoadCometD.ts","../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["getAuthModule","generateId","Base64","DocumentLoadStatus","y","justOnce","hasMetadata","getMetadata"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport async function lazyLoadCometD() {\n const cometdModule = await import(\"cometd\");\n // cometd module does declare the extensions, however they are added to the module as side-effects\n // by importing the submodule extension files. So for any we use we'll need to import them explicitly.\n // Note that this file should be included in package.json \"sideEffects\" to avoid tree-shaking.\n\n // TODO: switch back to dynamic import with side-effect loading when supported by new cometD version. Requires\n // backend version upgrade first.\n // AckExtension.js modifies the cometd module as a side-effect to add AckExtension.\n // We need to capture the returned constructor because with ESM bundlers, the module reference\n // may not reflect the mutation.\n // @ts-expect-error TS2307: No type declarations for cometd/AckExtension.js, but its default export is the AckExtension constructor\n const {\n default: AckExtension\n } = await import(\"cometd/AckExtension.js\");\n return {\n ...cometdModule,\n AckExtension\n };\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAuthModule } from \"@palantir/pack.auth\";\nimport { lazyLoadCometD } from \"./lazyLoadCometD.js\";\nconst BEARER_TOKEN_FIELD = \"bearer-token\";\nconst EXTENSION_ACK = \"AckExtension\";\nconst EXTENSION_HANDSHAKE_TOKEN = \"handshakeToken\";\nconst META_CHANNEL_HANDSHAKE = \"/meta/handshake\";\nexport class EventServiceCometD {\n logger;\n initializePromise;\n subscriptionById = new Map();\n tokenExtension = new TokenExtension();\n nextSubscriptionHandle = 0;\n cometd;\n constructor(app, cometdLoader = lazyLoadCometD) {\n this.app = app;\n this.cometdLoader = cometdLoader;\n this.logger = app.config.logger.child({}, {\n msgPrefix: \"EventServiceCometD\"\n });\n\n // Any time the token changes, update the extension so reconnection requests use the new token.\n // This will also be called on initial token set when the auth module is initialized.\n getAuthModule(app).onTokenChange(token => {\n this.tokenExtension.setToken(token);\n });\n }\n async initialize() {\n if (this.initializePromise != null) {\n return this.initializePromise;\n }\n this.initializePromise = (async () => {\n if (this.cometd == null) {\n const {\n AckExtension,\n CometD\n } = await this.cometdLoader();\n this.cometd = new CometD();\n this.configureCometd();\n this.cometd.registerExtension(EXTENSION_ACK, new AckExtension());\n this.cometd.registerExtension(EXTENSION_HANDSHAKE_TOKEN, this.tokenExtension);\n\n // TODO: Support binary messages\n // this.cometd.registerExtension(BINARY_EXTENSION_NAME, new BinaryExtension());\n }\n await new Promise(resolve => {\n this.cometd.addListener(META_CHANNEL_HANDSHAKE, ({\n clientId,\n connectionType,\n error,\n successful\n }) => {\n if (successful) {\n this.logger.info(\"CometD handshake successful\", {\n clientId,\n connectionType\n });\n resolve();\n this.cometd.batch(() => {\n this.subscriptionById.forEach((subscription, subscriptionId) => {\n this.logger.debug(\"Resubscribing to channel\", {\n channel: subscription.eventChannel,\n subscriptionId\n });\n const subscribeProps = subscription.getSubscriptionRequest?.();\n subscription.handle = this.cometd.resubscribe(subscription.handle, {\n ext: subscribeProps\n });\n });\n });\n } else {\n this.logger.warn(\"CometD handshake failed\", {\n clientId,\n error\n });\n }\n });\n const authModule = getAuthModule(this.app);\n void authModule.getToken().then(token => {\n this.logger.info(\"Initializing CometD with token\");\n this.tokenExtension.setToken(token);\n this.cometd.handshake();\n });\n });\n })();\n return this.initializePromise;\n }\n async subscribe(channel, onMessage, getSubscriptionRequest) {\n await this.initialize();\n if (this.cometd == null) {\n throw new Error(\"CometD not initialized\");\n }\n const subscriptionId = (this.nextSubscriptionHandle++).toString(10);\n return new Promise((resolve, reject) => {\n const messageHandler = receivedData => {\n if (!this.subscriptionById.has(subscriptionId)) {\n this.logger.info(\"Dropping message for unsubscribing channel\", {\n channel,\n subscriptionId\n });\n return;\n }\n this.logger.debug(\"Received message on channel\", {\n channel,\n subscriptionId,\n hasData: receivedData.data != null\n });\n onMessage(receivedData.data);\n };\n const subscribeCallback = message => {\n if (message.successful) {\n this.logger.debug(\"Successfully subscribed to channel\", {\n channel,\n subscriptionId\n });\n resolve(subscriptionId);\n } else {\n this.subscriptionById.delete(subscriptionId);\n // TODO: Is failure really expected? It's not on the type...\n const maybeFailureReason = \"failure\" in message && typeof message.failure === \"object\" && message.failure && \"reason\" in message.failure && typeof message.failure.reason === \"string\" ? message.failure.reason : undefined;\n this.logger.error(\"Failed to subscribe to channel \", {\n channel,\n error: message.error,\n maybeFailureReason\n });\n const errorMessage = message.error ?? (maybeFailureReason != null ? `(no error message provided by server, a guess: ${maybeFailureReason})` : \"(no error message provided by server)\");\n reject(new Error(`Failed to subscribe to channel ${channel}: ${errorMessage}`));\n }\n };\n const ext = getSubscriptionRequest?.();\n const subscriptionHandle = ext != null ? this.cometd.subscribe(channel, messageHandler, {\n ext\n }, subscribeCallback) : this.cometd.subscribe(channel, messageHandler, subscribeCallback);\n this.subscriptionById.set(subscriptionId, {\n handle: subscriptionHandle,\n getSubscriptionRequest,\n eventChannel: channel\n });\n });\n }\n unsubscribe(subscriptionId) {\n const subscription = this.subscriptionById.get(subscriptionId);\n if (subscription == null) {\n this.logger.warn(\"Attempted to unsubscribe from unknown subscriptionId\", {\n subscriptionId\n });\n return;\n }\n const {\n handle,\n eventChannel\n } = subscription;\n this.subscriptionById.delete(subscriptionId);\n if (this.cometd == null) {\n this.logger.warn(\"CometD not initialized, cannot unsubscribe\", {\n subscriptionId\n });\n return;\n }\n this.cometd.unsubscribe(handle, message => {\n if (!message.successful) {\n this.logger.warn(\"Server unsubscribe confirmation failed\", {\n eventChannel,\n subscriptionId,\n error: message.error\n });\n }\n });\n }\n async publish(channel, content) {\n await this.initialize();\n if (this.cometd == null) {\n throw new Error(\"CometD not initialized\");\n }\n return new Promise((resolve, reject) => {\n this.cometd.publish(channel, content, message => {\n if (message.successful) {\n this.logger.debug(\"Successfully published message\", channel, {\n content\n });\n resolve();\n } else {\n const error = new Error(`Failed to publish to ${channel}`, {\n cause: message.error\n });\n this.logger.error(\"Failed to publish\", {\n channel,\n error\n });\n reject(error);\n }\n });\n });\n }\n setLogLevel(logLevel) {\n this.configureCometd(logLevel);\n }\n configureCometd(logLevel) {\n if (this.cometd == null) {\n return;\n }\n const url = getCometDWebsocketUrl(this.app.config);\n this.logger.info(\"Configuring cometD \", {\n url\n });\n this.cometd.configure({\n url,\n // NOTE : Allow higher latency on busy networks to avoid retry loops when servers or networks fall behind.\n maxNetworkDelay: 30_000,\n logLevel,\n autoBatch: true\n });\n }\n}\nfunction getCometDWebsocketUrl(appConfig) {\n const httpUrl = new URL(`${appConfig.remote.packWsPath}/cometd`, appConfig.remote.baseUrl);\n httpUrl.protocol.replace(/https?/, \"ws\");\n // TODO: likely need a specific port for ingest - all of this should be in in appConfig\n return httpUrl.href;\n}\nclass TokenExtension {\n currentToken;\n setToken(token) {\n this.currentToken = token;\n }\n outgoing = message => {\n // Always use the latest token when doing a handshake (handles reconnects)\n if (message.channel === META_CHANNEL_HANDSHAKE) {\n if (this.currentToken) {\n message.ext ??= {};\n message.ext[BEARER_TOKEN_FIELD] = this.currentToken;\n }\n }\n return message;\n };\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getAuthModule } from \"@palantir/pack.auth\";\nimport { generateId, justOnce } from \"@palantir/pack.core\";\nimport { getMetadata, hasMetadata } from \"@palantir/pack.document-schema.model-types\";\nimport { DocumentLoadStatus } from \"@palantir/pack.state.core\";\nimport { Base64 } from \"js-base64\";\nimport * as y from \"yjs\";\nimport { EventServiceCometD } from \"./cometd/EventServiceCometD.js\";\n\n// TODO: replace with @osdk/foundry.pack types when they land.\n\n// TODO: presence api should have an eventType so we don't need extra wrapper here.\n\nconst UPDATE_ORIGIN_REMOTE = \"remote\";\nconst getDocumentUpdatesChannelId = documentId => `/document/${documentId}/updates`;\nconst getDocumentPublishChannelId = documentId => `/document/${documentId}/publish`;\nconst getDocumentActivityChannelId = documentId => `/document/${documentId}/activity`;\nconst getDocumentPresenceChannelId = documentId => `/document/${documentId}/presence`;\nconst getDocumentPresencePublishChannelId = documentId => `/document/${documentId}/presence-publish`;\n\n/**\n * This manages event subscriptions and publishing of document related events via\n * our PACK Foundry backend's cometd service.\n */\n\nclass FoundryEventServiceImpl {\n eventService;\n logger;\n sessions = new Map();\n constructor(app, cometdLoader) {\n this.app = app;\n this.eventService = new EventServiceCometD(app, cometdLoader);\n this.logger = app.config.logger.child({}, {\n level: \"debug\",\n msgPrefix: \"FoundryEventService\"\n });\n }\n getOrCreateSession(documentId, yDoc) {\n const sessionId = this.getSessionId(documentId);\n let session = this.sessions.get(sessionId);\n if (!session) {\n session = {\n activitySubscriptionId: undefined,\n clientId: crypto.randomUUID(),\n documentId,\n documentSubscriptionId: undefined,\n lastRevisionId: undefined,\n localYDocUpdateHandler: undefined,\n presenceSubscriptionId: undefined,\n yDoc\n };\n this.sessions.set(sessionId, session);\n }\n return session;\n }\n startDocumentSync(documentId, yDoc, onStatusChange) {\n const session = this.getOrCreateSession(documentId, yDoc);\n if (session.documentSubscriptionId != null) {\n throw new Error(`Document data sync already active for document ${documentId}`);\n }\n const localYDocUpdateHandler = (update, origin) => {\n if (origin === UPDATE_ORIGIN_REMOTE) {\n return;\n }\n const lastRevisionId = session.lastRevisionId;\n if (lastRevisionId == null) {\n this.logger.error(\"Cannot publish document update before initial load is complete. The local state will remain inconsistent.\", {\n docId: documentId\n });\n return;\n }\n const publishChannelId = getDocumentPublishChannelId(documentId);\n const editId = generateId();\n const description = isEditDescription(origin) ? createDocumentEditDescription(origin) : undefined;\n void this.eventService.publish(publishChannelId, {\n clientId: session.clientId,\n description,\n editId,\n yjsUpdate: {\n data: Base64.fromUint8Array(update)\n }\n }).catch(error => {\n this.logger.error(\"Failed to publish document update\", error, {\n docId: documentId\n });\n });\n };\n session.localYDocUpdateHandler = localYDocUpdateHandler;\n yDoc.on(\"update\", localYDocUpdateHandler);\n onStatusChange({\n load: DocumentLoadStatus.LOADING\n });\n const channelId = getDocumentUpdatesChannelId(documentId);\n this.eventService.subscribe(channelId, message => {\n if (session.localYDocUpdateHandler !== localYDocUpdateHandler) {\n return;\n }\n this.handleDocumentUpdateMessage(session, message, yDoc, onStatusChange);\n }, () => ({\n clientId: session.clientId,\n lastRevisionId: session.lastRevisionId?.toString()\n })).then(subscriptionId => {\n if (session.localYDocUpdateHandler === localYDocUpdateHandler) {\n session.documentSubscriptionId = subscriptionId;\n } else {\n this.eventService.unsubscribe(subscriptionId);\n this.sessions.delete(this.getSessionId(documentId));\n }\n }).catch(e => {\n if (session.localYDocUpdateHandler === localYDocUpdateHandler) {\n const error = new Error(\"Failed to setup document data subscription\", {\n cause: e\n });\n onStatusChange({\n error,\n load: DocumentLoadStatus.ERROR\n });\n } else {\n this.logger.warn(\"Document data subscription error after subscription was closed\", {\n docId: documentId,\n error: e\n });\n }\n });\n return {\n clientId: session.clientId,\n documentId: session.documentId\n };\n }\n subscribeToActivityUpdates(documentId, callback) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentActivityChannelId(documentId);\n return this.eventService.subscribe(channelId, event => {\n this.logger.debug(\"Received activity event\", {\n docId: documentId,\n event\n });\n callback(event);\n }).then(subscriptionId => {\n session.activitySubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to activity updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to activity updates\", {\n cause: e\n });\n });\n }\n subscribeToPresenceUpdates(documentId, callback, options = {}) {\n const {\n ignoreSelfUpdates = true\n } = options;\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresenceChannelId(documentId);\n return this.eventService.subscribe(channelId, update => {\n // TODO: api should provide clientId so we filter on our presence messages only,\n // but allow apps to decide what they do with same-user-different-client messages ie\n // from different tabs or devices.\n const localUserId = getAuthModule(this.app).getCurrentUser(true)?.userId;\n if (ignoreSelfUpdates && localUserId != null) {\n switch (update.type) {\n case \"presenceChangeEvent\":\n if (update.userId === localUserId) {\n return;\n }\n break;\n case \"customPresenceEvent\":\n if (update.userId === localUserId) {\n return;\n }\n break;\n default:\n update;\n break;\n }\n }\n this.logger.debug(\"Received presence update\", {\n docId: documentId,\n updateType: update.type\n });\n callback(update);\n }).then(subscriptionId => {\n session.presenceSubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to presence updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to presence updates\", {\n cause: e\n });\n });\n }\n publishCustomPresence(documentId, eventType, eventData) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\n const messageData = {\n eventData,\n eventType\n };\n // TODO: maybe the session should hold userId\n // Though would need better reconnection handling to ensure userId doesn't change.\n const userId = getAuthModule(this.app).getCurrentUser(true)?.userId;\n if (userId == null) {\n throw new Error(\"Could not get current userId\");\n }\n return this.eventService.publish(channelId, {\n clientId: session.clientId,\n eventData: messageData,\n // FIXME: why do we have to send this, we are authenticated\n userId,\n type: \"custom\"\n }).catch(error => {\n this.logger.error(\"Failed to publish custom presence\", error, {\n docId: documentId\n });\n throw error;\n });\n }\n stopDocumentSync(session) {\n const sessionId = this.getSessionId(session.documentId);\n const internalSession = this.sessions.get(sessionId);\n if (internalSession == null) {\n this.logger.warn(\"Attempted to stop sync for unknown session\", {\n documentId: session.documentId,\n clientId: session.clientId\n });\n return;\n }\n if (internalSession.localYDocUpdateHandler != null) {\n internalSession.yDoc?.off(\"update\", internalSession.localYDocUpdateHandler);\n internalSession.localYDocUpdateHandler = undefined;\n }\n if (internalSession.activitySubscriptionId) {\n this.eventService.unsubscribe(internalSession.activitySubscriptionId);\n }\n if (internalSession.presenceSubscriptionId) {\n this.eventService.unsubscribe(internalSession.presenceSubscriptionId);\n }\n if (internalSession.documentSubscriptionId) {\n this.eventService.unsubscribe(internalSession.documentSubscriptionId);\n this.sessions.delete(sessionId);\n }\n }\n handleDocumentUpdateMessage(session, message, yDoc, onStatusChange) {\n switch (message.type) {\n case \"error\":\n const {\n args,\n code,\n errorInstanceId\n } = message;\n this.logger.error(\"Received document update error message\", {\n docId: session.documentId,\n code,\n errorInstanceId,\n args\n });\n onStatusChange({\n error: new Error(`Subscription in error state [${errorInstanceId}]`, {\n cause: message\n }),\n load: DocumentLoadStatus.ERROR\n });\n break;\n case \"update\":\n const {\n baseRevisionId,\n clientId,\n revisionId,\n update\n } = message;\n const data = update != null && typeof update.data === \"string\" ? Base64.toUint8Array(update.data) : undefined;\n const messageDetail = {\n baseRevisionId,\n clientId,\n revisionId,\n updateSize: data?.byteLength ?? 0\n };\n\n // FIXME: the typescript generators for api types come out as string, hard to be clear that they are numbers.\n if (session.lastRevisionId != null && Number(baseRevisionId) !== session.lastRevisionId) {\n this.logger.error(\"Got unexpected update for baseRevisionId\", {\n docId: session.documentId,\n lastRevisionId: session.lastRevisionId,\n message: messageDetail\n });\n return;\n }\n this.logger.debug(\"Applying remote Y.js update\", {\n docId: session.documentId,\n lastRevisionId: session.lastRevisionId,\n message: messageDetail\n });\n session.lastRevisionId = Number(revisionId);\n if (data != null) {\n y.applyUpdate(yDoc, data, UPDATE_ORIGIN_REMOTE);\n }\n onStatusChange({\n load: DocumentLoadStatus.LOADED\n });\n break;\n default:\n message;\n const {\n type\n } = message;\n justOnce(`unknown-collab-update-type:${type}`, () => {\n this.logger.warn(\"Received unknown DocumentUpdateMessage type. This is only warned the first occurrence.\", {\n docId: session.documentId,\n updateType: type\n });\n });\n break;\n }\n }\n getSessionId(documentId) {\n return documentId;\n }\n}\nexport function createFoundryEventService(app, /** @internal */\ncometdLoader) {\n return new FoundryEventServiceImpl(app, cometdLoader);\n}\nfunction isEditDescription(obj) {\n return obj != null && typeof obj === \"object\" && \"data\" in obj && \"model\" in obj && typeof obj.model === \"object\" && obj.model != null && hasMetadata(obj.model);\n}\nfunction createDocumentEditDescription(editDescription) {\n return {\n eventData: {\n data: editDescription.data,\n version: 1\n },\n eventType: getMetadata(editDescription.model).name\n };\n}"]}
@@ -1,92 +1,22 @@
1
+ import { ActivityCollaborativeUpdate, PresenceCollaborativeUpdate } from '@osdk/foundry.pack';
1
2
  import { Branded, PackAppInternal } from '@palantir/pack.core';
2
- import { CometD } from 'cometd';
3
- import { ActivityCollaborativeUpdate, UserId, ClientId } from '@osdk/foundry.pack';
4
3
  import { DocumentId } from '@palantir/pack.document-schema.model-types';
5
4
  import { DocumentSyncStatus } from '@palantir/pack.state.core';
6
5
  import * as y from 'yjs';
6
+ import { AckExtension, CometD } from 'cometd';
7
7
 
8
8
  type SubscriptionId = Branded<"eventService:subscriptionId">;
9
- type ChannelId = Branded<"eventService:channelId">;
10
- type TypedPublishChannelId<S = unknown> = ChannelId & {
11
- readonly _channelPublishType: S;
12
- };
13
- type TypedReceiveChannelId<R = unknown> = ChannelId & {
14
- readonly _channelReceiveType: R;
15
- };
16
- type EventServiceLogLevel = "warn" | "info" | "debug";
17
- interface EventService {
18
- /**
19
- * Subscribes to a channel
20
- * @param channel EventsChannel to subscribe to.
21
- * @param receivedEventCallback Callback that is called when an event is published to the channel.
22
- * @param getSubscriptionRequest Callback that is called when channel is resubscribed to after a disconnect
23
- * @returns Promise that resolves to the subscriptionId that can be used to unsubscribe.
24
- */
25
- subscribe<R extends object>(channel: TypedReceiveChannelId<R>, receivedEventCallback: (payload: R) => void, getSubscriptionRequest?: () => object): Promise<SubscriptionId>;
26
- /**
27
- * Unsubscribe from a channel.
28
- * @param subscriptionId SubscriptionId from the subscribe call.
29
- */
30
- unsubscribe(subscriptionId: SubscriptionId): void;
31
- /**
32
- * Publish to a channel.
33
- * @param channel Channel to publish to.
34
- * @param content Payload object to push to channel.
35
- * @returns Promise that resolves if the publish was successful and rejects if the publish fails.
36
- */
37
- publish<S extends object>(channel: TypedPublishChannelId<S>, content: S): Promise<void>;
38
- /**
39
- * Set log level for the service.
40
- * @param logLevel The log level, or undefined if no logging desired.
41
- */
42
- setLogLevel(logLevel?: EventServiceLogLevel): void;
43
- }
44
9
 
45
- declare class EventServiceCometD implements EventService {
46
- private readonly app;
47
- private readonly cometd;
48
- private readonly logger;
49
- private initializePromise;
50
- private readonly subscriptionById;
51
- private readonly tokenExtension;
52
- private nextSubscriptionHandle;
53
- constructor(app: PackAppInternal, cometd?: CometD);
54
- private initialize;
55
- subscribe<T extends object>(channel: TypedReceiveChannelId<T>, onMessage: (payload: T) => void, getSubscriptionRequest?: () => object): Promise<SubscriptionId>;
56
- unsubscribe(subscriptionId: SubscriptionId): void;
57
- publish<T extends object>(channel: TypedPublishChannelId<T>, content: T): Promise<void>;
58
- setLogLevel(logLevel?: EventServiceLogLevel): void;
59
- private configureCometd;
10
+ interface CometDLoader {
11
+ (): Promise<{
12
+ AckExtension: new () => AckExtension;
13
+ CometD: new () => CometD;
14
+ }>;
60
15
  }
61
16
 
62
17
  interface PresenceSubscriptionOptions {
63
18
  readonly ignoreSelfUpdates?: boolean;
64
19
  }
65
- interface PresencePublishMessageCustom {
66
- readonly type: "custom";
67
- readonly custom: {
68
- userId: UserId;
69
- clientId: ClientId;
70
- eventData: any;
71
- };
72
- }
73
- type PresencePublishMessage = PresencePublishMessageCustom;
74
- interface DocumentPresenceChangeEvent {
75
- readonly type: "presenceChangeEvent";
76
- readonly presenceChangeEvent: {
77
- readonly userId: UserId;
78
- readonly status: "PRESENT" | "NOT_PRESENT";
79
- };
80
- }
81
- interface CustomPresenceEvent {
82
- readonly type: "customPresenceEvent";
83
- readonly customPresenceEvent: {
84
- readonly userId: UserId;
85
- readonly clientId: ClientId;
86
- readonly eventData: any;
87
- };
88
- }
89
- type PresenceCollaborativeUpdate = DocumentPresenceChangeEvent | CustomPresenceEvent;
90
20
  interface SyncSession {
91
21
  readonly clientId: string;
92
22
  readonly documentId: DocumentId;
@@ -95,21 +25,15 @@ interface SyncSession {
95
25
  * This manages event subscriptions and publishing of document related events via
96
26
  * our PACK Foundry backend's cometd service.
97
27
  */
98
- declare class FoundryEventService {
99
- private readonly app;
100
- private readonly eventService;
101
- private readonly logger;
102
- private readonly sessions;
103
- constructor(app: PackAppInternal, cometd?: CometD);
104
- private getOrCreateSession;
28
+ interface FoundryEventService {
29
+ publishCustomPresence(documentId: DocumentId, eventType: string, eventData: unknown): Promise<void>;
105
30
  startDocumentSync(documentId: DocumentId, yDoc: y.Doc, onStatusChange: (status: Partial<DocumentSyncStatus>) => void): SyncSession;
31
+ stopDocumentSync(session: SyncSession): void;
106
32
  subscribeToActivityUpdates(documentId: DocumentId, callback: (event: ActivityCollaborativeUpdate) => void): Promise<SubscriptionId>;
107
33
  subscribeToPresenceUpdates(documentId: DocumentId, callback: (update: PresenceCollaborativeUpdate) => void, options?: PresenceSubscriptionOptions): Promise<SubscriptionId>;
108
- publishCustomPresence(documentId: DocumentId, eventType: string, eventData: unknown): Promise<void>;
109
- stopDocumentSync(session: SyncSession): void;
110
- private handleDocumentUpdateMessage;
111
- private getSessionId;
112
34
  }
113
- declare function createFoundryEventService(app: PackAppInternal, cometd?: CometD): FoundryEventService;
35
+ declare function createFoundryEventService(app: PackAppInternal,
36
+ /** @internal */
37
+ cometdLoader?: CometDLoader): FoundryEventService;
114
38
 
115
- export { type ChannelId, type CustomPresenceEvent, type DocumentPresenceChangeEvent, type EventService, EventServiceCometD, type EventServiceLogLevel, FoundryEventService, type PresenceCollaborativeUpdate, type PresencePublishMessage, type PresencePublishMessageCustom, type PresenceSubscriptionOptions, type SubscriptionId, type SyncSession, type TypedPublishChannelId, type TypedReceiveChannelId, createFoundryEventService };
39
+ export { type FoundryEventService, type PresenceSubscriptionOptions, type SyncSession, createFoundryEventService };