@palantir/pack.state.foundry-event 0.8.0 → 0.10.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 lint /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 lint /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > eslint ./src && dprint check --config $(find-up dprint.json) --allow-no-files
4
4
 
5
5
 
@@ -1,5 +1,5 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 transpileBrowser /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 transpileBrowser /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > monorepo-transpile -f esm -m bundle -t browser
4
4
 
5
5
  [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
@@ -1,5 +1,5 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 transpileCjs /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 transpileCjs /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > monorepo-transpile -f cjs -m bundle -t node
4
4
 
5
5
  [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
@@ -1,5 +1,5 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 transpileEsm /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 transpileEsm /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > monorepo-transpile -f esm -m bundle -t node
4
4
 
5
5
  [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D`
@@ -1,5 +1,5 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 transpileTypes /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 transpileTypes /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > monorepo-transpile -f esm -m types -t node
4
4
 
5
5
  👍
@@ -1,4 +1,4 @@
1
1
 
2
- > @palantir/pack.state.foundry-event@0.8.0 typecheck /home/runner/work/pack/pack/packages/state/foundry-event
2
+ > @palantir/pack.state.foundry-event@0.10.0 typecheck /home/runner/work/pack/pack/packages/state/foundry-event
3
3
  > tsc --noEmit --emitDeclarationOnly false
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @palantir/pack.state.foundry-event
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - cd09e6f: Add metadata update channel
8
+
9
+ ## 0.9.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 2ccb561: Update activity event types and add document operations to metadata
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [2ccb561]
18
+ - @palantir/pack.document-schema.model-types@0.7.0
19
+ - @palantir/pack.state.core@0.10.0
20
+
3
21
  ## 0.8.0
4
22
 
5
23
  ### Patch Changes
@@ -251,6 +251,7 @@ var getDocumentUpdatesChannelId = (documentId) => `/document/${documentId}/updat
251
251
  var getDocumentPublishChannelId = (documentId) => `/document/${documentId}/publish`;
252
252
  var getDocumentActivityChannelId = (documentId) => `/document/${documentId}/activity`;
253
253
  var getDocumentPresenceChannelId = (documentId) => `/document/${documentId}/presence`;
254
+ var getDocumentMetadataUpdatesChannelId = (documentId) => `/document/${documentId}/metadata/updates`;
254
255
  var getDocumentPresencePublishChannelId = (documentId) => `/document/${documentId}/presence-publish`;
255
256
  var FoundryEventServiceImpl = class {
256
257
  eventService;
@@ -377,6 +378,27 @@ var FoundryEventServiceImpl = class {
377
378
  });
378
379
  });
379
380
  }
381
+ subscribeToMetadataUpdates(documentId, callback) {
382
+ const session = this.getOrCreateSession(documentId);
383
+ const channelId = getDocumentMetadataUpdatesChannelId(documentId);
384
+ return this.eventService.subscribe(channelId, (event) => {
385
+ this.logger.debug("Received metadata update event", {
386
+ docId: documentId,
387
+ event
388
+ });
389
+ callback(event);
390
+ }).then((subscriptionId) => {
391
+ session.metadataSubscriptionId = subscriptionId;
392
+ return subscriptionId;
393
+ }).catch((e) => {
394
+ this.logger.error("Failed to subscribe to metadata updates", e, {
395
+ docId: documentId
396
+ });
397
+ throw new Error("Failed to subscribe to metadata updates", {
398
+ cause: e
399
+ });
400
+ });
401
+ }
380
402
  subscribeToPresenceUpdates(documentId, callback, options = {}) {
381
403
  const {
382
404
  ignoreSelfUpdates = true
@@ -458,6 +480,9 @@ var FoundryEventServiceImpl = class {
458
480
  if (internalSession.activitySubscriptionId) {
459
481
  this.eventService.unsubscribe(internalSession.activitySubscriptionId);
460
482
  }
483
+ if (internalSession.metadataSubscriptionId) {
484
+ this.eventService.unsubscribe(internalSession.metadataSubscriptionId);
485
+ }
461
486
  if (internalSession.presenceSubscriptionId) {
462
487
  this.eventService.unsubscribe(internalSession.presenceSubscriptionId);
463
488
  }
@@ -522,6 +547,16 @@ var FoundryEventServiceImpl = class {
522
547
  load: DocumentLoadStatus.LOADED
523
548
  });
524
549
  break;
550
+ case "deletion":
551
+ this.logger.info("Document was deleted", {
552
+ docId: session.documentId,
553
+ deletionMethod: message.deletionMethod
554
+ });
555
+ onStatusChange({
556
+ error: new Error(`Document was deleted [${message.deletionMethod}]`),
557
+ load: DocumentLoadStatus.ERROR
558
+ });
559
+ break;
525
560
  default:
526
561
  const {
527
562
  type
@@ -546,12 +581,15 @@ function isEditDescription(obj) {
546
581
  return obj != null && typeof obj === "object" && "data" in obj && "model" in obj && typeof obj.model === "object" && obj.model != null && hasMetadata(obj.model);
547
582
  }
548
583
  function createDocumentEditDescription(editDescription) {
584
+ const eventType = getMetadata(editDescription.model).name;
549
585
  return {
550
586
  eventData: {
551
587
  data: editDescription.data,
588
+ eventType,
552
589
  version: 1
553
590
  },
554
- eventType: getMetadata(editDescription.model).name
591
+ // TODO: remove duplicate after updating platform sdk
592
+ eventType
555
593
  };
556
594
  }
557
595
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cometd/lazyLoadCometD.ts","../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["getAuthModule"],"mappings":"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","file":"index.js","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\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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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
+ {"version":3,"sources":["../../src/cometd/lazyLoadCometD.ts","../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["getAuthModule"],"mappings":"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","file":"index.js","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\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 getDocumentMetadataUpdatesChannelId = documentId => `/document/${documentId}/metadata/updates`;\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 subscribeToMetadataUpdates(documentId, callback) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentMetadataUpdatesChannelId(documentId);\n return this.eventService.subscribe(channelId, event => {\n this.logger.debug(\"Received metadata update event\", {\n docId: documentId,\n event\n });\n callback(event);\n }).then(subscriptionId => {\n session.metadataSubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to metadata updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to metadata 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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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.metadataSubscriptionId) {\n this.eventService.unsubscribe(internalSession.metadataSubscriptionId);\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 case \"deletion\":\n this.logger.info(\"Document was deleted\", {\n docId: session.documentId,\n deletionMethod: message.deletionMethod\n });\n onStatusChange({\n error: new Error(`Document was deleted [${message.deletionMethod}]`),\n load: DocumentLoadStatus.ERROR\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 const eventType = getMetadata(editDescription.model).name;\n return {\n eventData: {\n data: editDescription.data,\n eventType,\n version: 1\n },\n // TODO: remove duplicate after updating platform sdk\n eventType\n };\n}"]}
@@ -273,6 +273,7 @@ var getDocumentUpdatesChannelId = (documentId) => `/document/${documentId}/updat
273
273
  var getDocumentPublishChannelId = (documentId) => `/document/${documentId}/publish`;
274
274
  var getDocumentActivityChannelId = (documentId) => `/document/${documentId}/activity`;
275
275
  var getDocumentPresenceChannelId = (documentId) => `/document/${documentId}/presence`;
276
+ var getDocumentMetadataUpdatesChannelId = (documentId) => `/document/${documentId}/metadata/updates`;
276
277
  var getDocumentPresencePublishChannelId = (documentId) => `/document/${documentId}/presence-publish`;
277
278
  var FoundryEventServiceImpl = class {
278
279
  eventService;
@@ -399,6 +400,27 @@ var FoundryEventServiceImpl = class {
399
400
  });
400
401
  });
401
402
  }
403
+ subscribeToMetadataUpdates(documentId, callback) {
404
+ const session = this.getOrCreateSession(documentId);
405
+ const channelId = getDocumentMetadataUpdatesChannelId(documentId);
406
+ return this.eventService.subscribe(channelId, (event) => {
407
+ this.logger.debug("Received metadata update event", {
408
+ docId: documentId,
409
+ event
410
+ });
411
+ callback(event);
412
+ }).then((subscriptionId) => {
413
+ session.metadataSubscriptionId = subscriptionId;
414
+ return subscriptionId;
415
+ }).catch((e) => {
416
+ this.logger.error("Failed to subscribe to metadata updates", e, {
417
+ docId: documentId
418
+ });
419
+ throw new Error("Failed to subscribe to metadata updates", {
420
+ cause: e
421
+ });
422
+ });
423
+ }
402
424
  subscribeToPresenceUpdates(documentId, callback, options = {}) {
403
425
  const {
404
426
  ignoreSelfUpdates = true
@@ -480,6 +502,9 @@ var FoundryEventServiceImpl = class {
480
502
  if (internalSession.activitySubscriptionId) {
481
503
  this.eventService.unsubscribe(internalSession.activitySubscriptionId);
482
504
  }
505
+ if (internalSession.metadataSubscriptionId) {
506
+ this.eventService.unsubscribe(internalSession.metadataSubscriptionId);
507
+ }
483
508
  if (internalSession.presenceSubscriptionId) {
484
509
  this.eventService.unsubscribe(internalSession.presenceSubscriptionId);
485
510
  }
@@ -544,6 +569,16 @@ var FoundryEventServiceImpl = class {
544
569
  load: pack_state_core.DocumentLoadStatus.LOADED
545
570
  });
546
571
  break;
572
+ case "deletion":
573
+ this.logger.info("Document was deleted", {
574
+ docId: session.documentId,
575
+ deletionMethod: message.deletionMethod
576
+ });
577
+ onStatusChange({
578
+ error: new Error(`Document was deleted [${message.deletionMethod}]`),
579
+ load: pack_state_core.DocumentLoadStatus.ERROR
580
+ });
581
+ break;
547
582
  default:
548
583
  const {
549
584
  type
@@ -568,12 +603,15 @@ function isEditDescription(obj) {
568
603
  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);
569
604
  }
570
605
  function createDocumentEditDescription(editDescription) {
606
+ const eventType = pack_documentSchema_modelTypes.getMetadata(editDescription.model).name;
571
607
  return {
572
608
  eventData: {
573
609
  data: editDescription.data,
610
+ eventType,
574
611
  version: 1
575
612
  },
576
- eventType: pack_documentSchema_modelTypes.getMetadata(editDescription.model).name
613
+ // TODO: remove duplicate after updating platform sdk
614
+ eventType
577
615
  };
578
616
  }
579
617
 
@@ -1 +1 @@
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\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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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
+ {"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\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 getDocumentMetadataUpdatesChannelId = documentId => `/document/${documentId}/metadata/updates`;\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 subscribeToMetadataUpdates(documentId, callback) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentMetadataUpdatesChannelId(documentId);\n return this.eventService.subscribe(channelId, event => {\n this.logger.debug(\"Received metadata update event\", {\n docId: documentId,\n event\n });\n callback(event);\n }).then(subscriptionId => {\n session.metadataSubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to metadata updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to metadata 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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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.metadataSubscriptionId) {\n this.eventService.unsubscribe(internalSession.metadataSubscriptionId);\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 case \"deletion\":\n this.logger.info(\"Document was deleted\", {\n docId: session.documentId,\n deletionMethod: message.deletionMethod\n });\n onStatusChange({\n error: new Error(`Document was deleted [${message.deletionMethod}]`),\n load: DocumentLoadStatus.ERROR\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 const eventType = getMetadata(editDescription.model).name;\n return {\n eventData: {\n data: editDescription.data,\n eventType,\n version: 1\n },\n // TODO: remove duplicate after updating platform sdk\n eventType\n };\n}"]}
@@ -1,4 +1,4 @@
1
- import { ActivityCollaborativeUpdate, PresenceCollaborativeUpdate } from '@osdk/foundry.pack';
1
+ import { ActivityCollaborativeUpdate, DocumentMetadataUpdate, PresenceCollaborativeUpdate } from '@osdk/foundry.pack';
2
2
  import { Branded, PackAppInternal } from '@palantir/pack.core';
3
3
  import { DocumentId } from '@palantir/pack.document-schema.model-types';
4
4
  import { DocumentSyncStatus } from '@palantir/pack.state.core';
@@ -39,10 +39,11 @@ interface FoundryEventService {
39
39
  startDocumentSync(documentId: DocumentId, yDoc: y.Doc, onStatusChange: (status: Partial<DocumentSyncStatus>) => void): SyncSession;
40
40
  stopDocumentSync(session: SyncSession): void;
41
41
  subscribeToActivityUpdates(documentId: DocumentId, callback: (event: ActivityCollaborativeUpdate) => void): Promise<SubscriptionId>;
42
+ subscribeToMetadataUpdates(documentId: DocumentId, callback: (event: DocumentMetadataUpdate) => void): Promise<SubscriptionId>;
42
43
  subscribeToPresenceUpdates(documentId: DocumentId, callback: (update: PresenceCollaborativeUpdate) => void, options?: PresenceSubscriptionOptions): Promise<SubscriptionId>;
43
44
  }
44
45
  declare function createFoundryEventService(app: PackAppInternal,
45
46
  /** @internal */
46
47
  cometdLoader?: CometDLoader): FoundryEventService;
47
48
 
48
- export { type FoundryEventService, type PresenceSubscriptionOptions, type SyncSession, createFoundryEventService };
49
+ export { type FoundryEventService, type PresenceSubscriptionOptions, type SubscriptionId, type SyncSession, createFoundryEventService };
@@ -251,6 +251,7 @@ var getDocumentUpdatesChannelId = (documentId) => `/document/${documentId}/updat
251
251
  var getDocumentPublishChannelId = (documentId) => `/document/${documentId}/publish`;
252
252
  var getDocumentActivityChannelId = (documentId) => `/document/${documentId}/activity`;
253
253
  var getDocumentPresenceChannelId = (documentId) => `/document/${documentId}/presence`;
254
+ var getDocumentMetadataUpdatesChannelId = (documentId) => `/document/${documentId}/metadata/updates`;
254
255
  var getDocumentPresencePublishChannelId = (documentId) => `/document/${documentId}/presence-publish`;
255
256
  var FoundryEventServiceImpl = class {
256
257
  eventService;
@@ -377,6 +378,27 @@ var FoundryEventServiceImpl = class {
377
378
  });
378
379
  });
379
380
  }
381
+ subscribeToMetadataUpdates(documentId, callback) {
382
+ const session = this.getOrCreateSession(documentId);
383
+ const channelId = getDocumentMetadataUpdatesChannelId(documentId);
384
+ return this.eventService.subscribe(channelId, (event) => {
385
+ this.logger.debug("Received metadata update event", {
386
+ docId: documentId,
387
+ event
388
+ });
389
+ callback(event);
390
+ }).then((subscriptionId) => {
391
+ session.metadataSubscriptionId = subscriptionId;
392
+ return subscriptionId;
393
+ }).catch((e) => {
394
+ this.logger.error("Failed to subscribe to metadata updates", e, {
395
+ docId: documentId
396
+ });
397
+ throw new Error("Failed to subscribe to metadata updates", {
398
+ cause: e
399
+ });
400
+ });
401
+ }
380
402
  subscribeToPresenceUpdates(documentId, callback, options = {}) {
381
403
  const {
382
404
  ignoreSelfUpdates = true
@@ -458,6 +480,9 @@ var FoundryEventServiceImpl = class {
458
480
  if (internalSession.activitySubscriptionId) {
459
481
  this.eventService.unsubscribe(internalSession.activitySubscriptionId);
460
482
  }
483
+ if (internalSession.metadataSubscriptionId) {
484
+ this.eventService.unsubscribe(internalSession.metadataSubscriptionId);
485
+ }
461
486
  if (internalSession.presenceSubscriptionId) {
462
487
  this.eventService.unsubscribe(internalSession.presenceSubscriptionId);
463
488
  }
@@ -522,6 +547,16 @@ var FoundryEventServiceImpl = class {
522
547
  load: DocumentLoadStatus.LOADED
523
548
  });
524
549
  break;
550
+ case "deletion":
551
+ this.logger.info("Document was deleted", {
552
+ docId: session.documentId,
553
+ deletionMethod: message.deletionMethod
554
+ });
555
+ onStatusChange({
556
+ error: new Error(`Document was deleted [${message.deletionMethod}]`),
557
+ load: DocumentLoadStatus.ERROR
558
+ });
559
+ break;
525
560
  default:
526
561
  const {
527
562
  type
@@ -546,12 +581,15 @@ function isEditDescription(obj) {
546
581
  return obj != null && typeof obj === "object" && "data" in obj && "model" in obj && typeof obj.model === "object" && obj.model != null && hasMetadata(obj.model);
547
582
  }
548
583
  function createDocumentEditDescription(editDescription) {
584
+ const eventType = getMetadata(editDescription.model).name;
549
585
  return {
550
586
  eventData: {
551
587
  data: editDescription.data,
588
+ eventType,
552
589
  version: 1
553
590
  },
554
- eventType: getMetadata(editDescription.model).name
591
+ // TODO: remove duplicate after updating platform sdk
592
+ eventType
555
593
  };
556
594
  }
557
595
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cometd/lazyLoadCometD.ts","../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["getAuthModule"],"mappings":"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","file":"index.js","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\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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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
+ {"version":3,"sources":["../../src/cometd/lazyLoadCometD.ts","../../src/cometd/EventServiceCometD.ts","../../src/FoundryEventService.ts"],"names":["getAuthModule"],"mappings":";;;;;;;;;;AAgBA,eAAsB,cAAA,GAAiB;AACrC,EAAA,MAAM,YAAA,GAAe,MAAM,OAAO,QAAQ,CAAA;AAW1C,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS;AAAA,GACX,GAAI,MAAM,OAAO,wBAAwB,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,GAAG,YAAA;AAAA,IACH;AAAA,GACF;AACF;;;ACjBA,IAAM,kBAAA,GAAqB,cAAA;AAC3B,IAAM,aAAA,GAAgB,cAAA;AACtB,IAAM,yBAAA,GAA4B,gBAAA;AAClC,IAAM,sBAAA,GAAyB,iBAAA;AACxB,IAAM,qBAAN,MAAyB;AAAA,EAC9B,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA,uBAAuB,GAAA,EAAI;AAAA,EAC3B,cAAA,GAAiB,IAAI,cAAA,EAAe;AAAA,EACpC,sBAAA,GAAyB,CAAA;AAAA,EACzB,MAAA;AAAA,EACA,WAAA,CAAY,GAAA,EAAK,YAAA,GAAe,cAAA,EAAgB;AAC9C,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAC,EAAG;AAAA,MACxC,SAAA,EAAW;AAAA,KACZ,CAAA;AAID,IAAA,aAAA,CAAc,GAAG,CAAA,CAAE,aAAA,CAAc,CAAA,KAAA,KAAS;AACxC,MAAA,IAAA,CAAK,cAAA,CAAe,SAAS,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA,EACA,MAAM,UAAA,GAAa;AACjB,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,qBAAqB,YAAY;AACpC,MAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,QAAA,MAAM;AAAA,UACJ,YAAA;AAAA,UACA;AAAA,SACF,GAAI,MAAM,IAAA,CAAK,YAAA,EAAa;AAC5B,QAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,EAAO;AACzB,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,aAAA,EAAe,IAAI,cAAc,CAAA;AAC/D,QAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,yBAAA,EAA2B,IAAA,CAAK,cAAc,CAAA;AAAA,MAI9E;AACA,MAAA,MAAM,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC3B,QAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,sBAAA,EAAwB,CAAC;AAAA,UAC/C,QAAA;AAAA,UACA,cAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF,KAAM;AACJ,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6BAAA,EAA+B;AAAA,cAC9C,QAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,OAAA,EAAQ;AACR,YAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM;AACtB,cAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,CAAC,YAAA,EAAc,cAAA,KAAmB;AAC9D,gBAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,kBAC5C,SAAS,YAAA,CAAa,YAAA;AAAA,kBACtB;AAAA,iBACD,CAAA;AACD,gBAAA,MAAM,cAAA,GAAiB,aAAa,sBAAA,IAAyB;AAC7D,gBAAA,YAAA,CAAa,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,aAAa,MAAA,EAAQ;AAAA,kBACjE,GAAA,EAAK;AAAA,iBACN,CAAA;AAAA,cACH,CAAC,CAAA;AAAA,YACH,CAAC,CAAA;AAAA,UACH,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,MAAA,CAAO,KAAK,yBAAA,EAA2B;AAAA,cAC1C,QAAA;AAAA,cACA;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AACD,QAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AACzC,QAAA,KAAK,UAAA,CAAW,QAAA,EAAS,CAAE,IAAA,CAAK,CAAA,KAAA,KAAS;AACvC,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAgC,CAAA;AACjD,UAAA,IAAA,CAAK,cAAA,CAAe,SAAS,KAAK,CAAA;AAClC,UAAA,IAAA,CAAK,OAAO,SAAA,EAAU;AAAA,QACxB,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,GAAG;AACH,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA,EACA,MAAM,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,sBAAA,EAAwB;AAC1D,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,cAAA,GAAA,CAAkB,IAAA,CAAK,sBAAA,EAAA,EAA0B,QAAA,CAAS,EAAE,CAAA;AAClE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,iBAAiB,CAAA,YAAA,KAAgB;AACrC,QAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA,EAAG;AAC9C,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,4CAAA,EAA8C;AAAA,YAC7D,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,UAC/C,OAAA;AAAA,UACA,cAAA;AAAA,UACA,OAAA,EAAS,aAAa,IAAA,IAAQ;AAAA,SAC/B,CAAA;AACD,QAAA,SAAA,CAAU,aAAa,IAAI,CAAA;AAAA,MAC7B,CAAA;AACA,MAAA,MAAM,oBAAoB,CAAA,OAAA,KAAW;AACnC,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,IAAA,CAAK,MAAA,CAAO,MAAM,oCAAA,EAAsC;AAAA,YACtD,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,cAAc,CAAA;AAE3C,UAAA,MAAM,qBAAqB,SAAA,IAAa,OAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,KAAY,YAAY,OAAA,CAAQ,OAAA,IAAW,YAAY,OAAA,CAAQ,OAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,CAAQ,WAAW,QAAA,GAAW,OAAA,CAAQ,QAAQ,MAAA,GAAS,MAAA;AAClN,UAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iCAAA,EAAmC;AAAA,YACnD,OAAA;AAAA,YACA,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf;AAAA,WACD,CAAA;AACD,UAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,KAAU,sBAAsB,IAAA,GAAO,CAAA,+CAAA,EAAkD,kBAAkB,CAAA,CAAA,CAAA,GAAM,uCAAA,CAAA;AAC9I,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,EAAA,EAAK,YAAY,EAAE,CAAC,CAAA;AAAA,QAChF;AAAA,MACF,CAAA;AACA,MAAA,MAAM,MAAM,sBAAA,IAAyB;AACrC,MAAA,MAAM,qBAAqB,GAAA,IAAO,IAAA,GAAO,KAAK,MAAA,CAAO,SAAA,CAAU,SAAS,cAAA,EAAgB;AAAA,QACtF;AAAA,OACF,EAAG,iBAAiB,CAAA,GAAI,IAAA,CAAK,OAAO,SAAA,CAAU,OAAA,EAAS,gBAAgB,iBAAiB,CAAA;AACxF,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,cAAA,EAAgB;AAAA,QACxC,MAAA,EAAQ,kBAAA;AAAA,QACR,sBAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EACA,YAAY,cAAA,EAAgB;AAC1B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA;AAC7D,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sDAAA,EAAwD;AAAA,QACvE;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA;AAAA,KACF,GAAI,YAAA;AACJ,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,cAAc,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,4CAAA,EAA8C;AAAA,QAC7D;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,CAAA,OAAA,KAAW;AACzC,MAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wCAAA,EAA0C;AAAA,UACzD,YAAA;AAAA,UACA,cAAA;AAAA,UACA,OAAO,OAAA,CAAQ;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EACA,MAAM,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS;AAC9B,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,CAAA,OAAA,KAAW;AAC/C,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,OAAA,EAAS;AAAA,YAC3D;AAAA,WACD,CAAA;AACD,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAA,EAAI;AAAA,YACzD,OAAO,OAAA,CAAQ;AAAA,WAChB,CAAA;AACD,UAAA,IAAA,CAAK,MAAA,CAAO,MAAM,mBAAA,EAAqB;AAAA,YACrC,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EACA,YAAY,QAAA,EAAU;AACpB,IAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,EAC/B;AAAA,EACA,gBAAgB,QAAA,EAAU;AACxB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,MACtC;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU;AAAA,MACpB,GAAA;AAAA;AAAA,MAEA,eAAA,EAAiB,GAAA;AAAA,MACjB,QAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AACF,CAAA;AACA,SAAS,sBAAsB,SAAA,EAAW;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,OAAO,UAAU,CAAA,OAAA,CAAA,EAAW,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AACzF,EAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAEvC,EAAA,OAAO,OAAA,CAAQ,IAAA;AACjB;AACA,IAAM,iBAAN,MAAqB;AAAA,EACnB,YAAA;AAAA,EACA,SAAS,KAAA,EAAO;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA,EACA,WAAW,CAAA,OAAA,KAAW;AAEpB,IAAA,IAAI,OAAA,CAAQ,YAAY,sBAAA,EAAwB;AAC9C,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,OAAA,CAAQ,QAAQ,EAAC;AACjB,QAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,GAAI,IAAA,CAAK,YAAA;AAAA,MACzC;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF,CAAA;;;AChOA,IAAM,oBAAA,GAAuB,QAAA;AAC7B,IAAM,2BAAA,GAA8B,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,QAAA,CAAA;AACzE,IAAM,2BAAA,GAA8B,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,QAAA,CAAA;AACzE,IAAM,4BAAA,GAA+B,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,SAAA,CAAA;AAC1E,IAAM,4BAAA,GAA+B,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,SAAA,CAAA;AAC1E,IAAM,mCAAA,GAAsC,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,iBAAA,CAAA;AACjF,IAAM,mCAAA,GAAsC,CAAA,UAAA,KAAc,CAAA,UAAA,EAAa,UAAU,CAAA,iBAAA,CAAA;AAOjF,IAAM,0BAAN,MAA8B;AAAA,EAC5B,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAAI;AAAA,EACnB,WAAA,CAAY,KAAK,YAAA,EAAc;AAC7B,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,kBAAA,CAAmB,GAAA,EAAK,YAAY,CAAA;AAC5D,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAC,EAAG;AAAA,MACxC,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA,EACA,kBAAA,CAAmB,YAAY,IAAA,EAAM;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAC9C,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU;AAAA,QACR,sBAAA,EAAwB,MAAA;AAAA,QACxB,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,QAC5B,UAAA;AAAA,QACA,sBAAA,EAAwB,MAAA;AAAA,QACxB,cAAA,EAAgB,MAAA;AAAA,QAChB,sBAAA,EAAwB,MAAA;AAAA,QACxB,sBAAA,EAAwB,MAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EACA,iBAAA,CAAkB,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,IAAI,CAAA;AACxD,IAAA,IAAI,OAAA,CAAQ,0BAA0B,IAAA,EAAM;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,UAAU,CAAA,CAAE,CAAA;AAAA,IAChF;AACA,IAAA,MAAM,sBAAA,GAAyB,CAAC,MAAA,EAAQ,MAAA,KAAW;AACjD,MAAA,IAAI,WAAW,oBAAA,EAAsB;AACnC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,iBAAiB,OAAA,CAAQ,cAAA;AAC/B,MAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,2GAAA,EAA6G;AAAA,UAC7H,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,gBAAA,GAAmB,4BAA4B,UAAU,CAAA;AAC/D,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,MAAM,cAAc,iBAAA,CAAkB,MAAM,CAAA,GAAI,6BAAA,CAA8B,MAAM,CAAA,GAAI,MAAA;AACxF,MAAA,KAAK,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,gBAAA,EAAkB;AAAA,QAC/C,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,MAAA,CAAO,cAAA,CAAe,MAAM;AAAA;AACpC,OACD,CAAA,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAChB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,KAAA,EAAO;AAAA,UAC5D,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,OAAA,CAAQ,sBAAA,GAAyB,sBAAA;AACjC,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,sBAAsB,CAAA;AACxC,IAAA,cAAA,CAAe;AAAA,MACb,MAAM,kBAAA,CAAmB;AAAA,KAC1B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,4BAA4B,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,SAAA,EAAW,CAAA,OAAA,KAAW;AAChD,MAAA,IAAI,OAAA,CAAQ,2BAA2B,sBAAA,EAAwB;AAC7D,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,2BAAA,CAA4B,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,cAAc,CAAA;AAAA,IACzE,GAAG,OAAO;AAAA,MACR,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAA,EAAgB,OAAA,CAAQ,cAAA,EAAgB,QAAA;AAAS,KACnD,CAAE,CAAA,CAAE,IAAA,CAAK,CAAA,cAAA,KAAkB;AACzB,MAAA,IAAI,OAAA,CAAQ,2BAA2B,sBAAA,EAAwB;AAC7D,QAAA,OAAA,CAAQ,sBAAA,GAAyB,cAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,YAAA,CAAa,YAAY,cAAc,CAAA;AAC5C,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK;AACZ,MAAA,IAAI,OAAA,CAAQ,2BAA2B,sBAAA,EAAwB;AAC7D,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,4CAAA,EAA8C;AAAA,UACpE,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,cAAA,CAAe;AAAA,UACb,KAAA;AAAA,UACA,MAAM,kBAAA,CAAmB;AAAA,SAC1B,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gEAAA,EAAkE;AAAA,UACjF,KAAA,EAAO,UAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ;AAAA,KACtB;AAAA,EACF;AAAA,EACA,0BAAA,CAA2B,YAAY,QAAA,EAAU;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,6BAA6B,UAAU,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,SAAA,EAAW,CAAA,KAAA,KAAS;AACrD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAA,EAA2B;AAAA,QAC3C,KAAA,EAAO,UAAA;AAAA,QACP;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAC,CAAA,CAAE,IAAA,CAAK,CAAA,cAAA,KAAkB;AACxB,MAAA,OAAA,CAAQ,sBAAA,GAAyB,cAAA;AACjC,MAAA,OAAO,cAAA;AAAA,IACT,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,CAAA,EAAG;AAAA,QAC9D,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,yCAAA,EAA2C;AAAA,QACzD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EACA,0BAAA,CAA2B,YAAY,QAAA,EAAU;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,oCAAoC,UAAU,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,SAAA,EAAW,CAAA,KAAA,KAAS;AACrD,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,gCAAA,EAAkC;AAAA,QAClD,KAAA,EAAO,UAAA;AAAA,QACP;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAC,CAAA,CAAE,IAAA,CAAK,CAAA,cAAA,KAAkB;AACxB,MAAA,OAAA,CAAQ,sBAAA,GAAyB,cAAA;AACjC,MAAA,OAAO,cAAA;AAAA,IACT,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,CAAA,EAAG;AAAA,QAC9D,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,yCAAA,EAA2C;AAAA,QACzD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EACA,0BAAA,CAA2B,UAAA,EAAY,QAAA,EAAU,OAAA,GAAU,EAAC,EAAG;AAC7D,IAAA,MAAM;AAAA,MACJ,iBAAA,GAAoB;AAAA,KACtB,GAAI,OAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,6BAA6B,UAAU,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,SAAA,EAAW,CAAA,MAAA,KAAU;AAItD,MAAA,MAAM,cAAcA,aAAAA,CAAc,IAAA,CAAK,GAAG,CAAA,CAAE,cAAA,CAAe,IAAI,CAAA,EAAG,MAAA;AAClE,MAAA,IAAI,iBAAA,IAAqB,eAAe,IAAA,EAAM;AAC5C,QAAA,QAAQ,OAAO,IAAA;AAAM,UACnB,KAAK,qBAAA;AACH,YAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,cAAA;AAAA,YACF;AACA,YAAA;AAAA,UACF,KAAK,qBAAA;AACH,YAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,cAAA;AAAA,YACF;AACA,YAAA;AAGA;AACJ,MACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,QAC5C,KAAA,EAAO,UAAA;AAAA,QACP,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AACD,MAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACjB,CAAC,CAAA,CAAE,IAAA,CAAK,CAAA,cAAA,KAAkB;AACxB,MAAA,OAAA,CAAQ,sBAAA,GAAyB,cAAA;AACjC,MAAA,OAAO,cAAA;AAAA,IACT,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAA,KAAK;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,CAAA,EAAG;AAAA,QAC9D,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,yCAAA,EAA2C;AAAA,QACzD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EACA,qBAAA,CAAsB,UAAA,EAAY,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS;AAC/D,IAAA,MAAM;AAAA,MACJ,WAAA,GAAc;AAAA,KAChB,GAAI,WAAW,EAAC;AAChB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,oCAAoC,UAAU,CAAA;AAIhE,IAAA,MAAM,SAASA,aAAAA,CAAc,IAAA,CAAK,GAAG,CAAA,CAAE,cAAA,CAAe,IAAI,CAAA,EAAG,MAAA;AAC7D,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW;AAAA,MAC1C,UAAU,OAAA,CAAQ,QAAA;AAAA;AAAA,MAElB,SAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,KAAA,EAAO;AAAA,QAC5D,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH;AAAA,EACA,iBAAiB,OAAA,EAAS;AACxB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACtD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,4CAAA,EAA8C;AAAA,QAC7D,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,eAAA,CAAgB,0BAA0B,IAAA,EAAM;AAClD,MAAA,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,QAAA,EAAU,eAAA,CAAgB,sBAAsB,CAAA;AAC1E,MAAA,eAAA,CAAgB,sBAAA,GAAyB,MAAA;AAAA,IAC3C;AACA,IAAA,IAAI,gBAAgB,sBAAA,EAAwB;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,eAAA,CAAgB,sBAAsB,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,gBAAgB,sBAAA,EAAwB;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,eAAA,CAAgB,sBAAsB,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,gBAAgB,sBAAA,EAAwB;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,eAAA,CAAgB,sBAAsB,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,gBAAgB,sBAAA,EAAwB;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,WAAA,CAAY,eAAA,CAAgB,sBAAsB,CAAA;AACpE,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EACA,2BAAA,CAA4B,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,cAAA,EAAgB;AAClE,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,OAAA;AACH,QAAA,MAAM;AAAA,UACJ,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF,GAAI,OAAA;AACJ,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wCAAA,EAA0C;AAAA,UAC1D,OAAO,OAAA,CAAQ,UAAA;AAAA,UACf,IAAA;AAAA,UACA,eAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,cAAA,CAAe;AAAA,UACb,KAAA,EAAO,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,eAAe,CAAA,CAAA,CAAA,EAAK;AAAA,YACnE,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,UACD,MAAM,kBAAA,CAAmB;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAM;AAAA,UACJ,cAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF,GAAI,OAAA;AACJ,QAAA,MAAM,IAAA,GAAO,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AACpG,QAAA,MAAM,aAAA,GAAgB;AAAA,UACpB,cAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,SAClC;AAGA,QAAA,IAAI,QAAQ,cAAA,IAAkB,IAAA,IAAQ,OAAO,cAAc,CAAA,KAAM,QAAQ,cAAA,EAAgB;AACvF,UAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0CAAA,EAA4C;AAAA,YAC5D,OAAO,OAAA,CAAQ,UAAA;AAAA,YACf,gBAAgB,OAAA,CAAQ,cAAA;AAAA,YACxB,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,UAC/C,OAAO,OAAA,CAAQ,UAAA;AAAA,UACf,gBAAgB,OAAA,CAAQ,cAAA;AAAA,UACxB,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,OAAA,CAAQ,cAAA,GAAiB,OAAO,UAAU,CAAA;AAC1C,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAE,CAAA,CAAA,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,oBAAoB,CAAA;AAAA,QAChD;AACA,QAAA,cAAA,CAAe;AAAA,UACb,MAAM,kBAAA,CAAmB;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sBAAA,EAAwB;AAAA,UACvC,OAAO,OAAA,CAAQ,UAAA;AAAA,UACf,gBAAgB,OAAA,CAAQ;AAAA,SACzB,CAAA;AACD,QAAA,cAAA,CAAe;AAAA,UACb,OAAO,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAA,CAAQ,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,UACnE,MAAM,kBAAA,CAAmB;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF;AAEE,QAAA,MAAM;AAAA,UACJ;AAAA,SACF,GAAI,OAAA;AACJ,QAAA,QAAA,CAAS,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAA,EAAI,MAAM;AACnD,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wFAAA,EAA0F;AAAA,YACzG,OAAO,OAAA,CAAQ,UAAA;AAAA,YACf,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH,CAAC,CAAA;AACD,QAAA;AAAA;AACJ,EACF;AAAA,EACA,aAAa,UAAA,EAAY;AACvB,IAAA,OAAO,UAAA;AAAA,EACT;AACF,CAAA;AACO,SAAS,yBAAA,CAA0B,KAC1C,YAAA,EAAc;AACZ,EAAA,OAAO,IAAI,uBAAA,CAAwB,GAAA,EAAK,YAAY,CAAA;AACtD;AACA,SAAS,kBAAkB,GAAA,EAAK;AAC9B,EAAA,OAAO,OAAO,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,MAAA,IAAU,OAAO,OAAA,IAAW,GAAA,IAAO,OAAO,GAAA,CAAI,UAAU,QAAA,IAAY,GAAA,CAAI,SAAS,IAAA,IAAQ,WAAA,CAAY,IAAI,KAAK,CAAA;AACjK;AACA,SAAS,8BAA8B,eAAA,EAAiB;AACtD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,eAAA,CAAgB,KAAK,CAAA,CAAE,IAAA;AACrD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW;AAAA,MACT,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA;AAAA,IAEA;AAAA,GACF;AACF","file":"index.js","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\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 getDocumentMetadataUpdatesChannelId = documentId => `/document/${documentId}/metadata/updates`;\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 subscribeToMetadataUpdates(documentId, callback) {\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentMetadataUpdatesChannelId(documentId);\n return this.eventService.subscribe(channelId, event => {\n this.logger.debug(\"Received metadata update event\", {\n docId: documentId,\n event\n });\n callback(event);\n }).then(subscriptionId => {\n session.metadataSubscriptionId = subscriptionId;\n return subscriptionId;\n }).catch(e => {\n this.logger.error(\"Failed to subscribe to metadata updates\", e, {\n docId: documentId\n });\n throw new Error(\"Failed to subscribe to metadata 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, options) {\n const {\n isEphemeral = true\n } = options ?? {};\n const session = this.getOrCreateSession(documentId);\n const channelId = getDocumentPresencePublishChannelId(documentId);\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 // FIXME: why do we have to send this, we are authenticated\n eventData,\n eventType,\n isEphemeral,\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.metadataSubscriptionId) {\n this.eventService.unsubscribe(internalSession.metadataSubscriptionId);\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 case \"deletion\":\n this.logger.info(\"Document was deleted\", {\n docId: session.documentId,\n deletionMethod: message.deletionMethod\n });\n onStatusChange({\n error: new Error(`Document was deleted [${message.deletionMethod}]`),\n load: DocumentLoadStatus.ERROR\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 const eventType = getMetadata(editDescription.model).name;\n return {\n eventData: {\n data: editDescription.data,\n eventType,\n version: 1\n },\n // TODO: remove duplicate after updating platform sdk\n eventType\n };\n}"]}
@@ -1,4 +1,4 @@
1
- import type { ActivityCollaborativeUpdate, PresenceCollaborativeUpdate } from "@osdk/foundry.pack";
1
+ import type { ActivityCollaborativeUpdate, DocumentMetadataUpdate, PresenceCollaborativeUpdate } from "@osdk/foundry.pack";
2
2
  import { type PackAppInternal } from "@palantir/pack.core";
3
3
  import { type DocumentId } from "@palantir/pack.document-schema.model-types";
4
4
  import { type DocumentSyncStatus } from "@palantir/pack.state.core";
@@ -30,6 +30,7 @@ export interface FoundryEventService {
30
30
  startDocumentSync(documentId: DocumentId, yDoc: y.Doc, onStatusChange: (status: Partial<DocumentSyncStatus>) => void): SyncSession;
31
31
  stopDocumentSync(session: SyncSession): void;
32
32
  subscribeToActivityUpdates(documentId: DocumentId, callback: (event: ActivityCollaborativeUpdate) => void): Promise<SubscriptionId>;
33
+ subscribeToMetadataUpdates(documentId: DocumentId, callback: (event: DocumentMetadataUpdate) => void): Promise<SubscriptionId>;
33
34
  subscribeToPresenceUpdates(documentId: DocumentId, callback: (update: PresenceCollaborativeUpdate) => void, options?: PresenceSubscriptionOptions): Promise<SubscriptionId>;
34
35
  }
35
36
  export declare function createFoundryEventService(app: PackAppInternal, cometdLoader?: CometDLoader): FoundryEventService;
@@ -1 +1 @@
1
- {"mappings":"AAiBA,cACE,6BAKA,mCAEK;AAEP,cAAoC,uBAAuB;AAC3D,cACO,kBAIA;AACP,cAAkC,0BAA0B;AAE5D,YAAY,OAAO;AACnB,cAAc,oBAAwC;AACtD,cAEE,sBAGK;AAGP,iBAAiB,4BAA4B;UAClC;;AAGX,iBAAiB,uBAAuB;;;;;;;UAO7B;;AA8BX,iBAAiB,YAAY;UAClB;UACA,YAAY;;;;;;AAgBvB,iBAAiB,oBAAoB;CACnC,sBACE,YAAY,YACZ,mBACA,oBACA,UAAU,yBACT;CAEH,kBACE,YAAY,YACZ,MAAM,EAAE,KACR,iBAAiB,QAAQ,QAAQ,+BAChC;CAEH,iBAAiB,SAAS;CAE1B,2BACE,YAAY,YACZ,WAAW,OAAO,uCACjB,QAAQ;CAEX,2BACE,YAAY,YACZ,WAAW,QAAQ,sCACnB,UAAU,8BACT,QAAQ;;AAyWb,OAAO,iBAAS,0BACd,KAAK,iBAEL,eAAe,eACd","names":[],"sources":["../../src/FoundryEventService.ts"],"version":3,"file":"FoundryEventService.d.ts"}
1
+ {"mappings":"AAiBA,cACE,6BAEA,wBAIA,mCAEK;AAEP,cAAoC,uBAAuB;AAC3D,cACO,kBAIA;AACP,cAAkC,0BAA0B;AAE5D,YAAY,OAAO;AACnB,cAAc,oBAAwC;AACtD,cAEE,sBAGK;AAGP,iBAAiB,4BAA4B;UAClC;;AAGX,iBAAiB,uBAAuB;;;;;;;UAO7B;;AAmCX,iBAAiB,YAAY;UAClB;UACA,YAAY;;;;;;AAiBvB,iBAAiB,oBAAoB;CACnC,sBACE,YAAY,YACZ,mBACA,oBACA,UAAU,yBACT;CAEH,kBACE,YAAY,YACZ,MAAM,EAAE,KACR,iBAAiB,QAAQ,QAAQ,+BAChC;CAEH,iBAAiB,SAAS;CAE1B,2BACE,YAAY,YACZ,WAAW,OAAO,uCACjB,QAAQ;CAEX,2BACE,YAAY,YACZ,WAAW,OAAO,kCACjB,QAAQ;CAEX,2BACE,YAAY,YACZ,WAAW,QAAQ,sCACnB,UAAU,8BACT,QAAQ;;AAmZb,OAAO,iBAAS,0BACd,KAAK,iBAEL,eAAe,eACd","names":[],"sources":["../../src/FoundryEventService.ts"],"version":3,"file":"FoundryEventService.d.ts"}
@@ -1,2 +1,3 @@
1
1
  export { createFoundryEventService } from "./FoundryEventService.js";
2
2
  export type { FoundryEventService, PresenceSubscriptionOptions, SyncSession } from "./FoundryEventService.js";
3
+ export type { SubscriptionId } from "./types/EventService.js";
@@ -1 +1 @@
1
- {"mappings":"AAgBA,SAAS,iCAAiC;AAC1C,cACE,qBACA,6BACA,mBACK","names":[],"sources":["../../src/index.ts"],"version":3,"file":"index.d.ts"}
1
+ {"mappings":"AAgBA,SAAS,iCAAiC;AAC1C,cACE,qBACA,6BACA,mBACK;AACP,cAAc,sBAAsB","names":[],"sources":["../../src/index.ts"],"version":3,"file":"index.d.ts"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@palantir/pack.state.foundry-event",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "PACK event service for real-time document synchronization",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -29,14 +29,14 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@osdk/api": "^2.5.2",
32
- "@osdk/foundry.pack": "^2.52.0",
32
+ "@osdk/foundry.pack": "^2.56.0",
33
33
  "cometd": "^7.0.18",
34
34
  "js-base64": "^3.7.8",
35
35
  "yjs": "^13.6.27",
36
+ "@palantir/pack.auth": "0.1.2",
36
37
  "@palantir/pack.core": "0.2.2",
37
- "@palantir/pack.document-schema.model-types": "0.6.0",
38
- "@palantir/pack.state.core": "0.9.0",
39
- "@palantir/pack.auth": "0.1.2"
38
+ "@palantir/pack.state.core": "0.10.0",
39
+ "@palantir/pack.document-schema.model-types": "0.7.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/node": "^20.19.17",
@@ -18,6 +18,7 @@ import type { Logger } from "@osdk/api";
18
18
  import type {
19
19
  ActivityCollaborativeUpdate,
20
20
  DocumentEditDescription,
21
+ DocumentMetadataUpdate,
21
22
  DocumentPublishMessage,
22
23
  DocumentUpdateMessage,
23
24
  DocumentUpdateSubscriptionRequest,
@@ -80,6 +81,11 @@ const getDocumentPresenceChannelId = (
80
81
  ): TypedReceiveChannelId<PresenceCollaborativeUpdate> =>
81
82
  `/document/${documentId}/presence` as TypedReceiveChannelId<PresenceCollaborativeUpdate>;
82
83
 
84
+ const getDocumentMetadataUpdatesChannelId = (
85
+ documentId: DocumentId,
86
+ ): TypedReceiveChannelId<DocumentMetadataUpdate> =>
87
+ `/document/${documentId}/metadata/updates` as TypedReceiveChannelId<DocumentMetadataUpdate>;
88
+
83
89
  const getDocumentPresencePublishChannelId = (
84
90
  documentId: DocumentId,
85
91
  ): TypedPublishChannelId<PresencePublishMessage> =>
@@ -95,6 +101,7 @@ interface SyncSessionInternal extends SyncSession {
95
101
  documentSubscriptionId?: SubscriptionId;
96
102
  lastRevisionId?: number;
97
103
  localYDocUpdateHandler?: (update: Uint8Array, origin: unknown) => void;
104
+ metadataSubscriptionId?: SubscriptionId;
98
105
  presenceSubscriptionId?: SubscriptionId;
99
106
  yDoc?: y.Doc;
100
107
  }
@@ -124,6 +131,11 @@ export interface FoundryEventService {
124
131
  callback: (event: ActivityCollaborativeUpdate) => void,
125
132
  ): Promise<SubscriptionId>;
126
133
 
134
+ subscribeToMetadataUpdates(
135
+ documentId: DocumentId,
136
+ callback: (event: DocumentMetadataUpdate) => void,
137
+ ): Promise<SubscriptionId>;
138
+
127
139
  subscribeToPresenceUpdates(
128
140
  documentId: DocumentId,
129
141
  callback: (update: PresenceCollaborativeUpdate) => void,
@@ -292,6 +304,34 @@ class FoundryEventServiceImpl implements FoundryEventService {
292
304
  });
293
305
  }
294
306
 
307
+ subscribeToMetadataUpdates(
308
+ documentId: DocumentId,
309
+ callback: (event: DocumentMetadataUpdate) => void,
310
+ ): Promise<SubscriptionId> {
311
+ const session = this.getOrCreateSession(documentId);
312
+
313
+ const channelId = getDocumentMetadataUpdatesChannelId(documentId);
314
+
315
+ return this.eventService.subscribe(
316
+ channelId,
317
+ (event: DocumentMetadataUpdate) => {
318
+ this.logger.debug("Received metadata update event", {
319
+ docId: documentId,
320
+ event,
321
+ });
322
+ callback(event);
323
+ },
324
+ ).then(subscriptionId => {
325
+ session.metadataSubscriptionId = subscriptionId;
326
+ return subscriptionId;
327
+ }).catch((e: unknown) => {
328
+ this.logger.error("Failed to subscribe to metadata updates", e, {
329
+ docId: documentId,
330
+ });
331
+ throw new Error("Failed to subscribe to metadata updates", { cause: e });
332
+ });
333
+ }
334
+
295
335
  subscribeToPresenceUpdates(
296
336
  documentId: DocumentId,
297
337
  callback: (update: PresenceCollaborativeUpdate) => void,
@@ -398,6 +438,10 @@ class FoundryEventServiceImpl implements FoundryEventService {
398
438
  this.eventService.unsubscribe(internalSession.activitySubscriptionId);
399
439
  }
400
440
 
441
+ if (internalSession.metadataSubscriptionId) {
442
+ this.eventService.unsubscribe(internalSession.metadataSubscriptionId);
443
+ }
444
+
401
445
  if (internalSession.presenceSubscriptionId) {
402
446
  this.eventService.unsubscribe(internalSession.presenceSubscriptionId);
403
447
  }
@@ -467,6 +511,16 @@ class FoundryEventServiceImpl implements FoundryEventService {
467
511
  load: DocumentLoadStatus.LOADED,
468
512
  });
469
513
 
514
+ break;
515
+ case "deletion":
516
+ this.logger.info("Document was deleted", {
517
+ docId: session.documentId,
518
+ deletionMethod: message.deletionMethod,
519
+ });
520
+ onStatusChange({
521
+ error: new Error(`Document was deleted [${message.deletionMethod}]`),
522
+ load: DocumentLoadStatus.ERROR,
523
+ });
470
524
  break;
471
525
  default:
472
526
  message satisfies never;
@@ -510,11 +564,14 @@ function isEditDescription(obj: unknown): obj is EditDescription {
510
564
  }
511
565
 
512
566
  function createDocumentEditDescription(editDescription: EditDescription): DocumentEditDescription {
567
+ const eventType = getMetadata(editDescription.model).name;
513
568
  return {
514
569
  eventData: {
515
570
  data: editDescription.data,
571
+ eventType,
516
572
  version: 1,
517
573
  },
518
- eventType: getMetadata(editDescription.model).name,
574
+ // TODO: remove duplicate after updating platform sdk
575
+ eventType,
519
576
  };
520
577
  }
package/src/index.ts CHANGED
@@ -20,3 +20,4 @@ export type {
20
20
  PresenceSubscriptionOptions,
21
21
  SyncSession,
22
22
  } from "./FoundryEventService.js";
23
+ export type { SubscriptionId } from "./types/EventService.js";