code wiki / (root) / nx_live_crawl.nx

nx_live_crawl.nx source

↩ module page · 77 lines · 3638 B

1// nx_live_crawl.nx -- LIVE crawl of a real internet host via the sovereign 2// stack (our DNS resolver + our HTTP client + our HTML extractor + our index). 3// Target: info.cern.ch (the first website; serves plain HTTP on :80, so it 4// works with our no-TLS-yet client). Honest scope: HTTP-only until the crawler 5// gets the TLS layer the browser already has. 6import "fx.nx" 7import "nx_str.nx" 8import "nx_dns_resolve_a_record.nx" 9import "nx_http_client.nx" 10import "nx_html_to_text.nx" 11import "nx_bm25.nx" 12import "nx_search_inverted.nx" // NxInvIndex + nx_inv_* + nx_bm25_tf -- same missing import as 13 // nx_search_neutrality_gate; nx_bm25.nx never carried these. 14 15func nx_putc(c: i64) -> i64 { let b: *u8 = sys_mmap(1); b[0] = c; sys_write(1, b, 1); return 0 } 16func nx_puts(s: *u8) -> i64 { sys_write(1, s, nx_str_len(s)); return 0 } 17func nx_pi(n: i64) -> i64 { 18 if n == 0 { nx_putc(0x30); return 0 } 19 var v: i64 = n; let t: *u8 = sys_mmap(32); var k: i64 = 0 20 while v > 0 { t[k] = 0x30 + (v - (v/10)*10); v = v/10; k = k+1 } 21 while k > 0 { k = k-1; sys_write(1, (((t as i64)+k) as *u8), 1) } 22 return 0 23} 24func nx_body_off(resp: *u8, n: i64) -> i64 { 25 var i: i64 = 0 26 while i < n - 3 { if (resp[i] as i64)==0x0D { if (resp[i+1] as i64)==0x0A { if (resp[i+2] as i64)==0x0D { if (resp[i+3] as i64)==0x0A { return i+4 } } } } i = i + 1 } 27 return 0 28} 29func nx_report(text: *u8, tlen: i64, q: *u8) -> i64 { 30 let c: i64 = nx_bm25_tf(text, tlen, nx_inv_hash_bytes_lower(q, nx_str_len(q))) 31 nx_puts(" '"); nx_puts(q); nx_puts("' x"); nx_pi(c); nx_putc(0x0A) 32 return 0 33} 34 35func main() -> i64 { 36 let host: *u8 = "info.cern.ch" 37 let hlen: i64 = nx_str_len(host) 38 nx_puts("=== LIVE crawl via the sovereign stack -> "); nx_puts(host); nx_puts(" ===\n") 39 40 // 1. resolve via OUR DNS 41 let r: *DnsResolveResult = nx_dns_resolve_default(host, hlen, 1718452800) 42 if r.verdict != NX_DNS_R_OK { nx_puts("sovereign DNS resolve FAILED, verdict="); nx_pi(r.verdict); nx_putc(0x0A); return 1 } 43 let ipp: i64 = r.ipv4_packed 44 let a: i64 = (ipp >> 24) & 0xff 45 let b: i64 = (ipp >> 16) & 0xff 46 let c: i64 = (ipp >> 8) & 0xff 47 let d: i64 = ipp & 0xff 48 nx_puts(" sovereign DNS resolved -> "); nx_pi(a); nx_putc(0x2E); nx_pi(b); nx_putc(0x2E); nx_pi(c); nx_putc(0x2E); nx_pi(d); nx_putc(0x0A) 49 50 // 2. fetch over OUR HTTP client 51 let addr: *u8 = sys_mmap(16) 52 nx_http_client_sockaddr_ipv4(addr, a, b, c, d, 80) 53 let resp: *u8 = sys_mmap(131072) 54 let vb: *i64 = sys_mmap(8) as *i64 55 let n: i64 = nx_http_client_get(addr, "/", 1, host, hlen, resp, 131072, vb) 56 if n <= 0 { nx_puts(" HTTP fetch FAILED (verdict "); nx_pi(vb[0]); nx_puts(")\n"); return 2 } 57 nx_puts(" fetched "); nx_pi(n); nx_puts(" bytes over our HTTP client\n") 58 59 // 3. extract text via OUR HTML->text 60 let bo: i64 = nx_body_off(resp, n) 61 let text: *u8 = sys_mmap(131072) 62 let tlen: i64 = nx_html_to_text(((resp as i64) + bo) as *u8, n - bo, text, 131072) 63 nx_puts(" extracted "); nx_pi(tlen); nx_puts(" text chars\n") 64 65 // 4. index via OUR inverted index + query 66 let idx: *NxInvIndex = nx_inv_new(8) 67 nx_inv_index_row(idx, text, tlen, 0) 68 nx_inv_finalize_offsets(idx) 69 nx_inv_emit_row(idx, text, tlen, 0) 70 nx_puts(" indexed; term frequencies on the live page:\n") 71 nx_report(text, tlen, "hypertext") 72 nx_report(text, tlen, "web") 73 nx_report(text, tlen, "cern") 74 nx_report(text, tlen, "project") 75 nx_puts("=> LIVE: sovereign DNS + HTTP client crawled a REAL internet host, extracted + indexed, searchable.\n") 76 return 0 77}