Merge branch '8784-dir-listings'
[arvados.git] / services / ws / session_v0.go
index 9a9707bb64e6d89a32833486a4c6c445e4ea8db3..bc7e6ecb9e391e5afef37edabfeffd791c4cd710 100644 (file)
@@ -1,3 +1,7 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
 package main
 
 import (
@@ -8,6 +12,7 @@ import (
        "sync/atomic"
        "time"
 
+       "git.curoverse.com/arvados.git/sdk/go/arvados"
        "github.com/Sirupsen/logrus"
 )
 
@@ -15,13 +20,14 @@ var (
        errQueueFull   = errors.New("client queue full")
        errFrameTooBig = errors.New("frame too big")
 
-       sendObjectAttributes = []string{"state", "name"}
+       sendObjectAttributes = []string{"state", "name", "owner_uuid", "portable_data_hash"}
 
        v0subscribeOK   = []byte(`{"status":200}`)
        v0subscribeFail = []byte(`{"status":400}`)
 )
 
 type v0session struct {
+       ac            *arvados.Client
        ws            wsConn
        sendq         chan<- interface{}
        db            *sql.DB
@@ -33,11 +39,15 @@ type v0session struct {
        setupOnce     sync.Once
 }
 
-func NewSessionV0(ws wsConn, sendq chan<- interface{}, db *sql.DB, pc permChecker) (session, error) {
+// newSessionV0 returns a v0 session: a partial port of the Rails/puma
+// implementation, with just enough functionality to support Workbench
+// and arv-mount.
+func newSessionV0(ws wsConn, sendq chan<- interface{}, db *sql.DB, pc permChecker, ac *arvados.Client) (session, error) {
        sess := &v0session{
                sendq:       sendq,
                ws:          ws,
                db:          db,
+               ac:          ac,
                permChecker: pc,
                log:         logger(ws.Request().Context()),
        }
@@ -85,13 +95,16 @@ func (sess *v0session) EventMessage(e *event) ([]byte, error) {
                return nil, err
        }
 
+       kind, _ := sess.ac.KindForUUID(detail.ObjectUUID)
        msg := map[string]interface{}{
                "msgID":             atomic.AddUint64(&sess.lastMsgID, 1),
                "id":                detail.ID,
                "uuid":              detail.UUID,
                "object_uuid":       detail.ObjectUUID,
                "object_owner_uuid": detail.ObjectOwnerUUID,
+               "object_kind":       kind,
                "event_type":        detail.EventType,
+               "event_at":          detail.EventAt,
        }
        if detail.Properties != nil && detail.Properties["text"] != nil {
                msg["properties"] = detail.Properties
@@ -148,6 +161,7 @@ func (sub *v0subscribe) sendOldEvents(sess *v0session) {
                sess.log.WithError(err).Error("db.Query failed")
                return
        }
+       defer rows.Close()
        for rows.Next() {
                var id uint64
                err := rows.Scan(&id)