all repos — underbbs @ a7682616885d9a1f64b6aee846a80d92e50319e0

decentralized social media client

ts/adapter.ts (raw)

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
import NDK, {NDKPrivateKeySigner} from "@nostr-dev-kit/ndk";
import * as nip19 from 'nostr-tools/nip19'
import { createRestAPIClient } from "masto";
import * as masto from "masto";

type MastodonClient = masto.mastodon.rest.Client;

export class Adapter {
  public nickname: string = "";
  public protocol: string = "";
  public identity: any | null;
  
  private _self: NDK | MastodonClient | null = null ;

  public init(): void {};
  public getInbox(): void {};
  public publish(): void {};
  public getFollowers(): any[] { return [] };
  public getFollowing(): any[] { return [] };
  public updateMetadata(): void {};
  public getMetadata(): any { return {} };
  
  private static ndk: NDK | null  = null;
  
  public static create(): Adapter {
    let adapter = new Adapter();

    adapter.init = ()=>{};
    adapter.getInbox = async ()=>{};
    adapter.getFollowers = ()=>[];
    adapter.getFollowing = ()=>[];
    adapter.publish = ()=>{};
    adapter.updateMetadata = ()=>{};
    adapter.getMetadata = ()=>{return {}};
  
    return adapter;
  }
  
  public static toNostr(adapter: Adapter, settings: any): Adapter {
    adapter.identity = { privkey: settings.privkey };
    adapter.nickname = settings.nickname;
    
    adapter.init = ()=> {
      if (!Adapter.ndk) {
        let privkey_raw = nip19.decode(settings.privkey);
        Adapter.ndk = new NDK({
          signer: new NDKPrivateKeySigner(<string>privkey_raw.data), 
          explicitRelayUrls: [ settings.relays ] 
        });
        adapter._self = Adapter.ndk;
        Adapter.ndk.connect();
      } else {
        Adapter.ndk.signer = new NDKPrivateKeySigner(settings.privatekey);
        for (let i of settings.relays) {
          Adapter.ndk.addExplicitRelay(i);
        }
      }
    };
  
    adapter.getInbox = async () => {
      if (Adapter.ndk) {
        const sub = Adapter.ndk.subscribe({ kinds: [1] }); // Get all kind:1s
        sub.on("event", (event) => console.log(event.content)); // Show the content
        sub.on("eose", () => console.log("All relays have reached the end of the event stream"));
        sub.on("close", () => console.log("Subscription closed"));
        setTimeout(() => sub.stop(), 10000); // Stop the subscription after 10 seconds
      }
    };
  
    return adapter;
  }
  
  public static toMasto(adapter: Adapter, settings: any): Adapter {
    adapter.identity = { server: settings.server, apiKey: settings.apiKey };
    adapter.nickname = settings.nickname;
  
    adapter.init = () => {
      adapter._self = createRestAPIClient({
        url: adapter.identity.server,
        accessToken: adapter.identity.apiKey
      });
    }
  
    adapter.getInbox = async () => {
      let i = 0;
      for await (const statuses of (adapter._self as MastodonClient).v1.timelines.public.list()) {
        for (const status of statuses) {
          console.log(status);
          i++;
        }
        if (i >= 10) break;
      }
    }
  
    return adapter;
  }
}



export default { Adapter }