Apicurio / apicurio-studio

Open Source API Design
https://www.apicur.io/studio/
Apache License 2.0
976 stars 493 forks source link

My teammates cannot see their own modifications #1719

Open wilvdb opened 2 years ago

wilvdb commented 2 years ago

I created an API that I share with my teammates (UI and API are configured as shared with everyone). I can see modifications of my teammates, and they can see my modifications, but they can see their own modifications. Is there any configuration I missed ?

EricWittmann commented 2 years ago

Can you provide some more details? For example:

Anything else that might help?

wilvdb commented 2 years ago

We are using version 0.2.48-FInal deployed on openshift. The modifications are lost when one of my teammates come back to the spec.

EricWittmann commented 2 years ago

So are modifications to APIs simply never persisted? If you create an API, the make changes to it, then close your browser and come back later, are all those changes lost? If you have access to the DB it would be useful to check to see if any rows are being written to this table:

https://github.com/Apicurio/apicurio-studio/blob/master/back-end/hub-core/src/main/resources/io/apicurio/hub/core/storage/jdbc/hub_mysql5.ddl#L15

The way things should work is that whenever a change is made to an API, that change is written as a single row in that table (in the DB). Once the change is written to the DB, it is then sent out (via websocket) to all users who are actively editing the same API. The latter shouldn't be able to happen if the former failed. So you should have rows in that table. But if you have rows in that table then you shouldn't be losing any modifications when someone leaves and comes back.

Have you deployed a single replica of each pod? Or are you deploying multiple replicas?

One thing that would help a lot would be the contents of the browser's console when this happens. The output from two different users editing the same API and then one of them leaving and coming back in would be ideal.

wilvdb commented 2 years ago

We reproduced the issue. I was connected, but didn't perform any action:

main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"selection","user":"xrq0g","id":"8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS","selection":"/components/schemas[StandingOrderRequest]/properties[startDate]"}"
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: 8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS
main.172d063f37a56def86d1.js:1                     Selection: /components/schemas[StandingOrderRequest]/properties[startDate]
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"command","contentVersion":6308,"command":{"__type":"ChangePropertyTypeCommand","_propPath":"/components/schemas[StandingOrderRequest]/properties[startDate]","_propName":"startDate","_newType":{"type":"string","enum":null,"of":null,"as":"date","required":false},"_oldProperty":{"format":"date","description":"Start Date","type":"string"},"_oldRequired":true,"_nullRequired":false},"author":"xrq0g","reverted":false}"
main.172d063f37a56def86d1.js:1                     Message type: command
main.172d063f37a56def86d1.js:1                     Content Version: 6308
main.172d063f37a56def86d1.js:1                     Command: {__type: "ChangePropertyTypeCommand", _propPath: "/components/schemas[StandingOrderRequest]/properties[startDate]", _propName: "startDate", _newType: {…}, _oldProperty: {…}, …}
main.172d063f37a56def86d1.js:1                     Reverted: false
main.172d063f37a56def86d1.js:1 [OtEngine] Executing command with content version: 6308
main.172d063f37a56def86d1.js:1 [ChangePropertyTypeCommand] Executing: [object Object]
main.172d063f37a56def86d1.js:1 [ApiCatalogService] Updating the API catalog.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Sending PING.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"selection","user":"xrq0g","id":"8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS","selection":"/components/schemas[StandingOrder]"}"
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: 8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS
main.172d063f37a56def86d1.js:1                     Selection: /components/schemas[StandingOrder]
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"selection","user":"xrq0g","id":"8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS","selection":"/components/schemas[StandingOrderRequest]"}"
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: 8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS
main.172d063f37a56def86d1.js:1                     Selection: /components/schemas[StandingOrderRequest]
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"leave","user":"xrq0g","id":"8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS"}"
main.172d063f37a56def86d1.js:1                     Message type: leave
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: 8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] User left the session, clearing their selection.
main.172d063f37a56def86d1.js:1 [CollaboratorSelections] Selection for 8b9VftsdkeVVGEXH5LmhtgItEZgYvaNky2VhMnLS is null, removing.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"join","user":"xrq0g","id":"ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R"}"
main.172d063f37a56def86d1.js:1                     Message type: join
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"selection","user":"xrq0g","id":"ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R"}"
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R
main.172d063f37a56def86d1.js:1                     Selection: undefined
main.172d063f37a56def86d1.js:1 [CollaboratorSelections] Selection for ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R is null, removing.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. "{"type":"selection","user":"xrq0g","id":"ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R","selection":"/components/schemas[StandingOrderRequest]"}"
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: xrq0g
main.172d063f37a56def86d1.js:1                     ID: ekzw940hYcZ53-rbVs0ICUwNDHmXaYrzrHQnpC5R
main.172d063f37a56def86d1.js:1                     Selection: /components/schemas[StandingOrderRequest]
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Sending PING.

My colleague connected to the app, perform a modification, exit the design and come back to it:

main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Node selection detected (from the selection service)
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Selection changed to path: /components/schemas[StandingOrderRequest]/properties[startDate]
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Command execution detected (from the command service)
main.172d063f37a56def86d1.js:1 [OtEngine] Executing PENDING command with contentId: 1639055309508
main.172d063f37a56def86d1.js:1 [ChangePropertyTypeCommand] Executing: [object Object]
main.172d063f37a56def86d1.js:1 [ApiCatalogService] Updating the API catalog.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ValidationProblemComponent] Invalidating cache.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. '{"type":"ack","contentVersion":6308,"commandId":1639055309508,"ackType":"command"}'
main.172d063f37a56def86d1.js:1                     Message type: ack
main.172d063f37a56def86d1.js:1                     Command Id: 1639055309508
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] Finalizing command with local id: 1639055309508
main.172d063f37a56def86d1.js:1 [OtEngine] Finalizing command with contentId: 1639055309508  and new contentVersion: 6308
main.172d063f37a56def86d1.js:1 [OtEngine] Pending command is 'next up', performing simple shift from pending to finalized.
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] Cancelling the auto-retry timer.
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Node selection detected (from the selection service)
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Selection changed to path: /components/schemas[StandingOrder]
main.172d063f37a56def86d1.js:1 marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options
w @ main.172d063f37a56def86d1.js:1
x @ main.172d063f37a56def86d1.js:1
e.ngOnChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
xr @ main.172d063f37a56def86d1.js:1
Wr @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
updateDirectives @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
e.detectChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.tick @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
e.run @ main.172d063f37a56def86d1.js:1
next @ main.172d063f37a56def86d1.js:1
l @ main.172d063f37a56def86d1.js:1
t.__tryOrUnsub @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.emit @ main.172d063f37a56def86d1.js:1
ei @ main.172d063f37a56def86d1.js:1
ni @ main.172d063f37a56def86d1.js:1
onInvokeTask @ main.172d063f37a56def86d1.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
Show 47 more frames
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Node selection detected (from the selection service)
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Selection changed to path: /components/schemas[StandingOrderRequest]
main.172d063f37a56def86d1.js:1 [ApisPageComponent] loadAsyncPageData
main.172d063f37a56def86d1.js:1 [ApisService] Getting all APIs
main.172d063f37a56def86d1.js:1 [ApisService] Fetching API list: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs
main.172d063f37a56def86d1.js:1 [ApiEditingSession] WS connection to server CLOSED: CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: '', type: 'close', …}
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] **Notice** editing session DROPPED!  Reason code: 1006
main.172d063f37a56def86d1.js:1 [ApiDetailPageComponent] Loading async page data
main.172d063f37a56def86d1.js:1 [ApisService] Getting an API Design: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs/37
main.172d063f37a56def86d1.js:1 [ApisService] Getting contributors: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs/37/contributors
main.172d063f37a56def86d1.js:1 [ApisService] Getting all activity for API 37
main.172d063f37a56def86d1.js:1 [ApisService] Fetching API design activity: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs/37/activity?end=10
main.172d063f37a56def86d1.js:1 marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options
w @ main.172d063f37a56def86d1.js:1
x @ main.172d063f37a56def86d1.js:1
e.ngOnChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
xr @ main.172d063f37a56def86d1.js:1
Wr @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
updateDirectives @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
e.detectChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.tick @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
e.run @ main.172d063f37a56def86d1.js:1
next @ main.172d063f37a56def86d1.js:1
l @ main.172d063f37a56def86d1.js:1
t.__tryOrUnsub @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.emit @ main.172d063f37a56def86d1.js:1
ei @ main.172d063f37a56def86d1.js:1
onHasTask @ main.172d063f37a56def86d1.js:1
e.hasTask @ polyfills.9c67d1be23abf75fea1a.js:1
e._updateTaskCount @ polyfills.9c67d1be23abf75fea1a.js:1
t._updateTaskCount @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
y @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
load (async)
z @ polyfills.9c67d1be23abf75fea1a.js:1
e.scheduleTask @ polyfills.9c67d1be23abf75fea1a.js:1
onScheduleTask @ polyfills.9c67d1be23abf75fea1a.js:1
e.scheduleTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.scheduleTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.scheduleEventTask @ polyfills.9c67d1be23abf75fea1a.js:1
(anonymous) @ polyfills.9c67d1be23abf75fea1a.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e._trySubscribe @ main.172d063f37a56def86d1.js:1
e.subscribe @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
G @ main.172d063f37a56def86d1.js:1
t._innerSub @ main.172d063f37a56def86d1.js:1
t._tryNext @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e._trySubscribe @ main.172d063f37a56def86d1.js:1
e.subscribe @ main.172d063f37a56def86d1.js:1
e.call @ main.172d063f37a56def86d1.js:1
e.subscribe @ main.172d063f37a56def86d1.js:1
e.call @ main.172d063f37a56def86d1.js:1
e.subscribe @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
t @ polyfills.9c67d1be23abf75fea1a.js:1
e.toPromise @ main.172d063f37a56def86d1.js:1
e.httpGet @ main.172d063f37a56def86d1.js:1
t.getApi @ main.172d063f37a56def86d1.js:1
t.loadAsyncPageData @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
t.__tryOrUnsub @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._subscribe @ main.172d063f37a56def86d1.js:1
e._trySubscribe @ main.172d063f37a56def86d1.js:1
t._trySubscribe @ main.172d063f37a56def86d1.js:1
e.subscribe @ main.172d063f37a56def86d1.js:1
e.ngOnInit @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
xr @ main.172d063f37a56def86d1.js:1
Wr @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
updateDirectives @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
e.detectChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.tick @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
e.run @ main.172d063f37a56def86d1.js:1
next @ main.172d063f37a56def86d1.js:1
l @ main.172d063f37a56def86d1.js:1
t.__tryOrUnsub @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.emit @ main.172d063f37a56def86d1.js:1
ei @ main.172d063f37a56def86d1.js:1
onHasTask @ main.172d063f37a56def86d1.js:1
e.hasTask @ polyfills.9c67d1be23abf75fea1a.js:1
e._updateTaskCount @ polyfills.9c67d1be23abf75fea1a.js:1
t._updateTaskCount @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
y @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
Show 101 more frames
main.172d063f37a56def86d1.js:1 [ApiDetailPageComponent] Activity data loaded
main.172d063f37a56def86d1.js:1 [ApiDetailPageComponent] Contributors data loaded: {totalEdits: 25, contributors: Array(2)}
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] Loading async page data
main.172d063f37a56def86d1.js:1 [ApisService] Getting an API Design: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs/37
main.172d063f37a56def86d1.js:1 [ApisService] Editing API Design: https://apicurio-studio-api-apicurio.apps.ocnp1.bnet.luxds.net/designs/37/session
main.172d063f37a56def86d1.js:1 [ApisService] Editing Session UUID: fbee9589-c75a-4145-9ae0-ff41a3cd2f71
main.172d063f37a56def86d1.js:1 [ApisService] Content Version: 6270
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] Definition loaded.  Opening editing session.
main.172d063f37a56def86d1.js:1 [ApisService] Opening editing session on URL: wss://apicurio-studio-ws-apicurio.apps.ocnp1.bnet.luxds.net/designs/37?uuid=fbee9589-c75a-4145-9ae0-ff41a3cd2f71&user=xrq0g&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJFZnhLY1BKWWxf
main.172d063f37a56def86d1.js:1 [ApiEditingSession] WS connection to server OPEN.
main.172d063f37a56def86d1.js:1 [ApiEditorPageComponent] Editing session connected.  Marking 'session' as loaded.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Starting the ping interval.
main.172d063f37a56def86d1.js:1 [EditorsService] Setting provider to:  t {selectionService: e, commandService: e, documentService: e, editorsService: e, featuresService: e, …}
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Loaded OAI content:  t {_modelId: 999, _validationProblems: {…}, _ownerDocument: t, _parent: null, _attributes: null, …}
main.172d063f37a56def86d1.js:1 [ApiCatalogService] Resetting the API catalog.
main.172d063f37a56def86d1.js:1 marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options
w @ main.172d063f37a56def86d1.js:1
x @ main.172d063f37a56def86d1.js:1
e.ngOnChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
xr @ main.172d063f37a56def86d1.js:1
Wr @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
updateDirectives @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Tr @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
Dr @ main.172d063f37a56def86d1.js:1
Ar @ main.172d063f37a56def86d1.js:1
wr @ main.172d063f37a56def86d1.js:1
e.detectChanges @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.tick @ main.172d063f37a56def86d1.js:1
(anonymous) @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.172d063f37a56def86d1.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
e.run @ main.172d063f37a56def86d1.js:1
next @ main.172d063f37a56def86d1.js:1
l @ main.172d063f37a56def86d1.js:1
t.__tryOrUnsub @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t._next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.next @ main.172d063f37a56def86d1.js:1
t.emit @ main.172d063f37a56def86d1.js:1
ei @ main.172d063f37a56def86d1.js:1
ni @ main.172d063f37a56def86d1.js:1
onInvokeTask @ main.172d063f37a56def86d1.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
Show 44 more frames
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. '{"type":"join","user":"eql9r","id":"ZZB_UV8RjX2pPNGFnutMRqtAUqpq6I6vFuMArDAs"}'
main.172d063f37a56def86d1.js:1                     Message type: join
main.172d063f37a56def86d1.js:1                     User: eql9r
main.172d063f37a56def86d1.js:1                     ID: ZZB_UV8RjX2pPNGFnutMRqtAUqpq6I6vFuMArDAs
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Message received from server. '{"type":"selection","user":"eql9r","id":"ZZB_UV8RjX2pPNGFnutMRqtAUqpq6I6vFuMArDAs"}'
main.172d063f37a56def86d1.js:1                     Message type: selection
main.172d063f37a56def86d1.js:1                     User: eql9r
main.172d063f37a56def86d1.js:1                     ID: ZZB_UV8RjX2pPNGFnutMRqtAUqpq6I6vFuMArDAs
main.172d063f37a56def86d1.js:1                     Selection: undefined
main.172d063f37a56def86d1.js:1 [CollaboratorSelections] Selection for ZZB_UV8RjX2pPNGFnutMRqtAUqpq6I6vFuMArDAs is null, removing.
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Node selection detected (from the selection service)
main.172d063f37a56def86d1.js:1 [ApiEditorComponent] Selection changed to path: /components/schemas[StandingOrderRequest]
main.172d063f37a56def86d1.js:1 [TokenAuthenticationService] Refreshing auth token: https://apicurio-studio-ui-apicurio.apps.ocnp1.bnet.luxds.net/token
main.172d063f37a56def86d1.js:1 [TokenAuthenticationService] Will refresh auth token in 300 seconds.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Sending PING.
main.172d063f37a56def86d1.js:1 [ApiEditingSession] Sending PING.
EricWittmann commented 2 years ago

This is very helpful information. What I can see here is that the changes made in the active shared editing session are not being sent when a new user joins an existing editing session. I just did the same test as you did and here is the console output for the final step in your reproducer actions (when user1 reconnects to the editing session and doesn't see the latest changes):

[ValidationService] Getting all validation profiles main-es2015.4eeab743bb602c8953d1.js:1:3847581
[ValidationService] Fetching validation profiles: https://studio-api.apicur.io/validationProfiles main-es2015.4eeab743bb602c8953d1.js:1:3847743
[ApiEditorPageComponent] Loading async page data main-es2015.4eeab743bb602c8953d1.js:1:4839454
[ApisService] Getting an API Design: https://studio-api.apicur.io/designs/46382 main-es2015.4eeab743bb602c8953d1.js:1:3551402
[ApisService] Editing API Design: https://studio-api.apicur.io/designs/46382/session main-es2015.4eeab743bb602c8953d1.js:1:3551634
[ApisService] Editing Session UUID: 2410a797-2cae-41d4-a84d-619010de5b99 main-es2015.4eeab743bb602c8953d1.js:1:3551865
[ApisService] Content Version: 3332777 main-es2015.4eeab743bb602c8953d1.js:1:3551922
[ApiEditorPageComponent] Definition loaded.  Opening editing session. main-es2015.4eeab743bb602c8953d1.js:1:4839678
[ApisService] Opening editing session on URL: wss://studio-ws.apicur.io/designs/46382?uuid=2410a797-2cae-41d4-a84d-619010de5b99&user=eric.wittmann%40gmail.com&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJaRXZNMDF2N3VJ main-es2015.4eeab743bb602c8953d1.js:1:3552341
[ApiEditingSession] WS connection to server OPEN. main-es2015.4eeab743bb602c8953d1.js:1:3543948
[ApiEditorPageComponent] Editing session connected.  Marking 'session' as loaded. main-es2015.4eeab743bb602c8953d1.js:1:4841028
[ApiEditingSession] Starting the ping interval. main-es2015.4eeab743bb602c8953d1.js:1:3547780
[ApiEditorComponent] Subscribing to API Catalog changes. main-es2015.4eeab743bb602c8953d1.js:1:4549172
[EditorsService] Setting provider to:  
Object { selectionService: {…}, commandService: {…}, documentService: {…}, editorsService: {}, featuresService: {…}, collaboratorService: {…}, catalog: {…}, onCommandExecuted: {…}, onSelectionChanged: {…}, onValidationChanged: {…}, … }
main-es2015.4eeab743bb602c8953d1.js:1:3897342
[ApiEditorComponent] Loaded OAI content:  
Object { _modelId: 0, _validationProblems: {}, _ownerDocument: {…}, _parent: null, _attributes: null, _extraProperties: null, _extensions: null, info: {…}, tags: (1) […], externalDocs: null, … }
main-es2015.4eeab743bb602c8953d1.js:1:4550898
[ApiCatalogService] Resetting the API catalog. main-es2015.4eeab743bb602c8953d1.js:1:4142882
[ApiCatalogService] All external references from document:  
Array []
main-es2015.4eeab743bb602c8953d1.js:1:4142389
marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options main-es2015.4eeab743bb602c8953d1.js:1:1108162
[ApiEditingSession] Message received from server.  {"type":"join","user":"eric.wittmann@gmail.com","id":"XPA_a_LifI9IMrmXmXrHNxXlbmOM_VZnzw5ttps3"} main-es2015.4eeab743bb602c8953d1.js:1:3544107
                    Message type: join main-es2015.4eeab743bb602c8953d1.js:1:3544211
                    User: eric.wittmann@gmail.com main-es2015.4eeab743bb602c8953d1.js:1:3545453
                    ID: XPA_a_LifI9IMrmXmXrHNxXlbmOM_VZnzw5ttps3 main-es2015.4eeab743bb602c8953d1.js:1:3545505
[ApiEditingSession] Message received from server.  {"type":"command","contentVersion":3384621,"command":{"__type":"ChangeVersionCommand","_newVersion":"1.0.8","_oldVersion":"1.0.7","_nullInfo":false},"author":"eric.wittmann@gmail.com","reverted":false} main-es2015.4eeab743bb602c8953d1.js:1:3544107
                    Message type: command main-es2015.4eeab743bb602c8953d1.js:1:3544211
                    Content Version:  3384621 main-es2015.4eeab743bb602c8953d1.js:1:3544294
                    Command:  
Object { __type: "ChangeVersionCommand", _newVersion: "1.0.8", _oldVersion: "1.0.7", _nullInfo: false }
main-es2015.4eeab743bb602c8953d1.js:1:3544367
                    Reverted:  false main-es2015.4eeab743bb602c8953d1.js:1:3544425
[OtEngine] Executing command with content version:  3384621 main-es2015.4eeab743bb602c8953d1.js:1:2488413
[ChangeVersionCommand] Executing. main-es2015.4eeab743bb602c8953d1.js:1:2488413
[ApiCatalogService] Updating the API catalog. main-es2015.4eeab743bb602c8953d1.js:1:4142971
[ApiCatalogService] All external references from document:  
Array []
main-es2015.4eeab743bb602c8953d1.js:1:4142389
[ValidationProblemComponent] Invalidating cache. 3 main-es2015.4eeab743bb602c8953d1.js:1:4175215
[ApiEditingSession] Message received from server.  {"type":"selection","user":"eric.wittmann@gmail.com","id":"XPA_a_LifI9IMrmXmXrHNxXlbmOM_VZnzw5ttps3","selection":"/info/version"} main-es2015.4eeab743bb602c8953d1.js:1:3544107
                    Message type: selection main-es2015.4eeab743bb602c8953d1.js:1:3544211
                    User: eric.wittmann@gmail.com main-es2015.4eeab743bb602c8953d1.js:1:3545957
                    ID: XPA_a_LifI9IMrmXmXrHNxXlbmOM_VZnzw5ttps3 main-es2015.4eeab743bb602c8953d1.js:1:3546009
                    Selection: /info/version

The thing to notice here is that I received a command as part of that initial opening of the editor (the part where I got a Message type: command message from the server).

The way it works is that when a user connects to an "open" editing session (i.e they are NOT the first user in the session), the server will send them the raw content of the API spec as it was at the start of the editing session. THEN it will send all of the commands performed since that time. This is needed in case one of the users already in the session chooses to undo a command.

I can't imagine why the server is not sending those commands. A couple of things:

1) What DB are you using? Mysql? PG? 2) Can you perform this same test using https://studio.apicur.io/ instead of your local install? 3) If you have access to the DB, can you check the api_content table to make sure information is being written as expected? You should see one row in that table for each operation/command performed by any user in the editor.

Note: (2) above will tell us if the problem is with your browser(s) or if it's with the server.

wilvdb commented 2 years ago
  1. We are using postgres
  2. We cannot reproduce it on https://studio.apicur.io/
  3. api_content contains the modifications

I made another test by replacing API owner in acl table by the id of my colleague and we performed the same test. This time, I cannot see the modifications, but he can see mine, and I cannot retrieve any of my modifications.

wilvdb commented 2 years ago

Now collaboration is activated :

I sent an invitation to one of my colleague and now we are able to collaborate on the design. Before, we were sharing the same session, but now, each of us has it's own session.

EricWittmann commented 2 years ago

This is very odd behavior and not something I've ever seen before. I have no theories about what is going on here.

The best I could offer is to add some diagnostics to the code to see if we can track down the problem. I'm happy to do that if you're interested.