-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMfsFolder.Modifiable.cs
147 lines (116 loc) · 6.1 KB
/
MfsFolder.Modifiable.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using CommunityToolkit.Diagnostics;
using Ipfs.CoreApi;
using OwlCore.Kubo.FolderWatchers;
using OwlCore.Storage;
namespace OwlCore.Kubo;
public partial class MfsFolder : IModifiableFolder, IMoveFrom, ICreateCopyOf
{
/// <summary>
/// The interval that MFS should be checked for updates.
/// </summary>
public TimeSpan UpdateCheckInterval { get; } = TimeSpan.FromSeconds(10);
/// <summary>
/// The options to use when adding content to this folder on ipfs.
/// </summary>
public AddFileOptions AddFileOptions { get; set; } = new();
/// <inheritdoc/>
public virtual async Task DeleteAsync(IStorableChild item, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Guard.IsNotNullOrWhiteSpace(item.Name);
await Client.Mfs.RemoveAsync($"{Path}{item.Name}", recursive: true, force: true, cancellationToken);
}
/// <inheritdoc/>
public async Task<IChildFile> CreateCopyOfAsync(IFile fileToCopy, bool overwrite, CancellationToken cancellationToken, CreateCopyOfDelegate fallback)
{
if (fileToCopy is MfsFile mfsFile)
return await CreateCopyOfAsync(mfsFile, overwrite, cancellationToken);
if (fileToCopy is IpfsFile ipfsFile)
return await CreateCopyOfAsync(ipfsFile, overwrite, cancellationToken);
if (fileToCopy is IpnsFile ipnsFile)
return await CreateCopyOfAsync(ipnsFile, overwrite, cancellationToken);
if (fileToCopy is IGetCid getCid)
{
var cid = await getCid.GetCidAsync(cancellationToken);
var newPath = $"{Path}{fileToCopy.Name}";
await Client.Mfs.CopyAsync($"/ipfs/{cid}", newPath, cancel: cancellationToken);
return new MfsFile(newPath, Client);
}
if (fileToCopy is IAddFileToGetCid addFileToGetCid)
{
var cid = await addFileToGetCid.GetCidAsync(AddFileOptions, cancellationToken);
var newPath = $"{Path}{fileToCopy.Name}";
await Client.Mfs.CopyAsync($"/ipfs/{cid}", newPath, cancel: cancellationToken);
return new MfsFile(newPath, Client);
}
return await fallback(this, fileToCopy, overwrite, cancellationToken);
}
/// <inheritdoc/>
public Task<IChildFile> MoveFromAsync(IChildFile fileToMove, IModifiableFolder source, bool overwrite, CancellationToken cancellationToken, MoveFromDelegate fallback)
{
if (fileToMove is MfsFile mfsFile)
return MoveFromAsync(mfsFile, source, overwrite, cancellationToken);
return fallback(this, fileToMove, source, overwrite, cancellationToken);
}
/// <inheritdoc cref="CreateCopyOfAsync(IFile,bool,CancellationToken,CreateCopyOfDelegate)"/>
public virtual async Task<IChildFile> CreateCopyOfAsync(MfsFile fileToCopy, bool overwrite = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
var newPath = $"{Path}{fileToCopy.Name}";
await Client.Mfs.CopyAsync(fileToCopy.Path, newPath, cancel: cancellationToken);
return new MfsFile(newPath, Client);
}
/// <inheritdoc cref="CreateCopyOfAsync(IFile,bool,CancellationToken,CreateCopyOfDelegate)"/>
public virtual async Task<IChildFile> CreateCopyOfAsync(IpfsFile fileToCopy, bool overwrite = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
var newPath = $"{Path}{fileToCopy.Name}";
await Client.Mfs.CopyAsync($"/ipfs/{fileToCopy.Id}", newPath, cancel: cancellationToken);
return new MfsFile(newPath, Client);
}
/// <inheritdoc cref="CreateCopyOfAsync(IFile,bool,CancellationToken,CreateCopyOfDelegate)"/>
public virtual async Task<IChildFile> CreateCopyOfAsync(IpnsFile fileToCopy, bool overwrite = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
var newPath = $"{Path}{fileToCopy.Name}";
var cid = await fileToCopy.GetCidAsync(cancellationToken);
await Client.Mfs.CopyAsync($"/ipfs/{cid}", newPath, cancel: cancellationToken);
return new MfsFile(newPath, Client);
}
/// <inheritdoc cref="MoveFromAsync(IChildFile,IModifiableFolder,bool,CancellationToken,MoveFromDelegate)"/>
public virtual async Task<IChildFile> MoveFromAsync(MfsFile fileToMove, IModifiableFolder source, bool overwrite = false, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
var newPath = $"{Path}{fileToMove.Name}";
await Client.Mfs.MoveAsync(fileToMove.Path, newPath, cancellationToken);
return new MfsFile(newPath, Client);
}
/// <inheritdoc cref="MoveFromAsync(IChildFile,IModifiableFolder,bool,CancellationToken,MoveFromDelegate)"/>
public virtual async Task<IChildFolder> CreateFolderAsync(string name, bool overwrite = false, CancellationToken cancellationToken = default)
{
if (overwrite)
{
await Client.Mfs.RemoveAsync($"{Path}{name}", recursive: true, force: true, cancellationToken);
}
try
{
await Client.Mfs.MakeDirectoryAsync($"{Path}{name}", cancel: cancellationToken);
}
catch (Exception ex) when (ex.Message.ToLower().Contains("file already exists"))
{
// Ignored, return existing path if exists
}
return new MfsFolder($"{Path}{name}", Client);
}
/// <inheritdoc/>
public virtual async Task<IChildFile> CreateFileAsync(string name, bool overwrite = false, CancellationToken cancellationToken = default)
{
await Client.Mfs.WriteAsync($"{Path}{name}", new MemoryStream(), new() { Create = true, Truncate = overwrite }, cancellationToken);
return new MfsFile($"{Path}{name}", Client);
}
/// <inheritdoc/>
public virtual Task<IFolderWatcher> GetFolderWatcherAsync(CancellationToken cancellationToken = default)
{
return Task.FromResult<IFolderWatcher>(new TimerBasedMfsWatcher(Client, this, UpdateCheckInterval));
}
}