Documentation
¶
Index ¶
- Variables
- func SourceDigest(path string) (string, error)
- type Config
- type Confirmation
- type ConfirmationRevocation
- type ConfirmationView
- func (v ConfirmationView) ConsumeConfirmationIntentRecord(ctx context.Context, id string, scope sessionctx.SessionScope, now time.Time) (security.ConfirmationIntentRecord, error)
- func (v ConfirmationView) FinalizeSessionConfirmationIntentRevocation(ctx context.Context, scope sessionctx.SessionScope, operationID string) error
- func (v ConfirmationView) Generation() uint64
- func (v ConfirmationView) Get(ctx context.Context, id string) (Confirmation, error)
- func (v ConfirmationView) ListConfirmationIntentRecords(ctx context.Context, pluginInstanceID string) ([]security.ConfirmationIntentRecord, error)
- func (v ConfirmationView) Put(ctx context.Context, value Confirmation) error
- func (v ConfirmationView) PutConfirmationIntentRecord(ctx context.Context, record security.ConfirmationIntentRecord, now time.Time, ...) error
- func (v ConfirmationView) RejectConfirmationIntentRecord(ctx context.Context, req security.RejectConfirmationIntentRequest) (security.ConfirmationIntentRecord, error)
- func (v ConfirmationView) Resolve(ctx context.Context, id, status string, now time.Time) (Confirmation, error)
- func (v ConfirmationView) RevokePluginConfirmationIntentRecords(ctx context.Context, ownerEnvHash, pluginInstanceID string) (int, error)
- func (v ConfirmationView) RevokeSession(ctx context.Context, value ConfirmationRevocation) (int, error)
- func (v ConfirmationView) RevokeSessionConfirmationIntentRecords(ctx context.Context, scope sessionctx.SessionScope, operationID string, ...) (int, error)
- type Event
- type Execution
- type ExecutionOwner
- type ExecutionPruneRequest
- type ExecutionPruneResult
- type ExecutionReconcileResult
- type ExecutionView
- func (v ExecutionView) Append(ctx context.Context, event execution.Event) error
- func (v ExecutionView) Create(ctx context.Context, value execution.Execution) error
- func (v ExecutionView) CreateOwned(ctx context.Context, value execution.Execution, owner ExecutionOwner) error
- func (v ExecutionView) EventsAfter(ctx context.Context, id string, cursor uint64, limit int) ([]execution.Event, error)
- func (v ExecutionView) EventsAfterOwned(ctx context.Context, id string, owner ExecutionOwner, cursor uint64, limit int) ([]execution.Event, error)
- func (v ExecutionView) Finish(ctx context.Context, id, status, failureCode string, event execution.Event, ...) error
- func (v ExecutionView) Generation() uint64
- func (v ExecutionView) Get(ctx context.Context, id string) (execution.Execution, error)
- func (v ExecutionView) GetOwned(ctx context.Context, id string, owner ExecutionOwner) (execution.Execution, error)
- func (v ExecutionView) GetReleaseInstall(ctx context.Context, ownerEnvHash, executionID string) (registry.ReleaseInstallOperation, error)
- func (v ExecutionView) GetReleaseInstallByRequest(ctx context.Context, ownerEnvHash, requestID string) (registry.ReleaseInstallOperation, error)
- func (v ExecutionView) List(ctx context.Context, pluginInstanceID string) ([]execution.Execution, error)
- func (v ExecutionView) ListOwned(ctx context.Context, pluginInstanceID string, owner ExecutionOwner, ...) ([]execution.Execution, uint64, error)
- func (v ExecutionView) ListReleaseInstalls(ctx context.Context, ownerEnvHash string) ([]registry.ReleaseInstallOperation, error)
- func (v ExecutionView) PruneTerminal(ctx context.Context, req ExecutionPruneRequest) (ExecutionPruneResult, error)
- func (v ExecutionView) ReconcileOrphans(ctx context.Context, now time.Time) (ExecutionReconcileResult, error)
- func (v ExecutionView) RequestCancel(ctx context.Context, id string, now time.Time) error
- func (v ExecutionView) RequestCancelOwned(ctx context.Context, id string, owner ExecutionOwner, now time.Time) (execution.Execution, error)
- func (v ExecutionView) StartReleaseInstall(ctx context.Context, owner ExecutionOwner, ...) (registry.ReleaseInstallOperation, bool, error)
- func (v ExecutionView) UpdateReleaseInstall(ctx context.Context, ownerEnvHash string, ...) (registry.ReleaseInstallOperation, error)
- type Faults
- type Grant
- type PluginInstall
- type PluginRecord
- type PluginSnapshot
- type Policy
- type RegistryView
- func (v RegistryView) AbortInstall(ctx context.Context, ownerEnvHash, pluginInstanceID string) error
- func (v RegistryView) Generation() uint64
- func (v RegistryView) Get(ctx context.Context, ownerEnvHash, pluginInstanceID string) (PluginSnapshot, error)
- func (v RegistryView) GetAuthorization(ctx context.Context, ownerEnvHash, pluginInstanceID string) (registry.AuthorizationSnapshot, error)
- func (v RegistryView) GetPlugin(ctx context.Context, ownerEnvHash, pluginInstanceID string) (registry.PluginRecord, error)
- func (v RegistryView) Install(ctx context.Context, value PluginInstall) error
- func (v RegistryView) InstallExternalPackage(ctx context.Context, ownerEnvHash string, ...) (registry.PluginRecord, error)
- func (v RegistryView) ListAuthorization(ctx context.Context, ownerEnvHash string) ([]registry.AuthorizationSnapshot, error)
- func (v RegistryView) ListPlugins(ctx context.Context, ownerEnvHash string) ([]registry.PluginRecord, error)
- func (v RegistryView) PutPlugin(ctx context.Context, ownerEnvHash string, record registry.PluginRecord, ...) (registry.PluginRecord, error)
- func (v RegistryView) ReplaceAuthorization(ctx context.Context, record PluginRecord, ...) error
- func (v RegistryView) ReplaceAuthorizationSnapshot(ctx context.Context, snapshot registry.AuthorizationSnapshot, ...) error
- func (v RegistryView) SetEnableState(ctx context.Context, ownerEnvHash, pluginInstanceID string, ...) (registry.PluginRecord, error)
- type SessionFence
- type SessionKey
- type SessionPhase
- type SessionView
- func (v SessionView) AccumulateSessionControl(ctx context.Context, scope sessionctx.SessionScope, delta sessionscope.Counts, ...) (sessionscope.ControlRecord, error)
- func (v SessionView) AccumulateSessionControlPhase(ctx context.Context, scope sessionctx.SessionScope, phase sessionscope.Phase, ...) (sessionscope.ControlRecord, error)
- func (v SessionView) BeginSessionControlTeardown(ctx context.Context, proposed sessionscope.ControlRecord, maxScopes int) (sessionscope.ControlRecord, error)
- func (v SessionView) DeriveSessionTeardownIdentity(ctx context.Context, key SessionKey) (string, []byte, error)
- func (v SessionView) FinalizeSessionControl(ctx context.Context, scope sessionctx.SessionScope, operationID string, ...) error
- func (v SessionView) Generation() uint64
- func (v SessionView) Get(ctx context.Context, key SessionKey) (SessionFence, []SessionPhase, error)
- func (v SessionView) GetSessionControlRecord(ctx context.Context, scope sessionctx.SessionScope) (sessionscope.ControlRecord, error)
- func (v SessionView) ListSessionControlRecords(ctx context.Context) ([]sessionscope.ControlRecord, error)
- func (v SessionView) PutFence(ctx context.Context, value SessionFence) error
- func (v SessionView) PutPhase(ctx context.Context, value SessionPhase) error
- func (v SessionView) TransitionFence(ctx context.Context, value SessionFence, expectedState string) error
- func (v SessionView) TransitionSessionControl(ctx context.Context, scope sessionctx.SessionScope, ...) (sessionscope.ControlRecord, error)
- type Source
- type Store
- func (s *Store) AppendEvent(ctx context.Context, event Event) error
- func (s *Store) BindRetained(ctx context.Context, expected plugindata.Binding, ...) (plugindata.Binding, error)
- func (s *Store) CleanupExpired(ctx context.Context, now time.Time, expected []plugindata.Binding) ([]plugindata.Binding, error)
- func (s *Store) Close() error
- func (s *Store) CommitEnable(ctx context.Context, expectedManagementRevision uint64, ...) error
- func (s *Store) CommitUninstall(ctx context.Context, req plugindata.CommitUninstallRequest) (plugindata.CommitUninstallResult, error)
- func (s *Store) Confirmations() ConfirmationView
- func (s *Store) CreateExecution(ctx context.Context, execution Execution) error
- func (s *Store) CreateObject(ctx context.Context, scope sessionctx.ScopeKind, object plugindata.Object) error
- func (s *Store) DeleteObject(ctx context.Context, scope sessionctx.ScopeKind, ...) error
- func (s *Store) DeleteRetained(ctx context.Context, expected plugindata.Binding) error
- func (s *Store) Executions() ExecutionView
- func (s *Store) Generation() uint64
- func (s *Store) GetBinding(ctx context.Context, pluginInstanceID string) (plugindata.Binding, bool, error)
- func (s *Store) GetExecution(ctx context.Context, id string) (Execution, error)
- func (s *Store) GetObject(ctx context.Context, scope sessionctx.ScopeKind, ...) (plugindata.Object, bool, error)
- func (s *Store) ListAllBindingsForMaintenance(ctx context.Context, cursor string, limit int) ([]plugindata.MaintenanceBinding, string, error)
- func (s *Store) ListAllObjectsForMaintenance(ctx context.Context, cursor string, limit int) ([]plugindata.MaintenanceObject, string, error)
- func (s *Store) ListBindings(ctx context.Context, cursor string, limit int) ([]plugindata.Binding, string, error)
- func (s *Store) ListObjects(ctx context.Context, scope sessionctx.ScopeKind, ...) ([]plugindata.Object, string, error)
- func (s *Store) Ready() bool
- func (s *Store) Registry() RegistryView
- func (s *Store) Sessions() SessionView
- func (s *Store) SwapImport(ctx context.Context, expectedManagementRevision uint64, ...) error
Constants ¶
This section is empty.
Variables ¶
var ( ErrIncompatible = errors.New("control store is incompatible") ErrMigration = errors.New("control store migration failed") ErrRequestsBlocked = errors.New("control store is not ready; requests are blocked") )
var ErrRecordNotFound = errors.New("control store record not found")
var ErrRevisionConflict = errors.New("control store revision conflict")
var ErrStateConflict = errors.New("control store state conflict")
Functions ¶
func SourceDigest ¶
Types ¶
type Confirmation ¶
type ConfirmationRevocation ¶
type ConfirmationRevocation struct {
SessionKey
TeardownOperationID string
RevokedCount int
RawJSON json.RawMessage
}
type ConfirmationView ¶
type ConfirmationView struct {
// contains filtered or unexported fields
}
func (ConfirmationView) ConsumeConfirmationIntentRecord ¶
func (v ConfirmationView) ConsumeConfirmationIntentRecord(ctx context.Context, id string, scope sessionctx.SessionScope, now time.Time) (security.ConfirmationIntentRecord, error)
func (ConfirmationView) FinalizeSessionConfirmationIntentRevocation ¶
func (v ConfirmationView) FinalizeSessionConfirmationIntentRevocation(ctx context.Context, scope sessionctx.SessionScope, operationID string) error
func (ConfirmationView) Generation ¶
func (v ConfirmationView) Generation() uint64
func (ConfirmationView) Get ¶
func (v ConfirmationView) Get(ctx context.Context, id string) (Confirmation, error)
func (ConfirmationView) ListConfirmationIntentRecords ¶
func (v ConfirmationView) ListConfirmationIntentRecords(ctx context.Context, pluginInstanceID string) ([]security.ConfirmationIntentRecord, error)
func (ConfirmationView) Put ¶
func (v ConfirmationView) Put(ctx context.Context, value Confirmation) error
func (ConfirmationView) PutConfirmationIntentRecord ¶
func (v ConfirmationView) PutConfirmationIntentRecord(ctx context.Context, record security.ConfirmationIntentRecord, now time.Time, options security.ConfirmationIntentStoreOptions) error
PutConfirmationIntentRecord implements security's durable control-store boundary without opening or initializing a second SQLite owner.
func (ConfirmationView) RejectConfirmationIntentRecord ¶
func (v ConfirmationView) RejectConfirmationIntentRecord(ctx context.Context, req security.RejectConfirmationIntentRequest) (security.ConfirmationIntentRecord, error)
func (ConfirmationView) Resolve ¶
func (v ConfirmationView) Resolve(ctx context.Context, id, status string, now time.Time) (Confirmation, error)
func (ConfirmationView) RevokePluginConfirmationIntentRecords ¶
func (ConfirmationView) RevokeSession ¶
func (v ConfirmationView) RevokeSession(ctx context.Context, value ConfirmationRevocation) (int, error)
func (ConfirmationView) RevokeSessionConfirmationIntentRecords ¶
func (v ConfirmationView) RevokeSessionConfirmationIntentRecords(ctx context.Context, scope sessionctx.SessionScope, operationID string, maxRevocations int) (int, error)
type Event ¶
type Event = executionmodel.Event
type Execution ¶
type Execution = executionmodel.Execution
type ExecutionOwner ¶
type ExecutionOwner struct {
OwnerSessionHash string
OwnerUserHash string
OwnerEnvHash string
SessionChannelIDHash string
}
func (ExecutionOwner) Valid ¶
func (owner ExecutionOwner) Valid() bool
type ExecutionPruneRequest ¶
type ExecutionPruneResult ¶
type ExecutionPruneResult struct{ Deleted int }
type ExecutionView ¶
type ExecutionView struct {
// contains filtered or unexported fields
}
func (ExecutionView) CreateOwned ¶
func (v ExecutionView) CreateOwned(ctx context.Context, value execution.Execution, owner ExecutionOwner) error
func (ExecutionView) EventsAfter ¶
func (ExecutionView) EventsAfterOwned ¶
func (v ExecutionView) EventsAfterOwned(ctx context.Context, id string, owner ExecutionOwner, cursor uint64, limit int) ([]execution.Event, error)
func (ExecutionView) Generation ¶
func (v ExecutionView) Generation() uint64
func (ExecutionView) GetOwned ¶
func (v ExecutionView) GetOwned(ctx context.Context, id string, owner ExecutionOwner) (execution.Execution, error)
func (ExecutionView) GetReleaseInstall ¶
func (v ExecutionView) GetReleaseInstall(ctx context.Context, ownerEnvHash, executionID string) (registry.ReleaseInstallOperation, error)
func (ExecutionView) GetReleaseInstallByRequest ¶
func (v ExecutionView) GetReleaseInstallByRequest(ctx context.Context, ownerEnvHash, requestID string) (registry.ReleaseInstallOperation, error)
func (ExecutionView) ListReleaseInstalls ¶
func (v ExecutionView) ListReleaseInstalls(ctx context.Context, ownerEnvHash string) ([]registry.ReleaseInstallOperation, error)
func (ExecutionView) PruneTerminal ¶
func (v ExecutionView) PruneTerminal(ctx context.Context, req ExecutionPruneRequest) (ExecutionPruneResult, error)
PruneTerminal atomically removes the oldest terminal executions selected by age or the per-owner plugin cap. execution_events follow through the schema's cascading foreign key.
func (ExecutionView) ReconcileOrphans ¶
func (v ExecutionView) ReconcileOrphans(ctx context.Context, now time.Time) (ExecutionReconcileResult, error)
ReconcileOrphans atomically terminates executions whose process-local owner cannot survive a Host restart. A pending cancellation converges to canceled; every other non-terminal execution converges to orphaned.
func (ExecutionView) RequestCancel ¶
func (ExecutionView) RequestCancelOwned ¶
func (v ExecutionView) RequestCancelOwned(ctx context.Context, id string, owner ExecutionOwner, now time.Time) (execution.Execution, error)
func (ExecutionView) StartReleaseInstall ¶
func (v ExecutionView) StartReleaseInstall(ctx context.Context, owner ExecutionOwner, req registry.StartReleaseInstallOperationRequest) (registry.ReleaseInstallOperation, bool, error)
func (ExecutionView) UpdateReleaseInstall ¶
func (v ExecutionView) UpdateReleaseInstall(ctx context.Context, ownerEnvHash string, req registry.UpdateReleaseInstallOperationRequest) (registry.ReleaseInstallOperation, error)
type PluginInstall ¶
type PluginInstall struct {
Record PluginRecord
Grants []Grant
Policy *Policy
}
type PluginRecord ¶
type PluginRecord struct {
OwnerEnvHash string
PluginInstanceID string
PublisherID string
PluginID string
Version string
ActiveFingerprint string
PackageSHA256 string
ManifestSHA256 string
EntriesSHA256 string
State string
DisabledReason string
PolicyRevision uint64
ManagementRevision uint64
RevokeEpoch uint64
InstalledAt int64
EnabledAt *int64
UpdatedAt int64
DeletedAt *int64
RawJSON json.RawMessage
}
type PluginSnapshot ¶
type PluginSnapshot struct {
Record PluginRecord
Grants []Grant
Policy *Policy
}
type RegistryView ¶
type RegistryView struct {
// contains filtered or unexported fields
}
func (RegistryView) AbortInstall ¶
func (v RegistryView) AbortInstall(ctx context.Context, ownerEnvHash, pluginInstanceID string) error
func (RegistryView) Generation ¶
func (v RegistryView) Generation() uint64
func (RegistryView) Get ¶
func (v RegistryView) Get(ctx context.Context, ownerEnvHash, pluginInstanceID string) (PluginSnapshot, error)
func (RegistryView) GetAuthorization ¶
func (v RegistryView) GetAuthorization(ctx context.Context, ownerEnvHash, pluginInstanceID string) (registry.AuthorizationSnapshot, error)
func (RegistryView) GetPlugin ¶
func (v RegistryView) GetPlugin(ctx context.Context, ownerEnvHash, pluginInstanceID string) (registry.PluginRecord, error)
func (RegistryView) Install ¶
func (v RegistryView) Install(ctx context.Context, value PluginInstall) error
func (RegistryView) InstallExternalPackage ¶
func (v RegistryView) InstallExternalPackage(ctx context.Context, ownerEnvHash string, req registry.InstallExternalPackageRequest) (registry.PluginRecord, error)
InstallExternalPackage commits the complete installed record and clears any previous grants and policy in the same control-DB transaction. Inspection identifiers and receipts never enter this store.
func (RegistryView) ListAuthorization ¶
func (v RegistryView) ListAuthorization(ctx context.Context, ownerEnvHash string) ([]registry.AuthorizationSnapshot, error)
func (RegistryView) ListPlugins ¶
func (v RegistryView) ListPlugins(ctx context.Context, ownerEnvHash string) ([]registry.PluginRecord, error)
func (RegistryView) PutPlugin ¶
func (v RegistryView) PutPlugin(ctx context.Context, ownerEnvHash string, record registry.PluginRecord, now time.Time) (registry.PluginRecord, error)
func (RegistryView) ReplaceAuthorization ¶
func (v RegistryView) ReplaceAuthorization(ctx context.Context, record PluginRecord, expected registry.AuthorizationRevisions, grants []Grant, policy *Policy) error
func (RegistryView) ReplaceAuthorizationSnapshot ¶
func (v RegistryView) ReplaceAuthorizationSnapshot(ctx context.Context, snapshot registry.AuthorizationSnapshot, expected registry.AuthorizationRevisions) error
func (RegistryView) SetEnableState ¶
func (v RegistryView) SetEnableState(ctx context.Context, ownerEnvHash, pluginInstanceID string, state registry.EnableState, reason string, now time.Time) (registry.PluginRecord, error)
type SessionFence ¶
type SessionFence struct {
SessionKey
State string
ProofSHA256 []byte
UpdatedAt int64
RawJSON json.RawMessage
}
type SessionKey ¶
type SessionPhase ¶
type SessionPhase struct {
SessionKey
Phase string
RawJSON json.RawMessage
}
type SessionView ¶
type SessionView struct {
// contains filtered or unexported fields
}
func (SessionView) AccumulateSessionControl ¶
func (v SessionView) AccumulateSessionControl(ctx context.Context, scope sessionctx.SessionScope, delta sessionscope.Counts, now time.Time) (sessionscope.ControlRecord, error)
func (SessionView) AccumulateSessionControlPhase ¶
func (v SessionView) AccumulateSessionControlPhase(ctx context.Context, scope sessionctx.SessionScope, phase sessionscope.Phase, delta sessionscope.Counts, now time.Time) (sessionscope.ControlRecord, error)
func (SessionView) BeginSessionControlTeardown ¶
func (v SessionView) BeginSessionControlTeardown(ctx context.Context, proposed sessionscope.ControlRecord, maxScopes int) (sessionscope.ControlRecord, error)
func (SessionView) DeriveSessionTeardownIdentity ¶
func (v SessionView) DeriveSessionTeardownIdentity(ctx context.Context, key SessionKey) (string, []byte, error)
DeriveSessionTeardownIdentity returns stable opaque material for one exact four-hash session scope. The only durable secret is Host-owned metadata; per-session lifecycle state remains solely in the session fence tables.
func (SessionView) FinalizeSessionControl ¶
func (v SessionView) FinalizeSessionControl(ctx context.Context, scope sessionctx.SessionScope, operationID string, proof []byte) error
func (SessionView) Generation ¶
func (v SessionView) Generation() uint64
func (SessionView) Get ¶
func (v SessionView) Get(ctx context.Context, key SessionKey) (SessionFence, []SessionPhase, error)
func (SessionView) GetSessionControlRecord ¶
func (v SessionView) GetSessionControlRecord(ctx context.Context, scope sessionctx.SessionScope) (sessionscope.ControlRecord, error)
func (SessionView) ListSessionControlRecords ¶
func (v SessionView) ListSessionControlRecords(ctx context.Context) ([]sessionscope.ControlRecord, error)
func (SessionView) PutFence ¶
func (v SessionView) PutFence(ctx context.Context, value SessionFence) error
func (SessionView) PutPhase ¶
func (v SessionView) PutPhase(ctx context.Context, value SessionPhase) error
func (SessionView) TransitionFence ¶
func (v SessionView) TransitionFence(ctx context.Context, value SessionFence, expectedState string) error
func (SessionView) TransitionSessionControl ¶
func (v SessionView) TransitionSessionControl(ctx context.Context, scope sessionctx.SessionScope, expected, next sessionscope.State, now time.Time) (sessionscope.ControlRecord, error)
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
func (*Store) BindRetained ¶
func (s *Store) BindRetained(ctx context.Context, expected plugindata.Binding, targetPluginInstanceID string, targetExpectedManagementRevision uint64, targetShape plugindata.Shape, now time.Time) (plugindata.Binding, error)
func (*Store) CleanupExpired ¶
func (s *Store) CleanupExpired(ctx context.Context, now time.Time, expected []plugindata.Binding) ([]plugindata.Binding, error)
func (*Store) CommitEnable ¶
func (s *Store) CommitEnable(ctx context.Context, expectedManagementRevision uint64, expected *plugindata.Binding, next plugindata.Binding, shape plugindata.Shape, now time.Time) error
func (*Store) CommitUninstall ¶
func (s *Store) CommitUninstall(ctx context.Context, req plugindata.CommitUninstallRequest) (plugindata.CommitUninstallResult, error)
func (*Store) Confirmations ¶
func (s *Store) Confirmations() ConfirmationView
func (*Store) CreateExecution ¶
func (*Store) CreateObject ¶
func (s *Store) CreateObject(ctx context.Context, scope sessionctx.ScopeKind, object plugindata.Object) error
func (*Store) DeleteObject ¶
func (*Store) DeleteRetained ¶
func (*Store) Executions ¶
func (s *Store) Executions() ExecutionView
func (*Store) Generation ¶
func (*Store) GetBinding ¶
func (*Store) GetExecution ¶
func (*Store) GetObject ¶
func (s *Store) GetObject(ctx context.Context, scope sessionctx.ScopeKind, pluginInstanceID, objectID string) (plugindata.Object, bool, error)
func (*Store) ListAllBindingsForMaintenance ¶
func (s *Store) ListAllBindingsForMaintenance(ctx context.Context, cursor string, limit int) ([]plugindata.MaintenanceBinding, string, error)
func (*Store) ListAllObjectsForMaintenance ¶
func (s *Store) ListAllObjectsForMaintenance(ctx context.Context, cursor string, limit int) ([]plugindata.MaintenanceObject, string, error)
func (*Store) ListBindings ¶
func (*Store) ListObjects ¶
func (*Store) Registry ¶
func (s *Store) Registry() RegistryView
func (*Store) Sessions ¶
func (s *Store) Sessions() SessionView
func (*Store) SwapImport ¶
func (s *Store) SwapImport(ctx context.Context, expectedManagementRevision uint64, expected *plugindata.Binding, next plugindata.Binding, shape plugindata.Shape, now time.Time) error