package internal // //import ( // misc2 "amuz.es/src/mercury/endpoint/misc" // "amuz.es/src/mercury/service/models" // "amuz.es/src/go/misc" // "amuz.es/src/mercury/util/mycrypt" // "github.com/pkg/errors" // "io" // "log" // "reflect" //) // //// 인터페이스가 실제구현체랑 호환되는가 //var _ misc2.Session = (*SessionImpl)(nil) // //type SessionImpl struct { // FBox mycrypt.SecretBox // FUser models.User // FToken misc.UUID // FData map[string]any // FSyncer func(newdata SessionImpl) error //} // //func (sess *SessionImpl) Id() misc.UUID { return sess.FToken } //func (sess *SessionImpl) User() models.User { return sess.FUser } //func (sess *SessionImpl) SetUser(user models.User) { // sess.Create() // sess.FUser = user //} //func (sess *SessionImpl) Delete() { // if !sess.FToken.IsZero() { // sess.FToken = misc.UUID{} // } //} //func (sess *SessionImpl) Create() { // if sess.FToken.IsZero() { // sess.FToken.Random() // } // if sess.FData == nil { // sess.FData = make(map[string]any) // } //} //func (sess *SessionImpl) Get(key string) any { // if sess.FData == nil { // return nil // } // data, ok := sess.FData[key] // if !ok { // return nil // } else { // return data // } //} //func (sess *SessionImpl) Set(key string, data any) { // sess.Create() // reflectVal := reflect.ValueOf(data) // if reflectVal.IsValid() && reflectVal.Kind() == reflect.Ptr { // reflectVal = reflectVal.Elem() // } // // switch reflectVal.Kind() { // case reflect.Struct: // sess.FData[key] = data // case reflect.Array, reflect.Map, reflect.Slice, reflect.String: // if reflectVal.Len() == 0 { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // case reflect.Bool: // if !reflectVal.Bool() { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: // if reflectVal.Int() == 0 { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: // if reflectVal.Uint() == 0 { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // case reflect.Float32, reflect.Float64: // if reflectVal.Float() == 0 { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // case reflect.Interface, reflect.Ptr: // if reflectVal.IsNil() { // delete(sess.FData, key) // } else { // sess.FData[key] = data // } // default: // //do nothing // } //} //func (sess *SessionImpl) ApplyChanges() (err error) { // if sess.FSyncer == nil { // err = errors.New("cannot sync session,FSyncer is nil!! ") // return // } else if syncererr := sess.FSyncer(*sess); syncererr != nil { // err = errors.Wrap(syncererr, "cannot sync session: ") // } // log.Print("session id ", sess.FToken.ToHexString(), ", FUser ", sess.FUser, ", FData ", sess.FData) // return //} // //func (sess *SessionImpl) NewEncryptReader(r io.Reader) (io.Reader, error) { // return sess.FBox.NewEncryptReader(r) //} //func (sess *SessionImpl) NewDecryptReader(r io.Reader) (io.Reader, error) { // return sess.FBox.NewDecryptReader(r) //} //func (sess *SessionImpl) NewEncryptWriter(w io.Writer) (io.WriteCloser, error) { // return sess.FBox.NewEncryptWriter(w) //} //func (sess *SessionImpl) NewDecryptWriter(w io.Writer) (io.WriteCloser, error) { // return sess.FBox.NewDecryptWriter(w) //} //func (sess *SessionImpl) EncryptedSize(size uint64) (uint64, error) { // return sess.FBox.EncryptedSize(size) //} //func (sess *SessionImpl) DecryptedSize(size uint64) (uint64, error) { // return sess.FBox.DecryptedSize(size) //}