// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

package client

import (
	
	
	

	
)

type permState int32

const (
	permStateIdle permState = iota
	permStatePermitted
)

type permission struct {
	addr  net.Addr
	st    permState    // Thread-safe (atomic op)
	mutex sync.RWMutex // Thread-safe
}

func ( *permission) ( permState) {
	atomic.StoreInt32((*int32)(&.st), int32())
}

func ( *permission) () permState {
	return permState(atomic.LoadInt32((*int32)(&.st)))
}

// Thread-safe permission map.
type permissionMap struct {
	permMap map[string]*permission
	mutex   sync.RWMutex
}

func ( *permissionMap) ( net.Addr,  *permission) bool {
	.mutex.Lock()
	defer .mutex.Unlock()
	.addr = 
	.permMap[ipnet.FingerprintAddr()] = 

	return true
}

func ( *permissionMap) ( net.Addr) (*permission, bool) {
	.mutex.RLock()
	defer .mutex.RUnlock()
	,  := .permMap[ipnet.FingerprintAddr()]

	return , 
}

func ( *permissionMap) ( net.Addr) {
	.mutex.Lock()
	defer .mutex.Unlock()
	delete(.permMap, ipnet.FingerprintAddr())
}

func ( *permissionMap) () []net.Addr {
	.mutex.RLock()
	defer .mutex.RUnlock()

	 := []net.Addr{}
	for ,  := range .permMap {
		 = append(, .addr)
	}

	return 
}

func newPermissionMap() *permissionMap {
	return &permissionMap{
		permMap: map[string]*permission{},
	}
}