// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package namespace defines an RPC services that allows remoting of the
// namespace client library over the wire.  This is useful for
// javascript so it doesn't have to implement the library.
// This should be kept in sync with the namespace library (v.io/v23/naming).
package namespace

import (
	"time"

	"v.io/v23/naming"
	"v.io/v23/security/access"
)

type Namespace interface {
	// Run a glob query and stream the results.
	Glob(pattern string) stream<_, naming.GlobReply> error
	// Mount mounts a server under the given name.
	Mount(name, server string, ttl time.Duration, replace bool) error
	// Unmount removes an existing mount point.
	Unmount(name, server string) error
	// Resolve resolves a name to an address.
	Resolve(name string) ([]string | error)
	// ResolveToMountTable resolves a name to the address of the mounttable
	// directly hosting it.
	ResolveToMountTable(name string) ([]string | error)
	// FlushCacheEntry removes the namespace cache entry for a given name.
	FlushCacheEntry(name string) (bool | error)
	// DisableCache disables the naming cache.
	DisableCache(disable bool) error
	// Roots returns the addresses of the current mounttable roots.
	Roots() ([]string | error)
	// SetRoots sets the current mounttable roots.
	SetRoots(roots []string) error
	// SetPermissions sets the AccessList in a node in a mount table.
	SetPermissions(name string, perms access.Permissions, version string) error
	// GetPermissions returns the AccessList in a node in a mount table.
	GetPermissions(name string) (perms access.Permissions, version string | error)
	// Delete deletes the name from the mounttable and, if requested, any subtree.
	Delete(name string, deleteSubtree bool) error
}
