AT Protocol module for Open Web Desktop
1import {
2 defineNuxtModule,
3 addPlugin,
4 createResolver,
5 addImportsDir,
6 installModule,
7} from '@nuxt/kit'
8import { getAtprotoDesktopOwner } from './runtime/utils/utilAtprotoDesktop'
9import { AtpAgent } from '@atproto/api'
10
11const { resolve } = createResolver(import.meta.url)
12
13export default defineNuxtModule({
14 meta: {
15 name: 'owd-module-atproto',
16 configKey: 'atprotoDesktop',
17 },
18 defaults: {
19 owner: {
20 did: 'did:plc:iaf5ejdchj6nydfxmcrq5rm6',
21 },
22 name: {
23 title: 'atproto',
24 affix: 'OS',
25 },
26 },
27 async setup(options: AtprotoDesktopOptions, _nuxt) {
28 await installModule('nuxt-atproto')
29
30 // configure aliases
31 _nuxt.options.build.transpile.push('@atproto/api')
32
33 // retrieve owd owner profile from atproto
34
35 if (!_nuxt.options.atproto) {
36 _nuxt.options.atproto = {
37 serviceEndpoint: {
38 private: 'https://bsky.social',
39 public: 'https://public.api.bsky.app'
40 },
41 oauth: {
42 clientMetadata: {
43 remote: '',
44 local: {
45 client_id: 'https://nuxt-atproto.pages.dev/client-metadata.json',
46 client_name: 'nuxt-atproto',
47 client_uri: 'https://nuxt-atproto.pages.dev',
48 logo_uri: 'https://nuxt-atproto.pages.dev/logo.png',
49 tos_uri: 'https://nuxt-atproto.pages.dev',
50 policy_uri: 'https://nuxt-atproto.pages.dev',
51 redirect_uris: ['https://nuxt-atproto.pages.dev'],
52 scope: "atproto transition:generic",
53 grant_types: ["authorization_code", "refresh_token"],
54 response_types: ["code"],
55 token_endpoint_auth_method: 'none',
56 application_type: 'web',
57 dpop_bound_access_tokens: true
58 }
59 },
60 signInOptions: {
61 state: '',
62 prompt: 'login',
63 scope: 'atproto',
64 ui_locales: 'en',
65 },
66 },
67 debug: true,
68 }
69 }
70
71 options.owner.profile = await getAtprotoDesktopOwner(
72 new AtpAgent({
73 service: _nuxt.options.atproto.serviceEndpoint.public,
74 }),
75 options.owner.did,
76 )
77
78 // set runtime config
79 _nuxt.options.runtimeConfig.public.atprotoDesktop = options
80
81 {
82 // import data
83 addImportsDir(resolve('./runtime/composables'))
84 addImportsDir(resolve('./runtime/stores'))
85 addPlugin({
86 src: resolve('./runtime/plugin'),
87 mode: 'client',
88 })
89 }
90 },
91})