diff --git a/filestore/filestore.go b/filestore/filestore.go index 23a1618..4944dbd 100644 --- a/filestore/filestore.go +++ b/filestore/filestore.go @@ -55,6 +55,7 @@ func (store FileStore) UseIn(composer *tusd.StoreComposer) { composer.UseTerminater(store) composer.UseLocker(store) composer.UseConcater(store) + composer.UseLengthDeferrer(store) } func (store FileStore) NewUpload(info tusd.FileInfo) (id string, err error) { @@ -142,6 +143,16 @@ func (store FileStore) ConcatUploads(dest string, uploads []string) (err error) return } +func (store FileStore) DeclareLength(id string, length int64) error { + info, err := store.GetInfo(id) + if err != nil { + return err + } + info.Size = length + info.SizeIsDeferred = false + return store.writeInfo(id, info) +} + func (store FileStore) LockUpload(id string) error { lock, err := store.newLock(id) if err != nil { diff --git a/filestore/filestore_test.go b/filestore/filestore_test.go index 69c99c8..5f4c27d 100644 --- a/filestore/filestore_test.go +++ b/filestore/filestore_test.go @@ -18,6 +18,7 @@ var _ tusd.GetReaderDataStore = FileStore{} var _ tusd.TerminaterDataStore = FileStore{} var _ tusd.LockerDataStore = FileStore{} var _ tusd.ConcaterDataStore = FileStore{} +var _ tusd.LengthDeferrerDataStore = FileStore{} func TestFilestore(t *testing.T) { a := assert.New(t) @@ -146,3 +147,28 @@ func TestConcatUploads(t *testing.T) { a.Equal("abcdefghi", string(content)) reader.(io.Closer).Close() } + +func TestDeclareLength(t *testing.T) { + a := assert.New(t) + + tmp, err := ioutil.TempDir("", "tusd-filestore-declare-length-") + a.NoError(err) + + store := FileStore{tmp} + + originalInfo := tusd.FileInfo{Size: 0, SizeIsDeferred: true} + id, err := store.NewUpload(originalInfo) + a.NoError(err) + + info, err := store.GetInfo(id) + a.Equal(info.Size, originalInfo.Size) + a.Equal(info.SizeIsDeferred, originalInfo.SizeIsDeferred) + + size := int64(100) + err = store.DeclareLength(id, size) + a.NoError(err) + + updatedInfo, err := store.GetInfo(id) + a.Equal(updatedInfo.Size, size) + a.False(updatedInfo.SizeIsDeferred) +}