@@ -1719,12 +1719,20 @@ func (api *API) resolveAutostart(rw http.ResponseWriter, r *http.Request) {
1719
1719
// @Success 200 {object} codersdk.Response
1720
1720
// @Router /workspaces/{workspace}/watch [get]
1721
1721
// @Deprecated Use /workspaces/{workspace}/watch-ws instead
1722
- func (api * API ) watchWorkspace (rw http.ResponseWriter , r * http.Request ) {
1722
+ func (api * API ) watchWorkspaceSSE (rw http.ResponseWriter , r * http.Request ) {
1723
+ api .watchWorkspace (rw , r , httpapi .ServerSentEventSender )
1724
+ }
1725
+
1726
+ func (api * API ) watchWorkspaceWs (rw http.ResponseWriter , r * http.Request ) {
1727
+ api .watchWorkspace (rw , r , httpapi .OneWayWebSocket )
1728
+ }
1729
+
1730
+ func (api * API ) watchWorkspace (rw http.ResponseWriter , r * http.Request , initConn httpapi.InitConnCallback ) {
1723
1731
ctx := r .Context ()
1724
1732
workspace := httpmw .WorkspaceParam (r )
1725
1733
apiKey := httpmw .APIKey (r )
1726
1734
1727
- sendEvent , senderClosed , err := httpapi . ServerSentEventSender (rw , r )
1735
+ sendEvent , senderClosed , err := initConn (rw , r )
1728
1736
if err != nil {
1729
1737
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
1730
1738
Message : "Internal error setting up server-sent events." ,
@@ -1857,135 +1865,135 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) {
1857
1865
// @Param workspace path string true "Workspace ID" format(uuid)
1858
1866
// @Success 200 {object} codersdk.Response
1859
1867
// @Router /workspaces/{workspace}/watch [get]
1860
- func (api * API ) watchWorkspaceWs (rw http.ResponseWriter , r * http.Request ) {
1861
- ctx := r .Context ()
1862
- workspace := httpmw .WorkspaceParam (r )
1863
- apiKey := httpmw .APIKey (r )
1864
-
1865
- send , closed , err := httpapi .OneWayWebSocket [codersdk.ServerSentEvent ](rw , r )
1866
- if err != nil {
1867
- httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
1868
- Message : "Internal error setting up server-sent events." ,
1869
- Detail : err .Error (),
1870
- })
1871
- return
1872
- }
1873
- // Prevent handler from returning until the sender is closed.
1874
- defer func () {
1875
- <- closed
1876
- }()
1877
-
1878
- sendUpdate := func (_ context.Context , _ []byte ) {
1879
- workspace , err := api .Database .GetWorkspaceByID (ctx , workspace .ID )
1880
- if err != nil {
1881
- _ = send (codersdk.ServerSentEvent {
1882
- Type : codersdk .ServerSentEventTypeError ,
1883
- Data : codersdk.Response {
1884
- Message : "Internal error fetching workspace." ,
1885
- Detail : err .Error (),
1886
- },
1887
- })
1888
- return
1889
- }
1890
-
1891
- data , err := api .workspaceData (ctx , []database.Workspace {workspace })
1892
- if err != nil {
1893
- _ = send (codersdk.ServerSentEvent {
1894
- Type : codersdk .ServerSentEventTypeError ,
1895
- Data : codersdk.Response {
1896
- Message : "Internal error fetching workspace data." ,
1897
- Detail : err .Error (),
1898
- },
1899
- })
1900
- return
1901
- }
1902
- if len (data .templates ) == 0 {
1903
- _ = send (codersdk.ServerSentEvent {
1904
- Type : codersdk .ServerSentEventTypeError ,
1905
- Data : codersdk.Response {
1906
- Message : "Forbidden reading template of selected workspace." ,
1907
- },
1908
- })
1909
- return
1910
- }
1911
-
1912
- w , err := convertWorkspace (
1913
- apiKey .UserID ,
1914
- workspace ,
1915
- data .builds [0 ],
1916
- data .templates [0 ],
1917
- api .Options .AllowWorkspaceRenames ,
1918
- )
1919
- if err != nil {
1920
- _ = send (codersdk.ServerSentEvent {
1921
- Type : codersdk .ServerSentEventTypeError ,
1922
- Data : codersdk.Response {
1923
- Message : "Internal error converting workspace." ,
1924
- Detail : err .Error (),
1925
- },
1926
- })
1927
- }
1928
- _ = send (codersdk.ServerSentEvent {
1929
- Type : codersdk .ServerSentEventTypeData ,
1930
- Data : w ,
1931
- })
1932
- }
1933
-
1934
- cancelWorkspaceSubscribe , err := api .Pubsub .SubscribeWithErr (wspubsub .WorkspaceEventChannel (workspace .OwnerID ),
1935
- wspubsub .HandleWorkspaceEvent (
1936
- func (ctx context.Context , payload wspubsub.WorkspaceEvent , err error ) {
1937
- if err != nil {
1938
- return
1939
- }
1940
- if payload .WorkspaceID != workspace .ID {
1941
- return
1942
- }
1943
- sendUpdate (ctx , nil )
1944
- }))
1945
- if err != nil {
1946
- _ = send (codersdk.ServerSentEvent {
1947
- Type : codersdk .ServerSentEventTypeError ,
1948
- Data : codersdk.Response {
1949
- Message : "Internal error subscribing to workspace events." ,
1950
- Detail : err .Error (),
1951
- },
1952
- })
1953
- return
1954
- }
1955
- defer cancelWorkspaceSubscribe ()
1956
-
1957
- // This is required to show whether the workspace is up-to-date.
1958
- cancelTemplateSubscribe , err := api .Pubsub .Subscribe (watchTemplateChannel (workspace .TemplateID ), sendUpdate )
1959
- if err != nil {
1960
- _ = send (codersdk.ServerSentEvent {
1961
- Type : codersdk .ServerSentEventTypeError ,
1962
- Data : codersdk.Response {
1963
- Message : "Internal error subscribing to template events." ,
1964
- Detail : err .Error (),
1965
- },
1966
- })
1967
- return
1968
- }
1969
- defer cancelTemplateSubscribe ()
1970
-
1971
- // An initial ping signals to the request that the server is now ready
1972
- // and the client can begin servicing a channel with data.
1973
- _ = send (codersdk.ServerSentEvent {
1974
- Type : codersdk .ServerSentEventTypePing ,
1975
- })
1976
- // Send updated workspace info after connection is established. This avoids
1977
- // missing updates if the client connects after an update.
1978
- sendUpdate (ctx , nil )
1979
-
1980
- for {
1981
- select {
1982
- case <- ctx .Done ():
1983
- return
1984
- case <- closed :
1985
- return
1986
- }
1987
- }
1988
- }
1868
+ // func (api *API) watchWorkspaceWs(rw http.ResponseWriter, r *http.Request) {
1869
+ // ctx := r.Context()
1870
+ // workspace := httpmw.WorkspaceParam(r)
1871
+ // apiKey := httpmw.APIKey(r)
1872
+ //
1873
+ // send, closed, err := httpapi.OneWayWebSocket[codersdk.ServerSentEvent](rw, r)
1874
+ // if err != nil {
1875
+ // httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
1876
+ // Message: "Internal error setting up server-sent events.",
1877
+ // Detail: err.Error(),
1878
+ // })
1879
+ // return
1880
+ // }
1881
+ // // Prevent handler from returning until the sender is closed.
1882
+ // defer func() {
1883
+ // <-closed
1884
+ // }()
1885
+ //
1886
+ // sendUpdate := func(_ context.Context, _ []byte) {
1887
+ // workspace, err := api.Database.GetWorkspaceByID(ctx, workspace.ID)
1888
+ // if err != nil {
1889
+ // _ = send(codersdk.ServerSentEvent{
1890
+ // Type: codersdk.ServerSentEventTypeError,
1891
+ // Data: codersdk.Response{
1892
+ // Message: "Internal error fetching workspace.",
1893
+ // Detail: err.Error(),
1894
+ // },
1895
+ // })
1896
+ // return
1897
+ // }
1898
+ //
1899
+ // data, err := api.workspaceData(ctx, []database.Workspace{workspace})
1900
+ // if err != nil {
1901
+ // _ = send(codersdk.ServerSentEvent{
1902
+ // Type: codersdk.ServerSentEventTypeError,
1903
+ // Data: codersdk.Response{
1904
+ // Message: "Internal error fetching workspace data.",
1905
+ // Detail: err.Error(),
1906
+ // },
1907
+ // })
1908
+ // return
1909
+ // }
1910
+ // if len(data.templates) == 0 {
1911
+ // _ = send(codersdk.ServerSentEvent{
1912
+ // Type: codersdk.ServerSentEventTypeError,
1913
+ // Data: codersdk.Response{
1914
+ // Message: "Forbidden reading template of selected workspace.",
1915
+ // },
1916
+ // })
1917
+ // return
1918
+ // }
1919
+ //
1920
+ // w, err := convertWorkspace(
1921
+ // apiKey.UserID,
1922
+ // workspace,
1923
+ // data.builds[0],
1924
+ // data.templates[0],
1925
+ // api.Options.AllowWorkspaceRenames,
1926
+ // )
1927
+ // if err != nil {
1928
+ // _ = send(codersdk.ServerSentEvent{
1929
+ // Type: codersdk.ServerSentEventTypeError,
1930
+ // Data: codersdk.Response{
1931
+ // Message: "Internal error converting workspace.",
1932
+ // Detail: err.Error(),
1933
+ // },
1934
+ // })
1935
+ // }
1936
+ // _ = send(codersdk.ServerSentEvent{
1937
+ // Type: codersdk.ServerSentEventTypeData,
1938
+ // Data: w,
1939
+ // })
1940
+ // }
1941
+ //
1942
+ // cancelWorkspaceSubscribe, err := api.Pubsub.SubscribeWithErr(wspubsub.WorkspaceEventChannel(workspace.OwnerID),
1943
+ // wspubsub.HandleWorkspaceEvent(
1944
+ // func(ctx context.Context, payload wspubsub.WorkspaceEvent, err error) {
1945
+ // if err != nil {
1946
+ // return
1947
+ // }
1948
+ // if payload.WorkspaceID != workspace.ID {
1949
+ // return
1950
+ // }
1951
+ // sendUpdate(ctx, nil)
1952
+ // }))
1953
+ // if err != nil {
1954
+ // _ = send(codersdk.ServerSentEvent{
1955
+ // Type: codersdk.ServerSentEventTypeError,
1956
+ // Data: codersdk.Response{
1957
+ // Message: "Internal error subscribing to workspace events.",
1958
+ // Detail: err.Error(),
1959
+ // },
1960
+ // })
1961
+ // return
1962
+ // }
1963
+ // defer cancelWorkspaceSubscribe()
1964
+ //
1965
+ // // This is required to show whether the workspace is up-to-date.
1966
+ // cancelTemplateSubscribe, err := api.Pubsub.Subscribe(watchTemplateChannel(workspace.TemplateID), sendUpdate)
1967
+ // if err != nil {
1968
+ // _ = send(codersdk.ServerSentEvent{
1969
+ // Type: codersdk.ServerSentEventTypeError,
1970
+ // Data: codersdk.Response{
1971
+ // Message: "Internal error subscribing to template events.",
1972
+ // Detail: err.Error(),
1973
+ // },
1974
+ // })
1975
+ // return
1976
+ // }
1977
+ // defer cancelTemplateSubscribe()
1978
+ //
1979
+ // // An initial ping signals to the request that the server is now ready
1980
+ // // and the client can begin servicing a channel with data.
1981
+ // _ = send(codersdk.ServerSentEvent{
1982
+ // Type: codersdk.ServerSentEventTypePing,
1983
+ // })
1984
+ // // Send updated workspace info after connection is established. This avoids
1985
+ // // missing updates if the client connects after an update.
1986
+ // sendUpdate(ctx, nil)
1987
+ //
1988
+ // for {
1989
+ // select {
1990
+ // case <-ctx.Done():
1991
+ // return
1992
+ // case <-closed:
1993
+ // return
1994
+ // }
1995
+ // }
1996
+ // }
1989
1997
1990
1998
// @Summary Get workspace timings by ID
1991
1999
// @ID get-workspace-timings-by-id
0 commit comments