defereredPersistentStorage.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package deferredpersistentstorage
  2. import (
  3. "context"
  4. "github.com/v2fly/v2ray-core/v5/app/persistentstorage"
  5. "github.com/v2fly/v2ray-core/v5/common/errors"
  6. "github.com/v2fly/v2ray-core/v5/features/extension/storage"
  7. )
  8. type DeferredPersistentStorage interface {
  9. storage.ScopedPersistentStorage
  10. ProvideInner(ctx context.Context, inner persistentstorage.ScopedPersistentStorage)
  11. }
  12. var errNotExist = errors.New("persistent storage does not exist")
  13. type deferredPersistentStorage struct {
  14. ready context.Context
  15. done context.CancelFunc
  16. inner persistentstorage.ScopedPersistentStorage
  17. awaitingChildren []*deferredPersistentStorage
  18. intoScopes []string
  19. }
  20. func (d *deferredPersistentStorage) ScopedPersistentStorageEngine() {
  21. }
  22. func (d *deferredPersistentStorage) Put(ctx context.Context, key []byte, value []byte) error {
  23. <-d.ready.Done()
  24. if d.inner == nil {
  25. return errNotExist
  26. }
  27. return d.inner.Put(ctx, key, value)
  28. }
  29. func (d *deferredPersistentStorage) Get(ctx context.Context, key []byte) ([]byte, error) {
  30. <-d.ready.Done()
  31. if d.inner == nil {
  32. return nil, errNotExist
  33. }
  34. return d.inner.Get(ctx, key)
  35. }
  36. func (d *deferredPersistentStorage) List(ctx context.Context, keyPrefix []byte) ([][]byte, error) {
  37. <-d.ready.Done()
  38. if d.inner == nil {
  39. return nil, errNotExist
  40. }
  41. return d.inner.List(ctx, keyPrefix)
  42. }
  43. func (d *deferredPersistentStorage) Clear(ctx context.Context) {
  44. <-d.ready.Done()
  45. if d.inner == nil {
  46. return
  47. }
  48. d.inner.Clear(ctx)
  49. }
  50. func (d *deferredPersistentStorage) NarrowScope(ctx context.Context, key []byte) (storage.ScopedPersistentStorage, error) {
  51. if d.ready.Err() != nil {
  52. return d.inner.NarrowScope(ctx, key)
  53. }
  54. ready, done := context.WithCancel(ctx)
  55. swallowCopyScopes := d.intoScopes
  56. dps := &deferredPersistentStorage{
  57. ready: ready,
  58. done: done,
  59. inner: nil,
  60. intoScopes: append(swallowCopyScopes, string(key)),
  61. }
  62. d.awaitingChildren = append(d.awaitingChildren, dps)
  63. return dps, nil
  64. }
  65. func (d *deferredPersistentStorage) DropScope(ctx context.Context, key []byte) error {
  66. <-d.ready.Done()
  67. if d.inner == nil {
  68. return errNotExist
  69. }
  70. return d.inner.DropScope(ctx, key)
  71. }
  72. func (d *deferredPersistentStorage) ProvideInner(ctx context.Context, inner persistentstorage.ScopedPersistentStorage) {
  73. d.inner = inner
  74. if inner != nil {
  75. for _, scope := range d.intoScopes {
  76. newScope, err := inner.NarrowScope(ctx, []byte(scope))
  77. if err != nil {
  78. panic(err)
  79. }
  80. d.inner = newScope
  81. }
  82. }
  83. for _, child := range d.awaitingChildren {
  84. child.ProvideInner(ctx, d.inner)
  85. }
  86. d.done()
  87. }
  88. func NewDeferredPersistentStorage(ctx context.Context) DeferredPersistentStorage {
  89. ready, done := context.WithCancel(ctx)
  90. return &deferredPersistentStorage{
  91. ready: ready,
  92. done: done,
  93. inner: nil,
  94. }
  95. }